【all_estimators】最適なモデルを一発で探す【Python】
こんにちは!こーたろーです。
今回は、これまで使用していなかったのですが、scikit-learnの「all_estimators」を使ってみたいと思います。
scikit-learnの数々のモデルを一挙に定義できるものになります。
これで、機械学習の基礎トレーニングで用いられるアヤメのデータについてどのモデルの正解率が高いかを比較していきます。
それでは早速行っていきましょう。
データのロード
アヤメのデータセットは、scikit-learnのDatasetsの中に入っています。
import pandas as pd from sklearn import datasets iris = datasets.load_iris() print(iris.DESCR)
データのdescription(説明)を見てみましょう。
いつもの通りです。
データの前処理
データ自体は非常にきれいですので、説明変数と目的変数に分け、それから学習用データとテスト用データに分けていきます。
from sklearn.model_selection import train_test_split x = iris.data y = iris.target x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, train_size = 0.8, shuffle = True)
irisのデータは、iris.dataで説明変数の値が、またiris.targetで目的変数の値が呼び出すことができます。
いつものごとく、20%をテストデータ、80%を学習データにしています。
モデル情報の取り出し
from sklearn.utils import all_estimators warnings.filterwarnings('ignore') Algorithms_Name = all_estimators(type_filter = "classifier") Algorithms_Name
今回は、分類問題なので、分類のモデルの一覧を読み込みます。
画像は、表示の1部ですが、モデル名とオブジェクトの定義名称(そのまま使えば、オブジェクトを指定できる形)になっています。
モデルの作成と学習・評価
モデルの学習から評価までをforループでやっていきます。可能な限り全てのアルゴリズムで実施し、比較したいと思います。
import warnings from sklearn.metrics import accuracy_score Accuracy_Score = [] for (name,algorithm) in Algorithms_Name: if name == 'ClassifierChain': continue elif name == 'MultiOutputClassifier': continue elif name == 'OneVsOneClassifier': continue elif name == 'OneVsRestClassifier': continue elif name == 'OutputCodeClassifier': continue elif name == 'StackingClassifier': continue elif name == 'VotingClassifier': continue model = algorithm() model.fit(x_train, y_train) y_pred = model.predict(x_test) Accuracy_Score.append([name,accuracy_score(y_test, y_pred)])
引数の数が合わなかったものは、スキップさせています。
【引数が合わなかったモデル】
・「'ClassifierChain'」
・「'MultiOutputClassifier'」
・「'OneVsOneClassifier'」
・「'OneVsRestClassifier'」
・「'OutputCodeClassifier'」
・「'StackingClassifier'」
・「'VotingClassifier'」
結果については、モデルごとに「Accuracy_Score」に格納しました。
それでは結果を確認してみましょう。
Accuracy_Score = pd.DataFrame(Accuracy_Score, columns = ["Algorithm","Accuracy"]) Accuracy_Score =Accuracy_Score.sort_values('Accuracy',ascending=False) Accuracy_Score
1位に選ばれたのは、エントリーNo.28番!「RadiusNeighborsClassifier」でした!
こちらは、データセットの分割時のランダムの仕方で毎回結果が変わります。
そのため、クロスバリデーションを行って、結果を確認して最終的な最適モデルにしてもいいかもしれません。
クロスバリデーションバージョンや、グリッドサーチはまた今度やりたいと思います。
ではでは。