[英]How to set separate threshold for each classs(multiclass) in model.predict array in keras....any help will be appreciated
大家好,我正在使用 convLstm(顺序模型)在 Keras 中构建 model 我在最后一层使用 softmax 对 9 个标签进行分类,但我的 Z20F35E630DAF44DBFA4C3F630DAF44DBFA4C3F68F5399D8CZ 在给出良好的精度后仅预测 3CZF68F5399D。 所以我想为每个 class label 手动设置阈值。 我怎样才能做到这一点? 卡了一天多,请问如何解决,谢谢。
我已经研究了很多,但我无法解决它
当您运行model.predict(X)
时,您会得到一个形状数组(n_samples, n_classes)
。
您可以将这些n_classes
列中的每一个解释为二进制分类器的 output,它只回答“此示例是否属于 class i?”的问题。 因此,您可以为每个argmax
而不是常规的 argmax 设置不同的阈值。
因此,假设 class i
被编码为输出的第 i 列,您可以这样做:
i=3 # solve for this i=3, later you can generalize
y_pred = model predict(X_val)
th = .5
y_pred_i = np.zeros_like(y_pred[:, i])
y_pred_i[y_pred[:, i] > th] = 1 # set to 1 those above the threshold
print(f1_score(y_val==i, y_pred_i))
现在您需要做的就是使用 for 尝试不同的阈值th
值,并根据您的指标选择最佳值(对于这种情况,我使用 F1,但您可以选择更适合您的问题的值)。
您还需要对所有 n_classes 重复此过程,仅此而已:您最终会为每个 class 获得不同的阈值。 本文更深入地介绍了二进制情况,在这里您需要为每个 class 复制一次。
一些最后的笔记:
将单个多类问题转换为多二元问题时,这些二元问题中的每一个都是不平衡的,因此请注意您选择最大化的度量。
永远不要根据您在测试集中获得的分数来选择 bast 阈值:您需要使用另一个验证集来执行阈值选择,或者 coroas 验证它们,但不要对您的测试集执行此操作,否则您重新过拟合测试。 另一方面,如果你选择它们来验证你的训练集,你可能会高估它们(训练分数往往是极值:接近 0 或接近 1,而非训练通常更分散)。
进行重新构图时会出现新问题:
no answer
,因为根据您的阈值,没有一个预测足够好,或者返回使您的分数最大化的那个,因为这是您的选择中最值得信赖的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.