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

时间:2016-06-03 14:00:41

标签: python machine-learning scikit-learn

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

  • 如果观察具有等级1且模型预测等级1,则惩罚为0(正确分类)
  • 如果观察具有等级1且模型预测等级2,则惩罚为1
  • 如果point有1级,model预测3级,则惩罚为2
  • 如果point具有class 2且model预测class 2,则惩罚为0(正确分类)
  • 如果point有class 2且model预测class 3,则惩罚为1
  • 如果point有class 2且model预测class 1,则惩罚为1
  • 如果point具有class 3且model预测class 3,则惩罚为0(正确分类)
  • 如果point有3级且model预测class 2,则惩罚为1
  • 如果point有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

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

是否可以在sklearn中执行此类操作?可能是其他一些库/学习算法允​​许不等的错误分类成本?

1 个答案:

答案 0 :(得分:1)

首先,在sklearn中,没有办法使用自定义损失训练模型。但是,您可以implement your own evaluation function调整模型的超参数以优化此指标。

其次,您可以使用神经网络优化任何自定义丢失for example, using Keras。但为此目的,你的功能应该是顺利的。首先想到的是加权交叉熵。在this discussion中,人们正在使用此功能的实现。

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

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