我正在处理一个不平衡的分类问题,其中目标变量包含:
np.bincount(y_train)
array([151953, 13273])
即151953 零和13273一。
为了解决这个问题,我在定义 DMatrix 时使用了XGBoost's参数: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]])
所以我的问题是:
- 为什么使用每个类的实际权重会产生较差的指标?
- 哪种方法是为不平衡问题设置权重的正确方法?