在sklearn中使用RandomForestClassifier进行不平衡分类
classification
machine-learning
python
random-forest
6
0

我有一个数据集,其中的类是不平衡的。类别为“ 1”或“ 0”,其中类别“ 1”:“ 0”的比率为5:1。如何在带有随机森林的sklearn中计算每个类别的预测误差以及相应的重新平衡权重,类似于以下链接: http : //www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#平衡

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

如果多数类为1,少数类为0,并且它们的比率为5:1,则sample_weight数组应为:

sample_weight = np.array([5 if i == 1 else 1 for i in y])

请注意,不要反转比率,这也适用于class_weights 。较大的数字与多数派相关。

收藏
评论

sklearn的“ fit”方法不允许指定要优化的性能指标,这实在令人遗憾。当解决分类任务时,当人们对数据样本调用fit方法时,周围的人似乎都不了解或质疑或感兴趣。

我们(scikit学习包的用户)默默地被建议间接使用交叉验证的网格搜索和适用于不平衡数据集的特定评分方法,希望偶然发现产生适当AUC或F1分数的参数/元参数集。

但是请考虑一下:每次每次都在引擎盖下调用“ fit”方法总是可以优化精度。因此,最终,如果我们希望最大程度地提高F1分数,则GridSearchCV会为我们提供“所有模式中具有最佳精度的F1最佳模型”。那不是很傻吗?直接优化模型参数以获得最大F1分数会更好吗?记住旧的Matlab ANNs软件包,您可以在其中将期望的性能指标设置为RMSE,MAE,以及在定义了梯度计算算法的情况下您想要的任何内容。为什么从sklearn中默默地忽略了性能指标的选择?

至少,为什么没有简单的选项可以自动分配类实例的权重来解决不平衡的数据集问题?为什么我们必须手动计算体重?此外,在许多机器学习书籍/文章中,我看到作者称赞sklearn的手册是很棒的信息,即使不是有关主题的最佳信息来源。不完全是?为何文档中甚至没有涵盖不平衡的数据集问题(这对数据科学家来说显然非常重要)?我应该向sklearn的撰稿人讲这些问题,如果他们读了这个。或知道这样做的原因的任何人都欢迎评论和清除问题。

更新

从scikit-learn 0.17开始,有class_weight ='balanced'选项,您可以至少将其传递给某些分类器:

“平衡”模式使用y的值自动将权重与输入数据中的类频率成反比地调整为n_samples /(n_classes * np.bincount(y))。

收藏
评论

使用参数class_weight='balanced'

来自sklearn文档: 平衡模式使用y的值自动将权重与输入数据中的类频率成反比地调整为n_samples / (n_classes * np.bincount(y))

收藏
评论

您可以将样本权重参数传递给随机森林拟合方法

sample_weight : array-like, shape = [n_samples] or None

样品重量。如果为None,则对样本进行平均加权。在每个节点中搜索拆分时,将忽略创建净净值为零或负权重的子节点的拆分。在分类的情况下,如果拆分会导致任何单个类在任一子节点中都具有负权重,则也将忽略拆分。

在较旧的版本中,存在preprocessing.balance_weights方法来为给定样本生成平衡权重,以使类变得均匀分布。它仍然存在,在内部但仍可用的preprocessing._weights模块中,但已不建议使用,并将在以后的版本中删除。不知道确切的原因。

更新资料

您似乎有些困惑,需要澄清一下。一旦记住它的目的是平衡训练数据集中的目标类别, sample_weight用法sample_weight简单。也就是说,如果将X作为观察值,并将y作为类(标签),则len(X) == len(y) == len(sample_wight)sample witght 1-d数组的每个元素代表对应的权重(observation, label)对。对于您的情况,如果将1类表示为0类,则表示5次,并且平衡了类分配,则可以使用简单

sample_weight = np.array([5 if i == 0 else 1 for i in y])

分配重量的5至所有0实例和重量的1至所有1实例。请参见上面的链接,以获取更多balance_weights权重评估功能。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号