我想知道是否有办法在sklearn / python中指定自定义成本函数? 我真正的问题有7个不同的类,但为了使它更清楚,我们假设我想为3个不同类的问题指定错误分类的不同成本,我主要感兴趣的是我的模型将正确区分1类和3类。
所以惩罚矩阵看起来如下:
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中执行此类操作?可能是其他一些库/学习算法允许不等的错误分类成本?
答案 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)。解决回归后,您只需要找到优化成本函数的阈值。