如何为XGBClassifier.fit()提供加权eval集?

时间:2017-04-25 03:48:35

标签: scikit-learn xgboost

sklearn-style API of XGBClassifier,我们可以提供早期停止的评估示例。

  

eval_set (列表,可选) - 用作“X,y”对的列表   早期停止的验证集

但是,格式只提到了一对功能和标签。因此,如果文档准确无误,则无法为这些评估示例提供权重。

我错过了什么吗?

如果在sklearn风格中无法实现,是否支持原始(即非sklearn)XGBClassifier API?一个简短的例子会很好,因为我从未使用过那个版本的API。

2 个答案:

答案 0 :(得分:1)

编辑 - 评论中的每次对话更新

鉴于您有一个目标变量代表实值增益/损失值,您希望将其归类为"增益"或者"损失",并且您希望确保分类器的验证集权衡最大的绝对值增益/损失,这里有两种可能的方法:

  1. 创建一个自定义分类器,它只是XGBoostRegressor提供给一个阈值,其中实值回归预测转换为1/0或"增益" /"损失"分类。此分类器的.fit()方法只调用xgbregressor的.fit(),而此分类器的.predict()方法将调用回归量的.predict(),然后返回阈值类别预测。

    < / LI>
  2. 你提到你想尝试加权验证集中记录的处理,但xgboost中没有这个选项。实现此方法的方法是实现自定义eval-metric。但是,您指出eval_metric必须能够一次返回单个标签/预测记录的分数,因此它不能接受所有行值并在eval指标中执行加权。您在评论中提到的解决方案是&#34;创建一个可调用的,它具有对所有验证示例的引用,将索引(而不是标签和分数)传递到eval_set,使用索引从内部获取标签和分数每个验证示例的可调用和返回指标。&#34;这也应该有效。

  3. 我倾向于选择选项1更直接,但尝试两种不同的方法并比较结果通常是一个好主意,如果你有时间,所以对这些结果感兴趣。

答案 1 :(得分:0)

截至几周前,fit方法有一个新参数sample_weight_eval_set,您可以执行此操作。它采用权重变量的列表,即每个评估集一个。我认为此功能尚未使其成为稳定版本,但是如果您从源代码编译xgboost,则现在可以使用。

https://github.com/dmlc/xgboost/blob/b018ef104f0c24efaedfbc896986ad3ed1b66774/python-package/xgboost/sklearn.py#L235