为什么我的VotingClassifier的准确度低于单个分类器?

9
我想创建一个分类器(随机森林、支持向量机和XGBoost)的集成,使用scikit-learn中的VotingClassifier()。但是,我发现集成的准确率实际上会降低而不是提高。我搞不清原因。

以下是代码:

from sklearn.ensemble import VotingClassifier

eclf = VotingClassifier(estimators=[('rf', rf_optimized), ('svc', svc_optimized), ('xgb', xgb_optimized)], 
                        voting='soft', weights=[1,1,2])

for clf, label in zip([rf, svc_optimized, xgb_optimized, eclf], ['Random Forest', 'Support Vector Machine', 'XGBoost', 'Ensemble']):
    scores = cross_val_score(clf, X, y, cv=10, scoring='accuracy')
    print("Accuracy: %0.3f (+/- %0.3f) [%s]" % (scores.mean(), scores.std(), label))

XGBoost具有最高的准确性,所以我甚至尝试给它更多的权重,但没有效果。

我可能做错了什么?

1个回答

10

VotingClassifiers并不总是表现更好,特别是当使用软投票时,如果基础模型的校准较差。

举个假设的例子,假设所有模型在错误情况下都非常错(例如为错误类别提供0.99的概率),而在正确情况下只是稍微正确(例如为正确类别提供0.51的概率)。此外,假设 'rf' 和 'svc' 在 'xgb' 错误时总是正确的,反之亦然,并且每个分类器在其自身上的准确度为50%。

您实现的投票分类器将具有0%的准确度,因为您使用软投票。原因如下:

  1. 情况1:'xgb'正确。然后它为正确的类别提供0.51的概率,并获得权重为2,得分为1.02。但是,其他模型每个为错误类别提供0.99的概率,得分为1.98。这个分类器选择了那个错误的类别。
  2. 情况2:'xgb'错误。然后它为错误的类别提供0.99的概率,权重为2,得分为1.98。另外两个模型为正确的类别提供1.02的组合得分。分类器再次选择了错误的类别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接