xgboost:不平衡数据的样本权重?

2024-06-01 07:39:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由3个类组成的高度不平衡的数据集。为了解决这个问题,我在XGBClassifier中应用了sample_weight数组,但是我没有注意到建模结果中的任何变化?分类报告(混淆矩阵)中的所有指标都是相同的。实施中是否存在问题

班级比例:

military: 1171 
government: 34852 
other: 20869

示例:

pipeline = Pipeline([
    ('bow', CountVectorizer(analyzer=process_text)), # convert strings to integer counts
    ('tfidf', TfidfTransformer()), # convert integer counts to weighted TF-IDF scores
    ('classifier', XGBClassifier(sample_weight=compute_sample_weight(class_weight='balanced', y=y_train))) # train on TF-IDF vectors w/ Naive Bayes classifier
])

数据集示例:

data = pd.DataFrame({'entity_name': ['UNICEF', 'US Military', 'Ryan Miller'], 
                     'class': ['government', 'military', 'other']})

分类报告

enter image description here


Tags: to数据sample示例converttf报告分类
1条回答
网友
1楼 · 发布于 2024-06-01 07:39:02
  1. 首先,最重要的是:使用多类eval_metriceval_metric=merrormlogloss,然后将结果发布给我们。您向我们展示了['precision','recall','f1-score','support'],但这是次优的,或者完全不符合要求的,除非您以多类感知、不平衡感知的方式计算它们
  2. 其次,您需要权重。你的班级比例是military: government: other1:30:18,或者百分比为2:61:37%。
    • 您可以使用xgb.DMatrix..., weights)手动设置每个类的权重
    • 查看管道内部(使用打印或详细设置、转储值),不要盲目地依赖sklearn.utils.class_weight.compute_sample_weight('balanced', ...)之类的样板文件来为您提供最佳权重
    • 尝试手动设置每类权重,从1 : 1/30 : 1/18开始,尝试更多的极值。往复运动,因此稀有类的重量更高
    • 还可以尝试将min_child_weight设置得更高,因此它需要一些(少数类的)示例。从min_child_weight >= 2(*最稀有类的权重)开始,然后尝试更高。当心过度拟合非常罕见的少数类(这就是为什么人们使用StratifiedKFold交叉验证来提供一些保护,但您的代码没有使用CV)
  3. 我们看不到xgboost分类器的其他参数(有多少个估计器?提前停止打开或关闭?学习率/预计到达时间是多少?等等)。似乎您使用了默认值-它们将非常糟糕。否则你就不会显示你的代码。不信任xgboost的默认值,尤其是对于多类,不要期望xgboost提供良好的开箱即用的结果。阅读文档并尝试使用值
  4. 做所有这些实验,发布你的结果,在总结“它不起作用”之前进行检查。不要期待开箱即用的最佳结果。不信任或反复检查sklearn util函数,请尝试手动替代方法。(通常,仅仅因为sklearn有做某事的功能,并不意味着它是好的、最好的或适用于所有用例,比如不平衡的多类)

相关问题 更多 >