【Python機械学習】VotingClassifierを用いてrandom seed averagingを試してみる

少しでもモデルの精度を上げるテクニックの一つに、random seed averaging というものがあります。

これはrandomseedが異なる複数の(ランダム性のある)モデルの平均をとる考え方です。

例えば、ランダムフォレストはランダム性のあるモデルですので、何も設定しないと毎回異なる予測精度が出ます。モデル構築の際に、random_stateの値を設定することで、毎回同じ結果が出るようになります。

random seed averagingは、(例えば)random_stateの値が異なる複数のランダムフォレスト分類器を作って、その結果の投票ないしは確率平均をとってみることで精度の向上をもくろみます。

どうしてそれで精度があがるか、というのは以下のブログがわかりやすく解説しています。

機械学習上級者は皆使ってる?!アンサンブル学習の仕組みと3つの種類について解説します

https://www.codexa.net/what-is-ensemble-learning/ より引用)

(↑図のように、弱学習器を組み合わせることで予測精度が向上することがあります。)

 

scikit-learnではvoting classifierというAPIで簡単にそのアンサンブルが実装できます。

今回はガラスの分類のデータセットを用いて実装してみました。

 

以下の2つのサイトを参考にしています。

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html

 

今回使用するデータセット

UCIが公開している、ガラスの分類のデータセットを利用します。

https://www.kaggle.com/uciml/glass

↑からダウンロードできます。

中身は以下のようになっており、ガラスの成分を特徴量としてTypeを分類します。

このように欠損値がなくすべて数値が入っているきれいなデータセットです。

Typeは1~7の7分類です。

 

Voting Classifier

VotingClassifierの使い方は簡単で、はじめに複数の分類器をリストに入れておいて、それをVotingClassifierの引数とします。

そのあとはsklearnおなじみのfitとpredictです。

estimators_属性では各分類器が、named_estimators_属性では、名称と分類器を取り出すことができます。

Votingした結果は0.925でしたが、votingしなかったらスコアがいくつなのかを見てみましょう。

と、このように精度が上がってはいないようです。

しかしサンプル数が少なくtrain_test_splitした結果なので、交差検証をしてもっと正確に汎化性能を見てみたら変わるかもしれません。

stratified k-foldで同じようにやってみます。

votingによる各交差検証のスコアはvotingsというリストに入れ、各分類器の交差検証スコアはaccsに入れています。

5分割交差検証の結果を見るともとの分類器でもっともよかったスコアは0.7838ですが、混ぜた結果は0.7845ですので、わずかに精度が向上していますね!よかった!

 

今回はVotingClassifierを使ったseed averagingを試してみました。

最後まで読んでいただきありがとうございました。