sample_weight 和 class_weight RandomForest 分类器之间的区别

机器算法验证 Python 随机森林 scikit-学习
2022-03-15 08:49:54

我有一个非常不平衡的大数据集 ( 500000 instances, 60 features),它很容易发生变化(大小和特征数量的增加)。但是将保持不变的是班级的不平衡,这class 0将永远是主导的。平均而言,90%其中的数据将在 中class 0,其余的将10%在 中class 1

我对使用类标签 1 尽可能准确地分类实例感兴趣,因此我想增加其误分类成本。

我选择的分类器是RandomForest为了解决类不平衡问题,我正在尝试调整权重,然后使用评估StratifiedKFold并绘制相应roc_curve的 k 折。

这是我的分类器的代码:

 clf1 = RandomForestClassifier(n_estimators=25, min_samples_leaf=10, min_samples_split=10,
      class_weight = "balanced", random_state=1, oob_score=True)

 sample_weights = array([9 if i == 1 else 1 for i in y])

我浏览了文档,有些东西我不明白。我测试了所有这些方法,但评估指标的差异很小,所以我很难确定哪些设置优化了我的分类器。

不用说,即使我使用加权我的模型的预测能力非常低,敏感度是平均的0.2

这些是我的问题:

  • 应该sample_weightclass_weight同时使用吗?
  • between class_weights = "balanced"and class_weights = balanced_subsampleswhich 应该可以提供更好的分类器性能
  • 是否sample_weight应该始终根据样本中的不平衡比例进行调整?
  • class_weights = balanced_subsamples同时sample_weight使用时会报执行错误。为什么?

另外,如果有更好的方法来评估分类器,请告诉我。

2个回答

您使用的 sample_weights 错误。您要使用的是class_weights。样本权重用于增加单个数据点的重要性(假设您的一些数据更值得信赖,那么它们会获得更高的权重)。因此:样本权重的存在是为了改变数据点的重要性,而类权重会改变权重以纠正类不平衡。考虑到它们的目的,它们可以一起使用。在您的示例中,使用班级权重没有任何效果,因为您滥用样本权重来完成班级权重的工作。

问答

  1. 是否应该同时使用 sample_weight 和 class_weight

如果您的目标是因为课程不平衡而对课程进行加权,您可以使用其中任何一个。使用class_weight="balancedsample_weight=[n_samples].

我在 kaggle 中使用不平衡的集合对其进行了测试。我根据sklearn 文档中给出的内容估计了“sample_weight” :n_samples / (n_classes * np.bincount(y))

注意:“关于给予什么权重的指南是使它们与班级人口成反比”——伯克利的人


  1. 在 class_weights = "balanced" 和 class_weights = balance_subsamples 之间,这应该可以提供更好的分类器性能

您可以轻松地为您的数据集测试它。我很难说。对我来说,召回率更高(9%),准确率降低了 9%(在少数)数据集上。


  1. sample_weight 是否应该始终根据样本中的不平衡比率进行调整?

取决于你关心什么。如果您希望1-recall所有类别的预测误差 ( ) 相同,那么您可以查看不同的召回率,更改您的权重,直到它们平衡。注意:这将减少您的整体预测误差。

这是伯克利大学的“一些人”提出的。1-recall然而,尽管我的少数族裔体重增加了很多(从 26 到 1000),但我无法平衡我的体重。

这是我正在进行的一项 kaggle 比赛的比较表:

tr 召回 视频召回 tr 精确度 vd prec
基线 37.4 26.9 94.8 79.6
平衡 (1,26) 67.6 (80%) 30.2 (12%) 88.7 (-6.5%) 75.3 (-5.5%)
子样本平衡 67.5 (80%) 32.9 (22%) 88.0 (-7.2%) 70.9 (-11.7%)
超重 (1,1000) 65.3 (80%) 25.1 (-7%) 84.5 (-10.9%) 84.0 (5%)

  1. class_weights = balance_subsamples 和 sample_weight 同时使用时会出现执行错误。为什么?

没有把握。