福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【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」でした!


こちらは、データセットの分割時のランダムの仕方で毎回結果が変わります。


そのため、クロスバリデーションを行って、結果を確認して最終的な最適モデルにしてもいいかもしれません。


クロスバリデーションバージョンや、グリッドサーチはまた今度やりたいと思います。




ではでは。


統計学的アプローチを活用した分析法バリデーションの評価及び妥当性