XGBOOST:样本权重 vs 比例正类权重

20
我有一个高度不平衡的数据集,想知道在哪里考虑权重,因此尝试理解 XGBClassifierscale_pos_weight 参数和 fit 方法的 sample_weight 参数之间的区别。如果可以同时使用它们或如何选择任一方法,将感激不尽您提供直观的解释。
文档指出,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个回答

32
sample_weight参数允许您为每个训练示例指定不同的权重,而scale_pos_weight参数则允许您为整个“正”类别的示例提供权重。这对应于两种不同的成本敏感学习方法。如果您认为误分类正样本(错过癌症患者)的代价对于所有正样本都相同(但比误分类负样本更高,例如告诉某人他们有癌症,实际上却没有),则可以通过scale_pos_weight指定所有正样本的单一权重。
XGBoost将标签= 1作为“正”类。这可以从以下代码片段中得出:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

请参阅此问题

另一种情况是您具有样本相关成本。一个例子是检测欺诈交易。不仅一个假阴性(错过了一个欺诈交易)比一个假阳性(阻止一个合法交易)更加昂贵,而且错过一个假阴性的代价与被盗金额成正比。因此,您希望对具有较高金额的正(欺诈)示例赋予更大的权重。在这种情况下,您可以使用sample_weight参数来指定特定于示例的权重。


嗨,你能告诉我如何计算这两个实例的值吗?另外,在scale_pos_weight中,正实例和负实例分别是什么意思?谢谢。 - Alain Michael Janith Schroter
4
这些权重的“计算”没有标准方式。在加权整个正类时,XGBoost文档建议考虑sum(负实例)/ sum(正实例)作为“典型值”。这原则上是要调整的超参数。对于加权单个实例,你可以自行决定误分类的成本是多少。例如,在检测信用卡交易欺诈方面,你可以说错过一个欺诈交易的成本与被盗金额成比例。 - Milad Shahidi
非常感谢。另外,您能告诉我什么是正实例吗?它是指类值等于1的情况,而负实例则是指类值等于0的情况?但是将0和1分配给类可能是任意的,对吗?谢谢。 - Alain Michael Janith Schroter
2
你说得对。在XGBoost的情况下,y=1被视为正类。我更新了答案并加入了这一点。 - Milad Shahidi
可以同时使用 scale_pos_weight 和 sample_weight 吗?这里有什么陷阱吗? - Glue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接