不平衡分类的权重

问题描述 投票:0回答:1

我正在处理一个不平衡的分类问题,其中目标变量包含:

np.bincount(y_train)
array([151953,  13273])

151953零和13273 1。

为了解决这个问题,我在定义DMatrix时使用XGBoostweight参数:

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]

weightsarray([0.54367469, 6.22413923]),在最后一行代码中,我只是使用y_train中的二进制值对其进行索引。这似乎是定义权重的正确方法,因为它表示一类值与另一类值之间的实际比率。但是,这似乎有利于少数民族阶级,这可以通过检查混淆矩阵来看出:

array([[18881, 19195],
       [  657,  2574]])

因此,通过尝试不同的权重值,我已经意识到,使用相当接近的权重比,特别是array([1, 7]),结果似乎更加合理:

array([[23020, 15056],
       [  837,  2394]])

所以我的问题是:

  • 为什么使用每个类别的实际权重得出的指标不佳?
  • 哪个是为不平衡问题设置权重的正确方法?
python machine-learning xgboost
1个回答
0
投票

[内部,xgboost使用输入权重,通过将计算出的梯度和粗麻布乘以权重[ref],来提高少数族裔样本对损失函数的贡献。

虽然很有前途并且很流行,但没有证据表明您提到的方法将导致最佳性能(这还取决于其他超参数的设置方式和使用的度量);这只是一种启发。您可能也想使用ROC-AUC进行评估(如xgboost的recommended)。像大多数其他超参数一样,一种优化权重的更系统的方法是网格搜索。 Here是一个实现。

© www.soinside.com 2019 - 2024. All rights reserved.