python - XGBoost 用于多分类和不平衡数据
问题描述
我正在处理一个具有 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。但我想尽可能地避免它们,如果可能的话,我更喜欢使用模型的超参数调整的解决方案。我上面的观察表明这适用于二进制情况。
解决方案
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)
推荐阅读
- python - Django - 'collections.OrderedDict' 对象没有属性 'headers'
- java - 如何重置 JDBC 连接对象?
- python - 如何使用python补充时间序列中的缺失数据?
- python - 了解 tkinter 按钮命令的函数调用
- python - ModuleNotFoundError:没有名为“PIL”的模块,ImageTk
- javascript - Youtube 的 onPlayerReady 事件在多次调用时不会触发
- python - 在 Python 脚本中使用 Azure Pipeline 环境变量
- ssh - rsync 到远程位置以代码 12 退出
- google-apps-script - How do I combine two onEdit functions into one
- vue.js - 在 beforeDestroy 生命周期 vue 中无法通过 getElementById 获取元素