我正在处理一个不平衡的分类问题,其中目标变量包含:
np.bincount(y_train)
array([151953, 13273])
即151953
零和13273
1。
为了解决这个问题,我在定义DMatrix时使用XGBoost
的weight
参数:
dtrain = xgb.DMatrix(data=X_train,
label=y_train,
weight=weights)
对于我一直在使用的重量:
bc = np.bincount(y_train)
n_samples = bc.sum()
n_classes = len(bc)
weights = n_samples / (n_classes * bc)
w = weights[y_train.values]
weights
是array([0.54367469, 6.22413923])
,在最后一行代码中,我只是使用y_train
中的二进制值对其进行索引。这似乎是定义权重的正确方法,因为它表示一类值与另一类值之间的实际比率。但是,这似乎有利于少数民族阶级,这可以通过检查混淆矩阵来看出:
array([[18881, 19195],
[ 657, 2574]])
因此,通过尝试不同的权重值,我已经意识到,使用相当接近的权重比,特别是array([1, 7])
,结果似乎更加合理:
array([[23020, 15056],
[ 837, 2394]])
所以我的问题是:
[内部,xgboost使用输入权重,通过将计算出的梯度和粗麻布乘以权重[ref],来提高少数族裔样本对损失函数的贡献。
虽然很有前途并且很流行,但没有证据表明您提到的方法将导致最佳性能(这还取决于其他超参数的设置方式和使用的度量);这只是一种启发。您可能也想使用ROC-AUC进行评估(如xgboost的recommended)。像大多数其他超参数一样,一种优化权重的更系统的方法是网格搜索。 Here是一个实现。