python/sklearn中的错误分类成本不一致

kro*_*ike 8 python machine-learning scikit-learn

我想知道是否有办法在sklearn/python中指定自定义成本函数?我的真正问题有7个不同的类,但为了使它更清楚,我们假设我想为3个不同类的问题指定错误分类的不同成本,我主要感兴趣的是我的模型将正确区分1类和3类.

  • 如果观察有1级,模型预测1级,则罚分为0(正确分类)
  • 如果观察有1级,模型预测2级,则罚分为1
  • 如果point有1级,model预测3级,则惩罚为2

  • 如果point有2级且model预测class 2,则惩罚为0(正确分类)
  • 如果point具有class 2且model预测class 3,则惩罚为1
  • 如果point有class 2且model预测class 1,则惩罚为1

  • 如果point有3级且model预测3级,则惩罚为0(正确分类)
  • 如果point具有class 3且model预测class 2,则惩罚为1
  • 如果point有class 3而model预测class 1,则惩罚为2

所以惩罚矩阵看起来如下:

        Class 1  Class 2  Class 3
Class 1   0        1        2
Class 2   1        0        1
Class 3   2        1        0
Run Code Online (Sandbox Code Playgroud)

我假设sklearn中的'class_weight'参数执行类似但接受字典而不是矩阵.传递class_weight = {1:2,1:1,1:2}只会增加错误分类1级和3级的权重,但是,我希望我的模型在选择1级时真正获得更大的惩罚,真正的类是3级,反之亦然.

是否有可能在sklearn中做这样的事情?可能是其他一些库/学习算法允​​许不等的错误分类成本?

Dav*_*ale 2

首先,在 sklearn 中无法使用自定义损失来训练模型。但是,您可以实现自己的评估函数并调整模型的超参数来优化该指标。

其次,您可以使用神经网络优化任何自定义损失,例如使用 Keras。但为了这个目的,你的函数应该是平滑的。首先想到的是加权交叉熵。在这次讨论中,人们正在研究这个函数的实现。

第三,您自己的问题的结构表明类标签的顺序才是真正重要的。如果是这种情况,您可以尝试有序逻辑回归(其实现示例)。

此外,在你的问题中,成本恰好是sum(abs(predicted-fact))。因此,如果您不需要概率预测,您可以简单地使用优化 MAE 的回归器(例如具有“epsilon_insensitive”损失的 SGDRegressor 或具有 mae 标准的 DecisionTreeRegressor)。求解回归后,您只需找到优化成本函数的阈值。