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

问题描述 投票:0回答:1

我有一个高度不平衡的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

python machine-learning scikit-learn xgboost
1个回答
1
投票
  1. 首先,最重要的是:使用多类eval_metriceval_metric=merrormlogloss,然后将结果发布给我们。您向我们展示了['precision','recall','f1-score','support'],但是它不是次优的,或者是完全破坏的,除非您以了解多类,不平衡的方式计算它们。
  2. 第二,您需要砝码。您的班级比例是military: government: other 1: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分类器的其他参数(有多少个估算器?提早停止或关闭?什么是learning_rate / eta?等)。似乎您使用了默认设置-将会很糟糕。否则,您不会显示代码。不信任xgboost的默认值,尤其是。对于多类,不要指望xgboost能够提供良好的开箱即用结果。阅读文档并尝试使用值。
  4. 进行所有实验,发布结果,在得出结论“不起作用”之前进行检查。不要期望开箱即用时会获得最佳结果。不信任或仔细检查sklearn util函数,请尝试使用其他手动方法。 (通常,仅仅因为sklearn具有执行某项功能的功能,并不意味着它是好的或最好的,或者适合于所有用例,例如不平衡的多类)
© www.soinside.com 2019 - 2024. All rights reserved.