XGBOOST:sample_Weights与scale_pos_weight

mam*_*oku 2 python scikit-learn xgboost

我有一个非常不平衡的数据集,我想知道在哪里可以占的权重,因此,我试图理解之间的差别scale_pos_weight在参数XGBClassifiersample_weight该参数fit的方法。如果可以同时使用它们,或者如何选择两种方法,则将对它们之间的区别提供直观的解释。

该文档表明scale_pos_weight

控制正负权重的平衡。.&典型值要考虑:和(负例)/和(正例)

例:

from xgboost import XGBClassifier
import xgboost as xgb
LR=0.1
NumTrees=1000
xgbmodel=XGBClassifier(booster='gbtree',seed=0,nthread=-1,
                       gamma=0,scale_pos_weight=14,learning_rate=LR,n_estimators=NumTrees,
                      max_depth=5,objective='binary:logistic',subsample=1)
xgbmodel.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

要么

from xgboost import XGBClassifier
import xgboost as xgb
LR=0.1
NumTrees=1000
xgbmodel=XGBClassifier(booster='gbtree',seed=0,nthread=-1,
                       gamma=0,learning_rate=LR,n_estimators=NumTrees,
                      max_depth=5,objective='binary:logistic',subsample=1)
xgbmodel.fit(X_train, y_train,sample_weight=weights_train)
Run Code Online (Sandbox Code Playgroud)

Mil*_*idi 5

sample_weight参数允许您为每个训练示例指定不同的权重。该scale_pos_weight参数使您可以为整个示例类别(“正”类别)提供权重。

这些对应于两种对成本敏感的学习方法。如果您认为对所有阳性样本进行错误分类(错过癌症患者)的费用相同(但不如对阴性样本进行错误分类,例如告诉某人他们实际上没有患癌症),那么您可以指定一个权衡所有正面例子的权重scale_pos_weight

XGBoost将标签= 1视为“正”类。从以下代码中可以明显看出这一点:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
Run Code Online (Sandbox Code Playgroud)

看到这个问题

另一种情况是您有与示例相关的成本。一个示例是检测欺诈性交易。不仅是假阴性(缺少欺诈性交易)比假阳性(阻止合法交易)的成本更高,而且漏掉假阴性的成本也与被盗金额成正比。因此,您想对具有较高数量的正(欺诈)示例赋予更大的权重。在这种情况下,可以使用sample_weight参数指定特定于示例的权重。

  • 没有标准方法可以“计算”这些权重的值。在权衡整个正类时,XGBoost 文档建议将 sum(负实例)/ sum(正实例)作为“要考虑的典型值”。这原则上是一个要调整的超参数。为了权衡单个实例,完全由您决定这些实例的错误分类成本是多少。例如,检测信用卡交易中的欺诈行为,您可以说错过欺诈性交易的成本与被盗的金额成正比 (4认同)
  • 你是对的。在 XGBoost 的情况下,y=1 被视为正类。我更新了答案并包含了这个。 (2认同)