scikit-learnの複数のアルゴリズムを交差検定法で精度検証する!【サンプルコード有り】

はじめに

pythonの機械学習ライブラリであるscikit-learnは、数多くの機械学習アルゴリズムをカンタンに使い分けることができるとても優秀なライブラリです。短いコードで数学的に高度なプログラムをカンタンに実装することが出来ます。

データ分析では適切なアルゴリズムの選択が重要であり、そこがデータエンジニアの腕の見せ所ということが出来ます。しかし、その一方でscikit-learnのようにカンタンにアルゴリズムが使える場合、処理の中身がブラックボックス化してエンジニアが適切に使用できないといったケースも散見されます

こうした事態の場合、scikit-learnの「カンタンにアルゴリズムを実装できる」という特性を生かして、いくつかのアルゴリズムを試して見るというのも一つの手だと思います。本記事では、このアルゴリズムの選定の方法をご紹介したいと思います。

※本記事の内容を実機で試してみたいという方は以下の記事を参考に開発環境をご準備ください
Pythonやるならド定番!Anacondaをサクッと入れて巨人の肩に乗りましょう!
Win10&Anaconda3環境でJupyter Notebookを起動してプログラムを実行する方法
個人情報保護方針及び免責事項

交差検定法で複数のアルゴリズムを精度検証する本記事の目的

本記事では、複数のアルゴリズムを精度検証する方法として交差検定法(クロスバリデーション)を使用します。

 

交差検証とは、統計学において標本データを分割し、その一部をまず解析して、残る部分でその解析のテストを行い、解析自身の妥当性の検証・確認に当てる手法を指す。データの解析がどれだけ本当に母集団に対処できるかを良い近似で検証・確認するための手法である。
フリー百科事典『ウィキペディア(Wikipedia)』

少々分かりづらい表現ですが、要は検証の精度もデータによって当たり外れがあるので、データによって精度のばらつきを抑えるために、データをいくつかに区切って数回テストして精度のばらつきを抑える、といったイメージです。

この交差検定法を使うことで、データのばらつきの影響を最小限にして、最も制度の高いアルゴリズムがどれか検証します。今回も前回に引き続き、scikit-learnに用意されたデータ生成関数で三日月状のデータを使用します。

交差検定法で複数のアルゴリズムを精度検証する処理の流れ

それでは処理の流れを説明します!

scikit-learnのmake_moonsでデータを生成する

この部分は前回に引き続いて同じです。

データを学習用と検証用に分割する

こちらもいつもどおりなのですが、ここで分割したデータを更に交差検定法用に分割して学習、テストを行います。

使用するアルゴリズムをインポートし、配列に格納する

使用するアルゴリズムをインポートして配列に格納します。配列に格納するのは、のちにforループで一つづつ取り出して精度を検証するためです。もし、他にも試したいアルゴリズムがあったら、algorithms配列に追加格納してください。

交差検定法を行うモジュールをインポートし、一つづつ検証

交差検定を行うStratifiedKFoldとcross_val_scoreをインポートします。StratifiedKFoldの引数にn_split-3を指定して、3分割での交差検定を行うオブジェクトを生成します。

cross_val_score第一引数にアルゴリズムを格納した配列から一つ取り出して指定の条件で学習させます。戻り値はStratifiedKFoldで指定した分割数の精度結果を配列で返します。

検証結果をみてみると…

検証結果を確認しましょう。以下のコードを説明します。

print(f'Algorithm name: {name}  score: {score}  score_mean: {score_mean:.04f} ')

Algorithm name:は検証したアルゴリズムの名前です。scoreは前述の通り指定した分割数で検証した精度を配列で返してきたものです。これではいまいち分かりづらいので、(今回は)3回繰り返した検証結果の中央値を最後に表示しており、これが実質的なアルゴリズム毎の精度となります。

標準出力では表示が整っておらず見ずらいので、エクセルに整形し直した結果を以下に示します。

SVCが100%の分類結果を示しました。

交差検定法で複数のアルゴリズムを精度検証するソースコード

それではソースコードです!データを生成する部分は前回と同じですので、掲載を割愛いたします。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(X, y,test_size=0.5)

# 候補アルゴリズムのリスト化
# ロジスティック回帰
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
# 決定木
from sklearn.tree import DecisionTreeClassifier
DTC = DecisionTreeClassifier()
# ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
RFC = RandomForestClassifier()
# サポートベクトルマシン
from sklearn.svm import SVC
SVC = SVC(kernel='rbf')

algorithms = [LR, DTC, RFC, SVC]

from sklearn.model_selection import StratifiedKFold
stratifiedkfold = StratifiedKFold(n_splits=3)

# 交差検定法
from sklearn.model_selection import cross_val_score
for algorithm in algorithms:
score = cross_val_score(algorithm , x_train, y_train , cv=stratifiedkfold)
score_mean = score.mean()
name = algorithm.__class__.__name__
print(f'Algorithm name: {name} score: {score} score_mean: {score_mean:.04f} ')

おわりに

今回は交差検定法で複数のアルゴリズムを精度検証する方法をご説明いたしました。交差検定法などと聞くととても難しそうですが、実際は先程説明したとおり、データをいくつかに分割して精度検証を行うということであり、そう難しいことでは有りません。

今回は前回に続き三日月のデータセットを使いましたが、実際には様々な形のデータがありますので、複数のアルゴリズムから制度の高いものを見つけてみるという方法はよく取られます。

また、今回は二次元のデータでしたが、実際はもっと多くの複数次元データを扱うことも有り、データのイメージを散布図などから得られないため、適切なアルゴリズムを最初から見つけ出すのは至難の技です。そうしたときに今回紹介した交差検定法はきっとお役に立つでしょう!