是否有可能使用成本矩阵训练sklearn中的分类器,并为不同的错误提供不同的成本?例如,在2类问题中,成本矩阵将是2乘2平方矩阵。例如,A_ij =将i分类为j的成本。
我使用的主要分类器是随机森林。
感谢。
答案 0 :(得分:4)
在我们拥有的任何分类器中,scikit-learn都不支持您描述的对成本敏感的框架。
答案 1 :(得分:3)
规避此限制的一种方法是使用欠采样或过采样。例如,如果您使用不平衡的数据集进行二进制分类,并且想要使少数类错误更加昂贵,您可以对其进行过采样。您可能需要查看imbalanced-learn这是来自scikit-learn-contrib的软件包。
答案 2 :(得分:2)
您可以随时查看您的ROC曲线。 ROC曲线上的每个点对应于单独的混淆矩阵。因此,通过指定所需的混淆矩阵,通过选择分类器阈值意味着某种成本加权方案。然后你只需选择意味着你正在寻找的成本矩阵的混淆矩阵。
另一方面,如果你真的有自己的心,并且真的想要#34;训练"使用成本矩阵的算法,你可以"排序"在sklearn做。
虽然在sklearn中直接训练算法对成本敏感是不可能的,但您可以使用成本矩阵类型的设置来调整超参数。我使用遗传算法做了类似的事情。它确实做得不是很好,但它应该能够适度提升绩效。
答案 3 :(得分:2)
可能不直接针对您的问题(因为您询问的是随机森林)。 但是对于SVM(在Sklearn中),您可以使用 class_weight 参数来指定不同类的权重。基本上,你会传入一本字典。
您可能需要参考此page以查看使用 class_weight 的示例。
答案 4 :(得分:1)
您可以使用自定义scoring function,它接受按类别或按实例的成本矩阵。这是一个计分员的示例,它可以计算每个实例的误分类成本:
def financial_loss_scorer(y, y_pred, **kwargs):
import pandas as pd
totals = kwargs['totals']
# Create an indicator - 0 if correct, 1 otherwise
errors = pd.DataFrame((~(y == y_pred)).astype(int).rename('Result'))
# Use the product totals dataset to create results
results = errors.merge(totals, left_index=True, right_index=True, how='inner')
# Calculate per-prediction loss
loss = results.Result * results.SumNetAmount
return loss.sum()
得分手变为:
make_scorer(financial_loss_scorer, totals=totals_data, greater_is_better=False)
totals_data
是pandas.DataFrame,其索引与训练集索引匹配。