【scikit-learn】交差検証(StratifiedKFold)の内部挙動と仕組み
機械学習モデルの性能を正しく評価する手法として定番の「交差検証(Cross-Validation)」。scikit-learnを使うとたった数行で実行できますが、裏側では一体どのような処理が行われているのでしょうか?今回はIrisデータセットを例に、交差検証の内部ロジックを解き明かします。
※本記事の手順は、MacBook Air(macOS 15.7.7)の環境にて実際に動作を確認したログをベースに作成しています。
1. 【 概要 】
交差検証とは、手元にあるデータを複数のグループに分割し、「学習」と「検証」を組み合わせを変えながら繰り返し行うことで、モデルの汎用的な性能を正しく測定する手法です。
今回は、scikit-learnの `StratifiedKFold`(層化k分割交差検証)と `cross_val_score` を使い、全150件のデータを10分割してモデルを評価する際、内部でどのようにデータが分割・処理されているかの全体像を整理します。
2. 【 基本手順(交差検証のコード例) 】
(2) 分割条件(10分割・層化・シャッフル)を定義する
(3) `cross_val_score` で一括して学習・検証・スコア算出を実行する
3. 整理:内部で起きていることのイメージ
`cross_val_score` が実行された瞬間、裏側で自動処理されているステップを順番に深く見ていきましょう。
【 内部の処理プロセス 】
渡された `KNeighborsClassifier(n_neighbors=3)` は、まだ何も学習していない「空のモデル(アルゴリズムの設定)」です。
・処理(2):10回の自動ループ処理
① データを「学習用(135件)」と「検証用(15件)」に自動分割する
② 学習用データ(135件)でモデルを学習(fit)させる
③ 検証用データ(15件)でモデルを評価(score)して正解率を保存する
④ モデルを一旦リセットし、データの組み合わせを変えて ①〜③ を10回繰り返す
・処理(3):結果の返却
10回分の正解率が入った配列(リスト)を `scores` として返します。
4. 関連して押さえたい「分割件数(135件と15件)の決定プロセス」
コード内に「135」や「15」という数字を明示的に書いていないにもかかわらず、なぜこの件数で分割されるのでしょうか?
これは、読み込んだIrisデータセットの全件数(150件)と、指定した分割数 `n_splits=10` から自動的に計算されています。
・検証用データ(15件):全データ 150件 ÷ n_splits=10 = 15件
・学習用データ(135件):残りのデータ(150件 − 15件)= 135件
データ件数と分割ルールを渡すだけで、scikit-learnが裏で自動的に「135件で学習、15件で検証」を実行してくれます。
5. 補足:実際のPythonコードと出力ログ
実際にPythonで実行するコードと、算出される結果の出力ログです。
可読性を高めるため、背景は明るいグレーで統一しています。
from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 1. データロード
X, y = load_iris(return_X_y=True)
# 2. 分割条件(10分割・層化・シャッフル)の定義
cv = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
# 3. 交差検証の実行
scores = cross_val_score(KNeighborsClassifier(n_neighbors=3), X, y, cv=cv)
print(f"10回の正解率: {scores}")
print(f"平均正解率: {scores.mean():.4f}")
# 出力ログのイメージ
10回の正解率: [1. 1. 0.9333 0.9333 0.9333 0.9333 1. 1. 0.9333 1. ]
平均正解率: 0.9667
6. まとめ
scikit-learnの `cross_val_score` を使うことで、面倒なデータの分割・学習・評価・モデルのリセットという10回分のループ処理を一発でスマートに完結させることができます。内部で「全データ数 ÷ 分割数」の計算が自動で行われている仕組みを理解しておくことで、データ数が変わっても適切に交差検証を使いこなせるようになります!