はじめに
これまでの記事では、様々な機械学習モデルの実装方法と、過学習を防ぐための正則化について学んできました。
本記事では、モデルの性能をさらに高めるためのテクニックである「クロスバリデーション(Cross Validation)」と「グリッドサーチ(GridSearchCV)」を紹介します。
これらは、ハイパーパラメータを最適化しつつ、汎化性能の高いモデルを作るための重要な方法です。
クロスバリデーションとは?
基本の考え方
クロスバリデーションとは、データを複数の分割パターンで学習・評価することで、モデルの汎化性能(未知データへの対応力)をより正確に見積もる方法です。
K分割交差検証(K-Fold CV)
- データをK個に分割し、K回にわたって学習と評価を繰り返す
- 各回で1つを検証用(バリデーション)、残りを訓練用に使う
- 最終的に各回のスコアの平均を取る
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Ridge
from sklearn.datasets import load_diabetes
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import numpy as np
# データ準備
X, y = load_diabetes(return_X_y=True)
# パイプラインで標準化 + モデル構築
model = make_pipeline(StandardScaler(), Ridge(alpha=1.0))
# クロスバリデーション(5分割)
scores = cross_val_score(model, X, y, cv=5, scoring='r2')
print("各foldのR²スコア:", scores)
print("平均スコア:", np.mean(scores))グリッドサーチ(GridSearchCV)とは?
基本の考え方
グリッドサーチとは、あらかじめ指定した複数のハイパーパラメータの組み合わせを全て試し、その中で最も性能の高い組み合わせを選ぶ方法です。
クロスバリデーションと組み合わせることで、過学習を防ぎながら最適なモデルを選ぶことができます。
実装:グリッドサーチ + クロスバリデーション
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# パイプライン構築
pipeline = Pipeline([
('scaler', StandardScaler()),
('ridge', Ridge())
])
# 探索するパラメータ(リッジのalpha)
param_grid = {
'ridge__alpha': [0.01, 0.1, 1, 10, 100]
}
# グリッドサーチ + クロスバリデーション(5分割)
gs = GridSearchCV(pipeline, param_grid, cv=5, scoring='r2')
gs.fit(X, y)
print("ベストパラメータ:", gs.best_params_)
print("ベストスコア(平均R²):", gs.best_score_)なぜパイプラインを使うのか?
- データ前処理(標準化など)とモデルを一体化することで、CVの各foldでデータ漏洩を防げる
- 処理が再現可能で、コードが整理される
おわりに
クロスバリデーションは、モデルの信頼性を高める評価手法であり、グリッドサーチはその上でハイパーパラメータを最適化するための強力な手段です。
この2つを組み合わせることで、機械学習モデルの精度と汎化性能を両立させることができます。
次回は、評価指標や混同行列など、分類問題での性能の正しい読み取り方について学びます。
練習問題
Q1. クロスバリデーションの目的は何ですか?
- A. 訓練データのサイズを増やすこと
- B. ハイパーパラメータをランダムに決めること
- C. モデルの汎化性能を安定して評価すること
Q2. グリッドサーチはどのような処理を行う?
- A. データの並び順を変える
- B. パラメータのすべての組み合わせを試す
- C. 学習済みモデルの可視化を行う
Q3. パイプラインを使うメリットは?
- A. データ漏洩を防ぎ、処理を統一できる
- B. 訓練時間を短縮できる
- C. データをシャッフルするため
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント