如何为XGBClassifier.fit()提供加权eval集?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为XGBClassifier.fit()提供加权eval集?相关的知识,希望对你有一定的参考价值。
从sklearn-style API of XGBClassifier,我们可以提供早期停止的评估示例。
eval_set(list,optional) - (X,y)对的列表,用作早期停止的验证集
但是,格式只提到了一对功能和标签。因此,如果文档准确无误,则无法为这些评估示例提供权重。
我错过了什么吗?
如果它在sklearn风格中无法实现,是否在原始(即非sklearn)XGBClassifier API中得到支持?一个简短的例子会很好,因为我从未使用过那个版本的API。
答案
编辑 - 评论中的每个对话更新
假设您有一个表示实值增益/损失值的目标变量,您希望将其归类为“增益”或“损失”,并且您希望确保分类器的验证集权重大 - 绝对值 - 最重要的收益/损失,这里有两种可能的方法:
- 创建一个自定义分类器,它只是XGBoostRegressor,它被馈送到一个阈值,其中实值回归预测被转换为1/0或“增益”/“丢失”分类。此分类器的.fit()方法只调用xgbregressor的.fit(),而此分类器的.predict()方法将调用回归量的.predict(),然后返回阈值类别预测。
- 你提到过你想尝试加权验证集中记录的处理,但xgboost中没有这个选项。实现这一点的方法是实现自定义
eval-metric
。但是,您指出eval_metric
必须能够一次返回单个标签/ pred记录的分数,因此它无法接受所有行值并在eval指标中执行加权。您在评论中提到的解决方案是“创建一个可调用的,其中包含所有验证示例的参考,将索引(而不是标签和分数)传递到eval_set,使用索引从可调用内部获取标签和分数并返回每个验证示例的度量标准。“这也应该有效。
我倾向于选择选项1更直接,但尝试两种不同的方法并比较结果通常是一个好主意,如果你有时间,所以有兴趣这些如何为你。
另一答案
从几个星期前开始,fit
方法有一个新的参数,sample_weight_eval_set
,它允许你做到这一点。它需要一个权重变量列表,即每个评估集一个。我不认为这个功能已经使它成为一个稳定版本,但是如果你从源代码编译xgboost它现在可用。
以上是关于如何为XGBClassifier.fit()提供加权eval集?的主要内容,如果未能解决你的问题,请参考以下文章