python - python/sklearn 中错误分类成本不平等

标签 python machine-learning scikit-learn

我想知道是否有办法在 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/

相关文章:

python - 将变量(带评估)导入到类命名空间(即 self.varName)

python - 如何创建文本文件中除具有重复字母的单词之外的所有单词的列表

python - 比较在 scikit-learn 中调整超参数的方法

python - scrapy项目中间件-TypeError : process_start_requests() takes 2 positional arguments but 3 were given

python - Django 表单集 - 空 kwargs

machine-learning - 深度强化学习训练准确率

machine-learning - 在 tensorflow 目标检测中预测单张图像

java - 生成的多项式回归值距坐标太远

python - 如何使用 scikit 学习具有新值的 inverse_transform

python - 了解 scikit CountVectorizer 中的 min_df 和 max_df