【问题标题】:Is there class weight (or alternative way) for GradientBoostingClassifier in Sklearn when dealing with VotingClassifier or Grid search?在处理 VotingClassifier 或网格搜索时,Sklearn 中的 GradientBoostingClassifier 是否有类权重(或替代方式)?
【发布时间】:2016-06-03 01:41:27
【问题描述】:

我正在为我的不平衡标记数据集使用 GradientBoostingClassifier。在 Sklearn 中,似乎类权重不作为该分类器的参数存在。我知道我可以在合适的时候使用 sample_weight,但是在处理 VotingClassifier 或 GridSearch 时我不能使用它。有人可以帮忙吗?

【问题讨论】:

    标签: scikit-learn classification


    【解决方案1】:

    目前没有办法在 sklearn 中为 GB 使用 class_weights。

    不要将其与 sample_weight 混淆

    样本权重会改变损失函数和您尝试优化的分数。这通常用于抽样方法存在差距的调查数据。

    类权重用于纠正类不平衡,作为过度/欠采样的代理。对于 sklearn 中的 GB,没有直接的方法可以做到这一点(你可以在随机森林中做到这一点)

    【讨论】:

      【解决方案2】:

      很晚了,但我希望它对其他成员有用。

      Zichen Wang in towardsdatascience.com的文章中,第5点Gradient Boosting被告知:

      例如,梯度提升机 (GBM) 通过基于错误分类的示例构建连续的训练集来处理类别不平衡问题。它通常在不平衡数据集上优于随机森林。例如,梯度提升机 (GBM) 通过基于错误分类的示例构建连续的训练集来处理类不平衡。它通常在不平衡数据集上优于随机森林。

      还有一张图表显示,grandient boosting 模型的一半的 AUROC 超过 80%。所以考虑到GB模型的性能和它们的完成方式,似乎没有必要像sklearn包中的RandomForestClassifier那样引入一种class_weight参数。

      在 Andreas C. Müller 和 Sarah Guido 所著的《Pyhton 机器学习简介》一书中,2017 年版,第 89 页,第 2 章 *监督学习,决策树集成部分,小节梯度提升回归树(梯度提升机器)

      他们通常对 参数设置比随机森林好,但如果参数设置正确可以提供更好的精度。

      现在,如果由于目标变量中的类别比例不平衡而仍然存在评分问题,您可能应该查看是否应该拆分数据以在其上应用不同的模型,因为它们并不像看起来那样同质化是。我的意思是它可能有一个你在数据集训练中没有的变量(一个明显的隐藏变量),它对模型结果有很大影响,那么即使是更大的 GB 也很难给出正确的评分,因为它错过了你无法做到的大量信息make 有时出于多种原因出现在矩阵中进行计算。

      一些更新:

      我随机发现有一些库将其作为梯度提升实例对象的参数来实现。这是H2O 的情况,其中参数balance_classes 被告知:

      通过过采样/欠采样平衡训练数据类计数(对于 数据不平衡)。

      类型:bool(默认值:False)。

      如果你想继续使用sklearn,你应该按照 HakunaMaData 所说的那样做:过采样/欠采样,因为当参数存在时,其他库最终会这样做。

      【讨论】:

      • lightgbm 也有LGBMClassifier(is_unbalance=False)
      【解决方案3】:

      是的,fit 方法中有sample_weight

      http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier.fit

      sample_weight:类似数组,shape = [n_samples] 或 None

      样本权重。如果没有,则样本的权重相同。在每个节点中搜索拆分时,会忽略将创建具有净零或负权重的子节点的拆分。在分类的情况下,如果拆分会导致任何单个类在任一子节点中具有负权重,则也会忽略拆分。

      只需根据类别传递每个样本的权重

      【讨论】:

      • 感谢 lejlot,但是您可以将它与 VotingClassifier 或网格搜索一起使用吗?
      • 你可能必须代理它(创建一个包装器)才能直接完成
      • 实际上它确实适用于网格搜索,只需将其传递为“fit_params : dict, optional; 传递给 fit 方法的参数。”
      • 再次感谢 lejlot :) 你能给我一个代码示例吗?我不太明白“fit_params : dict, optional; 传递给 fit 方法的参数”。部分..非常感谢!
      • Sample_weights 与 class_weights 不同。 Sample_Weights 和 class_weights 确实相互影响,但前者用于选择观察值,而后者完全改变了损失函数。
      猜你喜欢
      • 2014-09-02
      • 2021-02-27
      • 2019-01-03
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多