如何提供加权评估集 XGBClassifier.fit()?

How to provide weighted eval set to XGBClassifier.fit()?

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

eval_set (list, optional) – A list of (X, y) pairs to use as a validation set for early-stopping

但是,格式只提到了一对特征和标签。因此,如果文档是准确的,则没有地方可以为这些评估示例提供权重。

我错过了什么吗?

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

的那个版本

编辑 - 根据评论中的对话更新

鉴于您有一个代表实数值 gain/loss 的目标变量,您希望将其分类为 "gain" 或 "loss",并且您希望确保分类器的验证集权重较大的绝对值gains/losses最重,这里有两种可能的方法:

  1. 创建一个自定义分类器,它只是将 XGBoostRegressor 馈送到一个阈值,在该阈值中,实值回归预测被转换为 1/0 或 "gain"/"loss" 分类。这个分类器的 .fit() 方法只会调用 xgbregressor 的 .fit() ,而这个分类器的 .predict() 方法会调用回归器的 .predict() ,然后 return 阈值类别预测。

  2. 您提到您想尝试对验证集中的记录进行加权处理,但 xgboost 中没有此选项。实现这一点的方法是实现自定义 eval-metric。但是,您指出 eval_metric 必须能够一次 return 单个 label/pred 记录的分数,因此它无法接受您所有的行值并执行加权在评估指标中。您在评论中提到的解决方案是 "create a callable which has a ref to all validation examples, pass the indices (instead of labels and scores) into eval_set, use the indices to fetch labels and scores from within the callable and return metric for each validation examples." 这也应该有效。

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

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

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