我想知道是否有办法在 sklearn/python 中指定自定义成本函数? 我的实际问题有 7 个不同的类别,但为了更清楚地说明,让我们假设我想为具有 3 个不同类别的问题指定不同的误分类成本,并且我主要感兴趣的是我的模型能够正确区分类别 1 和类别 3。
- 如果观察结果为 1 类且模型预测为 1 类,则惩罚为 0(正确分类)
- 如果观察结果为 1 类且模型预测为 2 类,则罚分为 1
- 如果点属于类别 1 并且模型预测类别为 3,则罚分为 2
- 如果点属于类别 2 并且模型预测类别为 2,则惩罚为 0(正确分类)
- 如果点属于类别 2 并且模型预测类别为 3,则罚分为 1
- 如果点属于类别 2 并且模型预测类别为 1,则罚分为 1
- 如果点属于类别 3 并且模型预测类别为 3,则惩罚为 0(正确分类)
- 如果点具有类别 3 并且模型预测类别 2,则罚分为 1
- 如果点具有类别 3 并且模型预测类别 1,则惩罚为 2
因此惩罚矩阵如下所示:
Class 1 Class 2 Class 3
Class 1 0 1 2
Class 2 1 0 1
Class 3 2 1 0
我假设 sklearn 中的“class_weight”参数执行类似的操作,但接受字典而不是矩阵。传递 class_weight = {1:2,1:1,1:2} 只会增加错误分类 1 类和 3 类的权重,但是,我希望我的模型在选择 1 类且真正的类是时得到更大的惩罚3 类,反之亦然。
在sklearn中可以做这样的事情吗?可能其他一些库/学习算法允许不平等的错误分类成本?
最佳答案
首先,在 sklearn 中,无法使用自定义损失来训练模型。但是,您可以implement your own evaluation function并调整模型的超参数来优化该指标。
其次,您可以使用神经网络优化任何自定义损失,for example, using Keras 。但为了这个目的,你的函数应该是平滑的。首先想到的是加权交叉熵。在 this discussion ,人们正在研究这个函数的实现。
第三,您自己的问题的结构表明类标签的顺序才是真正重要的。如果是这种情况,您可以尝试有序逻辑回归(其实现的example)。
此外,在您的问题中,成本恰好是 sum(abs(predicted-fact))
。因此,如果您不需要概率预测,您可以简单地使用优化 MAE 的回归器(例如具有“epsilon_insensitive”损失的 SGDRegressor 或具有 mae 标准的 DecisionTreeRegressor)。解决回归问题后,您只需找到优化成本函数的阈值即可。
关于python - python/sklearn 中错误分类成本不平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616410/