在处理 VotingClassifier 或网格搜索时,Sklearn 中的 GradientBoostingClassifier 是不是有类权重(或替代方式)?

Posted

技术标签:

【中文标题】在处理 VotingClassifier 或网格搜索时,Sklearn 中的 GradientBoostingClassifier 是不是有类权重(或替代方式)?【英文标题】: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 时我不能使用它。有人可以帮忙吗?

【问题讨论】:

【参考方案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 确实相互影响,但前者用于选择观察值,而后者完全改变了损失函数。

以上是关于在处理 VotingClassifier 或网格搜索时,Sklearn 中的 GradientBoostingClassifier 是不是有类权重(或替代方式)?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn集成学习之VotingClassifier

带有 VotingClassifier 的类型错误

硬投票分类器(VotingClassifier)构建实战

scikit-learn 的 VotingClassifier 中使用的分类器是啥?

为啥我的 VotingClassifier 准确度低于我的个人分类器?

您将如何使用 Sklearn 的 VotingClassifier 进行 RandomizedSearchCV?