我有一个高度不平衡的数据集,我想知道在哪里考虑权重,因此我试图理解scale_pos_weight
中的XGBClassifier
参数和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)
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)
sample_weight
参数允许您为每个训练示例指定不同的权重。 scale_pos_weight
参数允许您为整个示例类(“正”类)提供权重。
这些对应于成本敏感学习的两种不同方法。如果您认为错误分类正面例子(缺少癌症患者)的成本对于所有正面例子都是相同的(但不仅仅是对负面例子进行错误分类,例如告诉某人他们实际上没有患癌症)那么您可以指定一个通过scale_pos_weight
所有正面例子的重量。
XGBoost将labels = 1视为“正”类。从以下代码中可以看出这一点:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
另一种情况是您具有依赖于示例的成本。一个例子是检测欺诈性交易。不仅假阴性(错过欺诈性交易)比假阳性(阻止合法交易)更昂贵,但错失假阴性的成本与被盗金额成正比。因此,您希望对具有较高金额的正(欺诈)示例给予较大权重。在这种情况下,您可以使用sample_weight
参数指定特定于示例的权重。