【sklearn】cross_val_scoreの使い方が分かる【Kaggle Course – Intermediate Machine Learning 5】交差検証

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

その中でも、この記事では以下の講座について解説します。

Intermediate Machine Learning
5.Cross-Validation(交差検証)

ただ、全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うクラスは以下の通りです。

sklearn.model_selection.cross_val_score

Cross-Validation(交差検証)

Introduction(イントロダクション)

これまでの講座で用いてきた検証はホールドアウト検証といって、単純にデータを訓練データと検証データに分けるものでした。

ただし、ホールドアウト検証では、データに偏りがあるときは正確な制度が測定できません。

今回取り上げる交差検証(クロスバリデーション)は、そうしたホールドアウト検証の弱点を解消するものになります。

What is cross-validation?(交差検証とは)

交差検証では、ホールドアウト検証のようにデータを1度分割して、1度検証するのではなく、データをn回分割して、n回検証を行います。

例えば、下図のようにデータを5つに分け、それぞれのデータが1回ずつ検証に使われるようにします。ホールドアウト検証と比べて、検証にかかるコストは増大しますが、モデルの汎化性能を正しく評価することができるという特徴があります。

View post on imgur.com

When should you use cross-validation?(交差検証をいつ使うか)

交差検証は、データ量が少なく、検証で偏りが生じそうなときに効果を発揮します。

逆に、データ量が膨大で検証に時間がかかりそうなときは、ホールドアウト検証でも十分です。

どちらの検証方法を使うか判断するとすれば、モデルの実行が数分で終わる程度であれば交差検証を使えばいいでしょうし、交差検証の結果、それぞれのスコアにばらつきがなければ、ホールドアウト検証で問題ないと思われます。

Example(具体例)

今回もメルボルンの住宅価格のデータセットを使います。

欠損値を埋め、ランダムフォレストでパイプラインを定義した状態です。

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

my_pipeline = Pipeline(steps=[('preprocessor', SimpleImputer()),
                              ('model', RandomForestRegressor(n_estimators=50,
                                                              random_state=0))
                             ])

scikit-learncross_val_score()関数を用いて,交差検証のスコアを取得します。

ここでは、cvパラメータでデータを5分割するよう指定しています。

また、scoringパラメータで負のMAEスコアneg_mean_absolute_errorを指定しているため、スコアには-1を掛けます。

わざわざ負の値を指定しているのは、scikit-learnの慣習で、すべての値が大きい値ほど良いように定義されているためだそうです。面白いですね。

from sklearn.model_selection import cross_val_score

# Multiply by -1 since sklearn calculates *negative* MAE
scores = -1 * cross_val_score(my_pipeline, X, y,
                              cv=5,
                              scoring='neg_mean_absolute_error')

print("MAE scores:\n", scores)
MAE scores:
 [301628.7893587  303164.4782723  287298.331666   236061.84754543
 260383.45111427]

MAEスコアは出ましたが、5つも精度の指標があると迷うので、平均を求めます。

print("Average MAE score (across experiments):")
print(scores.mean())
Average MAE score (across experiments):
277707.3795913405

Conclusion(結論)

交差検証を使い、モデルの精度をより正確に測定することができました。

また、訓練データと検証データをを別々に管理する必要がなくなったので、コードもきれいになりました

Your Turn(練習問題)

この講座で学んだ交差検証を練習問題で実装してみましょう。

今回はKaggle Courseで交差検証について学びました。ホールドアウト検証に比べ、より信頼性の高い精度測定ができるようになりましたね。次回はXGBoostについて学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました