XGBOOST:sample_Weights与scale_pos_weight

时间:2018-01-03 15:03:08

标签: python scikit-learn xgboost

我有一个高度不平衡的数据集,我想知道在哪里考虑权重,因此我试图理解scale_pos_weightXGBClassifier参数与sample_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)

OR

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)

1 个答案:

答案 0 :(得分:3)

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

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

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

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

请参见this question

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