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

Scikit learn 如何为XGBClassifier.fit()提供加权评估集?,scikit-learn,xgboost,Scikit Learn,Xgboost,从中,我们可以提供早期停止的评估示例 评估集(列表,可选)–用作评估集的(X,y)对列表 用于提前停止的验证集 但是,该格式仅提及一对特性和标签。因此,如果文档是准确的,就没有地方为这些评估示例提供权重 我遗漏了什么吗 如果在sklearn样式中无法实现,那么原始(即非sklearn)XGBClassifier API是否支持它?一个简短的示例会很好,因为我从未使用过该版本的API。编辑-在评论中按对话更新 假设您有一个目标变量,表示您希望分类为“增益”或“损失”的实值增益/损失值,并且您希望确

从中,我们可以提供早期停止的评估示例

评估集(列表,可选)–用作评估集的(X,y)对列表 用于提前停止的验证集

但是,该格式仅提及一对特性和标签。因此,如果文档是准确的,就没有地方为这些评估示例提供权重

我遗漏了什么吗


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

编辑-在评论中按对话更新

假设您有一个目标变量,表示您希望分类为“增益”或“损失”的实值增益/损失值,并且您希望确保分类器的验证集权重最大的绝对值增益/损失,以下是两种可能的方法:

  • 创建一个自定义分类器,该分类器仅由XGBoostTregressor馈送到一个treshold,其中实值回归预测转换为1/0或“增益”/“损失”分类。此分类器的.fit()方法将只调用XGBRegressionor的.fit(),而此分类器的.predict()方法将调用Regressionor的.predict(),然后返回阈值类别预测

  • 您提到您希望尝试对验证集中记录的处理进行加权,但xgboost中没有此选项。实现这一点的方法是实现一个自定义的
    评估指标
    。但是,您指出,
    eval_metric
    必须能够一次返回单个标签/pred记录的分数,因此它不能接受您的所有行值并在eval metric中执行加权。您在评论中提到的解决方案是“创建一个引用所有验证示例的可调用函数,将索引(而不是标签和分数)传递到eval_集合,使用索引从每个验证示例的可调用和返回度量中获取标签和分数。”这也应该有效


  • 我倾向于选择更简单的选项1,但如果你有时间,尝试两种不同的方法并比较结果通常是一个好主意,因此对结果感兴趣。

    几周前,有一个新参数用于
    fit
    方法,
    sample\u weight\u eval\u set
    ,这样你就可以做到这一点。它需要一个权重变量列表,即每个评估集一个。我不认为这个特性已经成为一个稳定的版本,但是如果您从源代码编译xgboost,它现在就可以使用了


    是的,我知道
    样本权重
    ,并且同意它看起来与这个问题无关。根据
    评估度量
    ,显然可调用项一次只接受一个标签分数对,因此它不是为每个验证示例传递权重而设计的。我假设您可以创建一个可调用函数,该函数引用所有验证示例,将索引(而不是标签和分数)传递到
    eval_set
    ,使用索引从每个验证示例的可调用和返回度量中获取标签和分数。可以将总重量标准化为1。通过这种方式,每个验证示例返回的值将总结为总体加权指标。我认为您的建议是可行的。我会等几天,看看是否有更好的建议。如果没有,我将以你的回答为准。谢谢你的努力!为了其他读者,你是想用我在上面写的方法和你自己的话来提供你的答案,还是参考我的评论?我面临的问题基本上是我得到了一个项目列表,它有一个真正有价值的收益/损失。我想做一个分类(即一个项目是否会导致收益或损失),但我想确保与高收益/损失幅度相关的项目比普通项目更受尊重。这回答了你的问题吗?我想我的建议如下:使用XGBRegressor而不是XGBClassifier,并预测实值收益/损失(不仅仅将其分类为+/-0)。然后,实值预测的输出被传递到阈值分类器,在该分类器中,假设将预测分类为“增益”或“损失”的阈值为0。那么,培训/验证/评分中的每一项都会受到更高绝对值收益/损失的影响。但我认为这是一个比我们之前讨论的更直接的方法。你觉得这合理吗?