繁体   English   中英

如何为 model.predict 数组中的每个类(多类)设置单独的阈值 keras ......任何帮助将不胜感激

[英]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 ,因为根据您的阈值,没有一个预测足够好,或者返回使您的分数最大化的那个,因为这是您的选择中最值得信赖的。
    • 如果不止一个 class 高于阈值怎么办? 如果您的应用程序没问题,您可能可以预测多个 class,或者考虑得分较高或得分超过阈值的那个。
    • 还要考虑在选择阈值之前校准每个预测的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM