8

scikit-learnでVotingClassifier()を使って3つのクラシファイア(Random Forest、Support Vector Machine、XGBoost)のアンサンブルを作成しようとしています。しかし、アンサンブルの精度は、実際には増加するのではなく、実際には減少しています。なぜ私は理解できません。私の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ので、私も無駄にそれをより多くのweightageを与えてみました最高の精度を持っています。ここ

はコードです。

私は間違っていますか?

答えて

8

投票クラスは、特にキャリブレーションされていないベースモデルの場合はソフト投票を使用すると、より良いパフォーマンスを保証するとは限りません。

たとえば、モデルがすべて間違っていると、実際には間違っているとします(誤ったクラスには99という確率を与えます)。正しいクラスの場合は51)。さらに、 'rf'と 'svc'は、 'xgb'が間違っている場合は常に正しいとし、逆の場合も同様で、各分類子は50%の精度を持ちます。

ソフト投票を使用しているため、実装する投票分類子の精度は0%になります。理由は次のとおりです。

  1. ケース1: 'xgb' right。次に、正しいクラスに.51の確率を与え、1.02のスコアに対して2の重みを得る。しかし、他のモデルは1.98というスコアで不正クラスの確率が.99になります。そのクラスはあなたの投票分類子によって選択されます。
  2. ケース2: 'xgb'が間違っています。次に、スコアが1.98の2の重みを持つ不正クラスに確率.99を与えます。他の2つのモデルは、正しいクラスに対して合計スコア1.02を与えます。再度、間違ったクラスが分類器によって選択されます。
関連する問題