【機械学習】Scikit-Learnで交差検証(Cross-Validation)を一瞬で実装する【Python】

こんにちは。本日は、Scikit-Learnを使って機械学習モデル構築時の交差検証を実装する方法をご紹介いたしますす。(交差検証の理論は分かっている前提で話を進めます)

方法1:sklearnのcross_val_score()を使う

これ、cross_val_score()という関数を使ってなんと1行で実装できてしまうんですね・・恐ろしく便利・・・

関数の公式リファレンスはこちらです。

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html

以下が、引数の一覧です。この関数の返り値は下の引数で設定するscoreになります。

sklearn.model_selection.cross_val_score(estimator, X, y=None, *, groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', error_score=nan)

引数について、一つづつ確認していきます。

  • estimator:学習器を持つ(fit関数を持つ)オブジェクト
  • X:学習データ(array, listでも良い)
  • y:教師あり学習を行う場合の正解データ
  • groups:GroupKFoldを行う場合の層化指標
  • scoring:評価指標
  • cv:Cross-ValidationのFold数(scikit-learn ver0.22よりデフォルトが5(以前は3)になりました)
  • n_jobs:利用するCPU数(デフォルトは1。-1を指定すると、全てのCPUを利用する)
  • verbose:何ステップおきに学習状況を出力するか
  • fit_params:estimatorに渡すパラメータ
  • pre_dispatch:並列実行時の起動ジョブ数(少ない方がメモリ消費は抑えられる)
  • error_score:エラー発生時にエラーをraiseするか(’raise’を設定)


Pythonの実装

毎度おなじみ、タイタニックのデータを用いて実装します。

from sklearn import svm
from sklearn.model_selection import cross_val_score

## 読み込み
df_train = pd.read_csv(PATH+'train.csv')
df_test = pd.read_csv(PATH+'test.csv')

## 特徴量エンジニアリング(詳細割愛)
df_train_fe = feature_engineering(df_train)
df_test_fe = feature_engineering(df_test)

## モデリング(サポートベクターマシン)
exclude_columns = [
    'Name',
    'Ticket',
    'PassengerId',
    'Survived'
]
features = [c for c in df_train_fe.columns if c not in exclude_columns]

svc = svm.SVC()

## Cross-Validation
score = cross_val_score(svc,df_train_fe[features],target,scoring='roc_auc',cv=5, n_jobs=-1)
print(score)

実行結果

CV=5としたので、各Foldのroc_aucの値が返ってきています。

[0.84426877 0.82727273 0.84237968 0.80855615 0.8931658 ]

方法2:sklearnのcross_validate()を使う

2つ目の方法は、SKlearnのcross_validate関数を使う方法です。

ん、同じscikit-learnでなんで複数の交差検証関数があるの・・?と思いますよね。こちらはScikit-Learnの公式ドキュメントにて解説されています。

https://scikit-learn.org/stable/modules/cross_validation.html#the-cross-validate-function-and-multiple-metric-evaluation

  • cross_val_score関数と異なって評価に複数のメトリクスを指定できる
  • cross_val_score関数と異なり、テストスコア以外の情報(fit、スコアリングに要した時間など)も得られる

実装例は上のリンクにあるので割愛します。

なお、cross_val_scoreとの使い分けですが、scikit-learnの立場として以下のようにコメントされていますので、cross_validateを使う必要のない場合は、引き続きcross_val_scoreを使うでもよさそうです。

The simplest way to use cross-validation is to call the cross_val_score helper function on the estimator and the dataset.

https://scikit-learn.org/stable/modules/cross_validation.html#the-cross-validate-function-and-multiple-metric-evaluation

以上、自分でKFold/GroupKFoldのコードを組まなくても簡単に交差検証を実装する方法でした!この記事が少しでもお役に立ちましたら、下のいいねボタンをぽちっていただけますと励みになります!

(おまけ)Python×機械学習をもっと学ぶなら・・・

個人的には、Udemyのコンテンツは利用しやすく重宝しています。その分野のエキスパートの方が作成したコンテンツなので、レビュー数が多いものを選べば内容も間違いないですし、万が一内容が合わなかった場合には30日以内の返金にも対応しているので、利用しやすいと思います。

Python × 機械学習の人気コンテンツとしては、以下のようなものがありましたので、ぜひ活用してみてください。

みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】
【世界で18万人が受講】実践 Python データサイエンス

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。