【问题标题】:XGBoost for multiclassification and imbalanced dataXGBoost 用于多分类和不平衡数据
【发布时间】:2021-08-24 08:22:30
【问题描述】:

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

我想将 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。但我想尽可能地避免它们,如果可能的话,我更喜欢使用模型的超参数调整的解决方案。 我上面的观察表明这适用于二进制情况。

【问题讨论】:

  • 首先,尝试使用“过采样和欠采样”技术平衡数据,然后您可以在平衡数据上使用正态分布进行分类。
  • @PooyaChavoshi 感谢您的评论。我应该补充一点,我更愿意尽可能避免使用过采样/欠采样技术和方法,例如 SMOTE。不过我试过了

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


【解决方案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)

【讨论】:

  • 感谢您的建议。它确实奏效了!我缺少的关键点是应该在拟合时传递参数sample_weight
猜你喜欢
  • 2017-04-19
  • 2015-01-28
  • 1970-01-01
  • 2018-01-30
  • 2018-03-24
  • 2019-11-22
  • 2019-08-11
  • 2019-10-09
  • 2023-04-03
相关资源
最近更新 更多