为什么我的VotingClassifier精度低于我的个人分类器?

时间:2016-09-27 09:20:19

标签: python machine-learning scikit-learn xgboost ensemble-learning

我正在尝试使用scikit-learn中的VotingClassifier()创建三个分类器(随机森林,支持向量机和XGBoost)的集合。但是,我发现整体的准确性实际上是降低而不是增加。我无法弄清楚原因。

以下是代码:

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 个答案:

答案 0 :(得分:8)

投票分类器并不总能保证具有更好的性能,尤其是在使用软投票时,如果基本型号校准不佳。

对于一个人为的例子,假设所有模型在错误时都是错误的(假设错误类的概率为0.99),但在它们正确的情况下只是略微正确(比如给出概率为.51)为了正确的课程)。此外,当'xgb'错误时,'rf'和'svc'总是正确的,反之亦然,每个分类器本身的准确度为50%。

由于您使用的是软投票,因此您实施的投票分类器的准确率为0%。原因如下:

  1. 案例1:'xgb'对。然后它给出正确的类的概率为.51,得到的权重为2,得分为1.02。但是,对于得分为1.98的不正确的类别,其他模型每个给出概率为0.99。该类由您的投票分类器选择。
  2. 案例2:'xgb'错了。然后它给出了不正确的类的概率为.99,权重为2,得分为1.98。另外两个模型给出正确等级的综合得分1.02。同样,您的分类器会选择错误的类。