【问题标题】:Random Forest classifier class_weight随机森林分类器 class_weight
【发布时间】:2018-05-20 12:55:53
【问题描述】:

我有一个不平衡的数据集,其中 200000 个描述属于 0 类,而 10000 个描述属于 1 类。但是,在我的训练数据集中,我有相同数量的“正”和“负”样本,每个大约 8000 个。所以现在我对如何正确使用分类器的“class_weight”选项感到困惑。似乎只有在训练数据中“正”和“负”样本的数量与整个数据集中相同的情况下才有效。在这种情况下,它将是 8000 个“正”和 160000 个“负”,这实际上是不可行的。减少“阳性”样本的数量似乎也不是一个好主意。还是我错了?

【问题讨论】:

  • 您没有对训练集进行分层有什么特别的原因吗?拥有代表数据的训练集通常很有用。
  • 这个问题似乎以当前形式的 IMO 与算法而不是编程问题更相关。请将此张贴在stats.stackexchange.com
  • @ncfirth 抱歉,您能详细说明一下吗?你的意思是“正”类的数量与我期望在整个数据集中的数量成比例?我有这 16000 个描述,这些描述是我从整个数据集中用不同的关键字提取的,基本上是手动检查的。现在我正在尝试通过机器学习从整个数据集中提取更多描述。我只是假设它是稀疏的。如果您有任何想法或论文建议,我将非常感激!
  • @VivekKumar 可能你是对的,或者这更像是一个概念问题。
  • 看看here

标签: machine-learning scikit-learn random-forest


【解决方案1】:

严格来说,从您的 training 集合的角度来看,您不会遇到类不平衡问题,因此您可以将 class_weight 保留为默认的 None 值。

这里和一般不平衡数据集(您没有提供任何信息)的真正问题是两个类的错误分类的成本是否相同。这是一个“业务”决策(即不是统计/算法决策)。

通常,不平衡的数据集与具有不同错误分类成本的问题密切相关;医学诊断是这里的教科书示例,因为:

  1. 默认情况下,数据集几乎是不平衡的,因为健康人的数量远远超过感染者
  2. 我们宁愿误报(错误地将某人归类为患有疾病,而他/她没有)而不是漏检(将感染者错误归类为健康人,从而冒着生命危险)

因此,这是您应该考虑的实际问题(即甚至在构建训练集之前)。

如果对于您要解决的业务问题,将“0”误分类为“1”和将“1”误分类为“0”没有任何区别,并且鉴于你的训练集是平衡的,你可以继续而不用担心分配不同的类权重......

【讨论】:

  • 谢谢,这很有趣。但似乎成本框架没有在随机森林的 scikit-learn 实现中实现。或者我可以以某种方式使用 sample_weights 吗?
  • @student 这是一个非常笼统的讨论,涉及一个巨大的话题,在这里无法解决;我建议开始无情地搜索类别不平衡、数据不平衡、类别权重、错误分类成本等...
  • @student 非常欢迎您(您甚至可以接受答案...)
【解决方案2】:

class_weightoption 无非是增加了对代表性不足的班级犯错的权重。换句话说,对稀有类的错误分类会受到更严厉的惩罚。

分类器可能会在您的测试集上表现更好(两个类的表示相同,因此两者同样重要),但您可以轻松地验证这一点。

副作用是predict_proba 返回的概率与实际概率相差甚远。 (如果您想了解原因,请绘制简单的平均机会和预测分数在没有和不同class_weight= 的情况下的分布。预测分数如何变化?)。根据您的最终用例(分类、排名、概率估计),您应该考虑模型中的选择。

【讨论】:

  • OP 已澄清这两个类在他/她的 训练 集中具有同等的代表性 - 这是不平衡的测试集
猜你喜欢
  • 2018-04-10
  • 2020-02-05
  • 2018-02-18
  • 2015-08-28
  • 2018-03-05
  • 1970-01-01
  • 2019-09-05
  • 2013-09-22
  • 2017-09-10
相关资源
最近更新 更多