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