我如何使我的二元分类器偏爱假阳性错误而不是假阴性?

机器算法验证 分类 二进制数据 喀拉斯
2022-01-30 16:02:46

我已经使用 Keras 的 Sequential 模型组合了一个二元分类器。在其错误中,它以假阴性比假阳性更频繁地进行预测。

该工具适用于医疗应用,我宁愿误报,以免在谨慎方面犯错。

我如何尝试调整模型以更喜欢一类而不是另一类?

3个回答

请记住,您的神经网络输出的是概率,而不是分类。您可以使用概率进行分类。软件默认使用阈值来确定分类,但这可能不适合您。0.5

虽然有两种结果,但在您的医疗申请的决策过程中可能还有第三种选择:“不确定,收集更多信息。” 也许你会想要低于是类别,高于是类别,而介于之间是不确定的。0.300.710.30.7

这种神经网络输出概率而不是类别的想法与所谓的正确评分规则和(更好)严格正确的评分规则有关。在这里,Frank Harrell 和 Stephan Kolassa 都是粉丝,前者在他的博客上写过关于他们的文章。

https://www.fharrell.com/post/class-damage/

https://www.fharrell.com/post/classification/

同样有趣的是:做出决定时的正确评分规则(例如垃圾邮件与非正常电子邮件)

解决此问题的标准方法如下:

  1. 正如 Dave 的回答中提到的,不要采用 Keras 分类器的二进制预测,而是使用分数或 logits - 即您需要对正类有一个置信度值,而不是对正类进行硬预测“1”类和负类为“0”。(大多数 Keras 模型都有一种model.predict()方法可以让您对每个类都有信心)。

  2. 现在绘制一条 ROC 曲线,sklearn 有一些现成的漂亮功能:https ://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html 。该曲线基本上绘制了真阳性率与假阳性率的关系,这是通过在预测置信度上设置各种阈值并计算真阳性率(TPR)和假阳性率(FPR)而获得的。

  3. 查看 ROC 曲线,您可以选择您喜欢的点(即假阴性极少且假阳性数可接受)。给出这个(TPR,FPR)点的阈值应该是您的分类器的操作点(即将此阈值应用于“类 1”的模型置信度)。

这里有几个选项可以让网络偏向你想要的类:

1-修改班级权重。例如,为了让您的算法将 0 类的每个实例视为 1 类的 5 个实例,您可以执行以下操作:

class_weight = {0: 5., 1: 1.}
model.fit(X, y, class_weight=class_weight)

2-如 Dave 和 AruniRC 所指出的,根据ROC 曲线修改分类阈值。

3-从您想要优先考虑的类中对训练样本进行过采样,例如:

X_neg = X[y == 0]
X_pos = X[y == 1]

ids = np.arange(len(X_neg))
choices = np.random.choice(ids, len(X_pos) * 5)

X_neg = X_neg[choices]
X_pos = X_pos
y_neg = np.zeros(len(X_neg), dtype=np.int8)
y_pos = np.ones(len(X_pos), dtype=np.int8)

X = np.vstack([X_neg, X_pos])
y = np.stack([y_neg, y_pos])

您所说的问题通常是不平衡数据集的常见问题,与另一个类相比,您可能在一个类中有更多的样本(这通常发生在医学数据集中)。这些要点中的大部分取自用于处理不平衡数据集的Keras 教程。