論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
交差検証
Cross-Validation
ML基礎
別称: CV

🔖 キーワード索引

CVk-fold評価過学習汎化性能sklearn

💡 30秒で分かる結論

交差検証 ── データを複数回分割して評価する手法

📍 文脈 ── どこで出会うか

「精度95%でした」と言うとき、 1回のtrain/testだけだと運次第。 CVは「複数回試して平均」する保険です。 競技でも論文でも、 評価の信頼性は CV で担保するのが標準。

🎨 直感で掴む

「テスト勉強」に例えるなら:

図:5-fold CV の模式図。 5回の試行で各サンプルが必ず1回ずつテスト側に回る。

📐 定義/数式

【k-fold CV のスコア推定】
$$\text{CV score} = \frac{1}{k}\sum_{i=1}^{k} \text{Score}(f_i, D_{\text{test},i})$$
$f_i$ は fold $i$ の学習モデル、 $D_{\text{test},i}$ は fold $i$ のテストデータ

標準誤差も算出できる:$SE = \sigma_{\text{folds}} / \sqrt{k}$。 これで信頼区間付きで「精度 = $0.85 \pm 0.02$」と報告可能。

🔬 記号を読み解く

k
分割数。 慣例は 5 or 10。 多いほど分散減・計算重
Stratified
分類で各fold内のクラス比率を揃える。 不均衡データで必須
Repeated k-fold
k-fold を複数回ランダム分割でくり返し平均
Nested CV
外側でモデル評価、 内側でハイパーパラメータ選択。 「調整時の漏洩」を防ぐ

🧮 実値で計算してみる

47都道府県データを 5-fold で分割すると:

1回だけ test=北海道〜青森とランダムに引いて R²=0.85 が出るより、 はるかに信頼性が高い数値です。

🐍 Python 実装

最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。

1
2
3
4
5
6
7
8
from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import Ridge

kf = KFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(Ridge(alpha=1.0), X, y, cv=kf, scoring='r2')
print(f"R² = {scores.mean():.3f} ± {scores.std():.3f}")
# 5つの fold それぞれの R² を確認
print(scores)

⚠️ よくある落とし穴

❌ 1. ハイパラ調整と評価を同じCVで実施
CVスコアでチューニング → そのCVスコアを報告、 は楽観バイアス。 Nested CVへ
❌ 2. 時系列でshuffleしてCV
未来→過去の漏洩。 TimeSeriesSplitを使う
❌ 3. クラス不均衡でStratifiedにしない
foldによって少数クラスが0個になる事故
❌ 4. 前処理をCVの外で実施
fit済みのscalerが全データの情報を持つ。 Pipelineで包む
❌ 5. k=2のような少なすぎる分割
推定分散が大きい。 5〜10が標準

📚 関連グループ教材

この用語の全体像を学ぶには、 横断的な教材で文脈を掴むのが効率的です。

🔎 深掘り解説

主要なCV変種一覧

名前用途分割方法
KFold標準ランダムにk分割
StratifiedKFold分類(不均衡)クラス比率を保つ
GroupKFold群あり同一群を同foldへ
TimeSeriesSplit時系列過去→未来の順序
LeaveOneOut少数データ1サンプルずつテスト
RepeatedKFold低分散評価k-foldをr回繰り返し
ShuffleSplit柔軟分割毎回ランダム分割

Nested CV:「評価」と「調整」の正しい分離

ハイパラ調整したCVスコアをそのまま報告すると楽観バイアス。 Nested CV では外側で評価、 内側で調整:

1
2
3
4
5
6
7
from sklearn.model_selection import cross_val_score, GridSearchCV, KFold

inner = KFold(n_splits=3)
outer = KFold(n_splits=5)
grid  = GridSearchCV(estimator, param_grid, cv=inner)
scores = cross_val_score(grid, X, y, cv=outer)
print(scores.mean(), scores.std())

外側5fold × 内側3fold = 15回学習。 計算重いが評価信頼性が桁違いに上がる。

k の選び方

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)

🔎 深掘り解説

主要なCV変種一覧

名前用途分割方法
KFold標準ランダムにk分割
StratifiedKFold分類(不均衡)クラス比率を保つ
GroupKFold群あり同一群を同foldへ
TimeSeriesSplit時系列過去→未来の順序
LeaveOneOut少数データ1サンプルずつテスト
RepeatedKFold低分散評価k-foldをr回繰り返し
ShuffleSplit柔軟分割毎回ランダム分割

Nested CV:「評価」と「調整」の正しい分離

ハイパラ調整したCVスコアをそのまま報告すると楽観バイアス。 Nested CV では外側で評価、 内側で調整:

1
2
3
4
5
6
7
from sklearn.model_selection import cross_val_score, GridSearchCV, KFold

inner = KFold(n_splits=3)
outer = KFold(n_splits=5)
grid  = GridSearchCV(estimator, param_grid, cv=inner)
scores = cross_val_score(grid, X, y, cv=outer)
print(scores.mean(), scores.std())

外側5fold × 内側3fold = 15回学習。 計算重いが評価信頼性が桁違いに上がる。

k の選び方

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)