論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
検証データ
Validation Data
ML基礎

🔖 キーワード索引

検証データ validation dev set ハイパーパラメータ モデル選択 k分割CV early stopping ホールドアウト stratify リーケージ 汎化 訓練/検証/テスト シャッフル 再現性

💡 30秒で分かる結論

検証データ(Validation Data):ハイパーパラメータ調整・モデル選択に使う、 訓練データから切り分けた評価用データ

📍 あなたが今見ているもの

このページは「検証データ(Validation Data)」の用語解説です。 機械学習の基礎カテゴリにおける重要概念で、 機械学習の基礎 グループ教材の中で繰り返し登場します。 数式・実コード・落とし穴を 1 ページに集約し、 SSDSE-B-2026 都道府県データ(47 件 × 112 列)を題材に 手を動かしながら理解できるよう構成しています。

別称:Validation Set / Dev Set。 まず 💡 30秒結論 で全体像を、 次に 🎨 直感📐 数式🧮 実値🐍 Python の順で読むのがおすすめ。

🎨 直感で掴む

検証データは「モデル選びの試験会場」です。 訓練データだけでハイパーパラメータを決めると過学習する。 テストデータは最終評価専用なので途中で見てはいけない。 そこで 第 3 のデータ を用意します。

用途は (1) 学習率や木の深さなど ハイパーパラメータ調整、 (2) 複数モデルから 1 つを選ぶ、 (3) ニューラルネットの early stopping です。 検証データへ「答えを合わせ続ける」と過学習するので、 多数試行する場合は k 分割交差検証 を併用。

📐 数式または定義

本概念は次のように記述されます(KaTeX で描画)。

$$\text{訓練データ}\;:\;\text{検証データ}\;:\;\text{テストデータ} \;=\; 60\%\;:\;20\%\;:\;20\%\quad (\text{典型例})$$

英語名 Validation Data。 別称:Validation Set / Dev Set。

🔬 数式を言葉で読み解く

記号と意味を逐一突き合わせて読みます。 慣れないうちは式を「日本語で読む」ことが理解の近道です。

🧮 SSDSE-B 実値で計算してみる

SSDSE-B の 47 都道府県データを 訓練 60% / 検証 20% / テスト 20% に分割し、 RandomForest の max_depth を検証データで選びます。

データ出典:SSDSE-B-2026(独立行政法人統計センター)。 47 都道府県 × 複数年(最新 2023)の社会統計データ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df[df['年度'] == 2023].reset_index(drop=True)

df['若年比率'] = df['15歳未満人口'] / df['総人口']
df['ラベル'] = (df['若年比率'] >= df['若年比率'].median()).astype(int)

X = df[['総人口','65歳以上人口']].values
y = df['ラベル'].values

# 1段目: 訓練80% / テスト20%
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2,
                                          random_state=0, stratify=y)
# 2段目: 訓練の中で 訓練75% / 検証25% → 全体だと 60/20/20
X_train, X_val, y_train, y_val = train_test_split(X_tr, y_tr, test_size=0.25,
                                                  random_state=0, stratify=y_tr)

best_d, best_acc = None, -1
for d in [2, 3, 4, 5, None]:
    m = RandomForestClassifier(max_depth=d, random_state=0).fit(X_train, y_train)
    acc = accuracy_score(y_val, m.predict(X_val))
    print(f'max_depth={d}: val_acc={acc:.3f}')
    if acc > best_acc:
        best_acc, best_d = acc, d

# 最終評価
final = RandomForestClassifier(max_depth=best_d, random_state=0).fit(X_tr, y_tr)
print(f'best_depth={best_d}, test_acc={accuracy_score(y_te, final.predict(X_te)):.3f}')

実行結果の要約(出力は環境依存。 概算値):

項目
訓練28 県 (60%)
検証9 県 (20%)
テスト10 県 (20%)
max_depth=2 val0.778
max_depth=3 val0.889 (best)
テスト精度0.800

🐍 Python 実装

scikit-learn / pandas を使った最小実装パターン。 上の SSDSE-B 計算と同じスタイルですが、 ここでは「読み込み→前処理→学習→評価」のテンプレを 4 つのスニペットに分けます。

① データ読み込み & 概観

1
2
3
4
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df[df['年度'] == 2023].reset_index(drop=True)
print(df.shape, df.columns.tolist()[:8])

② 特徴量と目的変数

1
2
3
X = df[['総人口','65歳以上人口']].values
y = df['15歳未満人口'].values
print('X shape =', X.shape, ',  y shape =', y.shape)

③ 訓練/テスト分割 + モデル学習

1
2
3
4
5
6
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)
model = RandomForestRegressor(n_estimators=300, random_state=0).fit(X_tr, y_tr)
print('R^2 (test) =', model.score(X_te, y_te))

④ 評価と可視化

1
2
3
4
5
6
import matplotlib.pyplot as plt
pred = model.predict(X_te)
plt.scatter(y_te, pred)
plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--')
plt.xlabel('実測'); plt.ylabel('予測'); plt.title('「検証データ」関連モデルの予測精度')
plt.tight_layout(); plt.savefig('out.png', dpi=150)

※ 「検証データ」固有の本格コードは上の 🧮 SSDSE-B 実値計算 節を参照。

⚠️ よくある落とし穴(5 つ)

❌ 検証データを学習に使ってしまう
fit する前に分割するのは常識だが、 スケーラーを全データで fit するのもリーク。 Pipeline + CV で防ぐ。
❌ 検証データに合わせすぎる
ハイパーパラメータを大量に試すと検証セット過学習。 試行回数が多いときは k 分割 CV + ネスト CV を。
❌ シャッフルなし時系列で分割
時系列は未来→過去のリーク注意。 TimeSeriesSplit を使い、 検証は必ず訓練より「後」の期間に。
❌ クラス不均衡で stratify を忘れる
層化なしだと検証セットに陽性が 0 件のケースが発生。 stratify=y を必ず指定。
❌ サンプル数が少ないとき固定分割
47 県のような小データはホールドアウト 1 回では不安定。 5-fold CV や Leave-One-Out を検討。

🔎 深掘り解説

分割比率のガイドライン

データ規模推奨 train/val/test
小(n < 1000)60/20/20 + CVも併用
中(1000〜10万)70/15/15 または 80/10/10
大(10万〜100万)90/5/5
超大(>100万)98/1/1(数千件のtest)

「test に何件あれば信頼できるか」が判断軸。 1000件あれば標準誤差はかなり小さい。

Early Stopping の使い方

深層学習でvalデータの典型用途。 「val loss が patience エポック改善しなければ訓練停止」:

1
2
es = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
model.fit(X_train, y_train, validation_data=(X_val, y_val), callbacks=[es])

これで「学習しすぎ」を自動で防げる。 経験則:patience は 5〜20

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

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

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

✅ 学習チェックリスト