交差検証(クロスバリデーション)の使い方【実務での活用方法】

交差検証(クロスバリデーション)の使い方【実務での活用方法】 AIツール・レビュー

はじめに

機械学習を勉強していると「交差検証(クロスバリデーション)」という言葉に必ず出会います。「なんとなく使ってはいるけど、なぜ必要なのかよくわかっていない」という方も多いと思います。

僕自身、最初は「train_test_splitで分ければいいんじゃないか」と思っていました。でも実際にSignateのコンペで痛い目を見てから、交差検証の重要性を身をもって理解しました。この記事では、その経験も交えながら交差検証をわかりやすく解説します。

交差検証とは何か

交差検証とは、機械学習モデルの汎化性能(未知データへの予測精度)を正しく評価するための手法です。

通常のtrain_test_splitでは、データを一度だけ「学習用」と「テスト用」に分けます。しかしこの方法には問題があります。分け方によって評価結果が大きくブレてしまうのです。たまたま「簡単なテストデータ」に当たれば精度が高く出ますし、「難しいデータ」に当たれば低く出てしまいます。

交差検証はこの問題を解決するために、データを複数の組み合わせで分割し、評価を平均化します。

k分割交差検証(k-Fold)の仕組み

最もよく使われるのがk分割交差検証です。仕組みはシンプルです。

例えばk=5の場合、データを5つのグループ(Fold)に分けます。そして「4つで学習・1つでテスト」という操作を、テスト用のFoldをずらしながら5回繰り返します。最後に5回分のスコアを平均したものが最終的な評価値になります。

これによって全データが一度はテストに使われるため、評価の安定性が大きく向上します。

Pythonでの実装方法

scikit-learnを使えば数行で実装できます。

from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
import numpy as np

# データ準備(例)
X, y = ...  # 特徴量と目的変数

# モデル
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 5分割交差検証
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')

print(f"各Foldのスコア: {scores}")
print(f"平均スコア: {scores.mean():.3f} ± {scores.std():.3f}")

出力される「平均スコア ± 標準偏差」が重要です。標準偏差が大きい場合、モデルが不安定で過学習の可能性があります。

層化k分割交差検証(Stratified k-Fold)

分類問題でクラスのデータ数に偏りがある場合(例:陽性10%・陰性90%のような不均衡データ)は、通常のk-Foldではうまく機能しないことがあります。

そこで使うのが層化k分割交差検証です。各Foldでクラスの比率が元データと同じになるように分割してくれます。

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf, scoring='roc_auc')

print(f"AUC平均: {scores.mean():.3f}")

不均衡データを扱う際は、StratifiedKFoldを使うのが基本です。

時系列データへの注意点

時系列データには通常のk-Foldは使えません。未来のデータが学習に混入してしまう「データリーク」が発生するからです。

時系列の場合はTimeSeriesSplitを使います。

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

TimeSeriesSplitでは、常に過去→未来の順序を保ちながら分割されます。製造業のセンサーデータや売上データを扱う場合は必ずこちらを使いましょう。

交差検証をハイパーパラメータ探索と組み合わせる

交差検証の強力な使い方のひとつが、GridSearchCVとの組み合わせです。ハイパーパラメータの候補を自動で探索しながら、交差検証で評価してくれます。

from sklearn.model_selection import GridSearchCV

param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 10]
}

grid_search = GridSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid,
    cv=5,
    scoring='accuracy'
)
grid_search.fit(X_train, y_train)

print(f"最良パラメータ: {grid_search.best_params_}")
print(f"最良スコア: {grid_search.best_score_:.3f}")

まとめ

交差検証のポイントを整理します。

  • train_test_splitだけでは評価が不安定になる
  • k-Foldは全データを一度テストに使えるため評価が安定する
  • 不均衡データにはStratifiedKFoldを使う
  • 時系列データにはTimeSeriesSplitを使う
  • GridSearchCVと組み合わせることでハイパーパラメータ探索も自動化できる

最初は面倒に感じるかもしれませんが、交差検証を習慣にするだけでモデルの評価精度が大きく上がります。コンペでも実務でも必須の手法なので、ぜひ身につけておいてください。

💼 ITエンジニア転職特化

自分らしく働けるエンジニア転職を目指すなら【strategy career】

年収1000万・残業月30時間以下・リモート可の求人多数

💼 無料で転職相談する →

※アフィリエイト広告を含みます

※本記事にはアフィリエイトリンクが含まれます。

コメント

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