如何为 Scikit-learn 分类器添加加权损失?

问题描述

在许多 ML 应用程序中,加权损失可能是可取的,因为某些类型的错误预测可能比其他错误更糟糕。例如。在医学二元分类(健康/疾病)中,假阴性,即患者没有接受进一步检查的结果比假阳性更糟糕,后续检查会发现错误

所以如果我定义一个这样的加权损失函数

def weighted_loss(prediction,target):
    if prediction == target:
        return 0  # correct,no loss
    elif prediction == 0:  # class 0 is healthy
        return 100  # false negative,very bad
    else:
        return 1  # false positive,incorrect

如何将与此等效的内容传递给 scikit-learn 分类器,例如 Random ForestsSVM 分类器?

解决方法

我担心你的问题是不恰当的,因为损失度量的不同概念之间存在根本性的混淆。

损失函数适用于prediction == target类型的条件 - 这就是指标(如准确度、精确度、召回率)等)do - 然而,这在损失优化(即训练)期间不起作用,仅用于性能评估。损失对于硬类预测不起作用;它仅适用于分类器的概率输出,在这种情况下,此类等式条件从不适用。

损失和指标之间的额外“隔离”层是阈值的选择,这是转换分类器的概率输出所必需的(仅在训练期间重要) 到“硬”类预测(仅对正在考虑的业务问题重要)。同样,这个阈值在模型训练过程中完全没有作用(唯一相关的数量是损失,它对阈值和硬类预测一无所知);很好地放入交叉验证线程 Reduce Classification Probability Threshold:

当您为新样本的每个类别输出概率时,练习的统计部分就结束了。选择一个阈值,超过该阈值,您将新观察结果分类为 1 与 0 不再是统计数据的一部分。它是决策组件的一部分。

尽管您当然可以尝试使用严格定义的模型训练(即损失最小化)之外的额外程序来优化此(决策)阈值,但正如您在评论中简要描述的那样,您的期望是

我很确定,如果 RBF 绘制的决策边界在拟合数据时考虑到这一点,我会得到更好的结果

使用类似于您的 weight_loss 函数的东西是徒劳的。

因此,没有与此处显示的 weight_loss 类似的函数(本质上是一个度量,而不是损失函数,尽管它的名称如此),它采用了诸如 prediction == target 之类的相等条件,可用于模型训练。

以下 SO 线程中的讨论也可能有助于澄清问题: