XGBoost 用于多分类和不平衡数据

时间:2021-06-07 08:38:39

标签: python xgboost multiclass-classification imbalanced-data xgbclassifier

我正在处理一个包含 3 个类 [0,1,2] 的分类问题,并且类分布不平衡,如下所示。

enter image description here

我想将 XGBClassifier(在 Python 中)应用于这个分类问题,但模型不响应 class_weight 调整并偏向多数类 0,并忽略少数类1,2。除了 class_weight 之外,还有哪些超参数可以帮助我?

我尝试过 1) 使用 sklearn compute_class_weight 计算类权重; 2)根据班级的相对频度设置权重; 3) 并手动调整具有极值的类以查看是否发生任何变化,例如{0:0.5,1:100,2:200}。但无论如何,考虑少数类对分类器没有帮助。

观察:

  • 我可以在二元情况下处理问题:如果我通过识别类[1,2]使问题成为二元分类,那么我可以通过调整使分类器正常工作scale_pos_weight(即使在这种情况下,单独使用 class_weight 也无济于事)。 但是,据我所知,scale_pos_weight 适用于二元分类。对于多分类问题,是否有类似的参数?

  • 使用 RandomForestClassifier 而不是 XGBClassifier,我可以通过设置 class_weight='balanced_subsample' 和调整 max_leaf_nodes 来处理问题。但是,由于某种原因,这种方法不适用于 XGBClassifier。

备注:我了解平衡技术,例如过采样/欠采样或 SMOTE。但我想尽可能地避免它们,如果可能的话,我更喜欢使用模型的超参数调整的解决方案。 我上面的观察表明,这适用于二进制情况。

1 个答案:

答案 0 :(得分:1)

sample_weight 参数对于在使用 XGBoost 训练数据时处理不平衡数据很有用。您可以使用 compute_sample_weight() 库的 sklearn 计算样本权重。

此代码应该适用于多类数据:

from sklearn.utils.class_weight import compute_sample_weight
sample_weights = compute_sample_weight(
    class_weight='balanced',
    y=train_df['class'] #provide your own target name
)

xgb_classifier.fit(X, y, sample_weight=sample_weights)
相关问题