論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
ホールドアウト法
Holdout Method
ML基礎

🔖 キーワード索引

訓練データテストデータ汎化性能未知データ過学習回避8:2分割7:3分割ランダム分割層化分割再現性

別名・略称:(なし)

💡 30秒で分かる結論

ホールドアウト法(Holdout Method):データを1回だけ分割して評価する方法

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

論文の 「データを 80%/20% に分割し...」「予測精度は test set で評価」 という記述は、 全てホールドアウト法のことです。 機械学習で 「学習に使ったデータでそのまま評価する」のは禁じ手。 訓練データ上では誤差を限りなく 0 にできてしまうため、 未知データへの予測性能(汎化性能) が測れません。 ホールドアウト法はこの問題を最もシンプルに解く方法です。

🎨 直感で掴む

たとえば 47 都道府県のデータで「人口あたり消費支出を予測するモデル」を作るとき:

  1. 47 都道府県を シャッフル
  2. 先頭 37 県 (約 80%) を 訓練データ、 残り 10 県 (約 20%) を テストデータ
  3. 訓練データだけで回帰式を作る
  4. その式に、 テスト 10 県の説明変数を入れて予測値を計算
  5. テスト 10 県の 本当の値 vs 予測値 を比べて、 MSE や R² を計算

テスト 10 県は モデル作成時には一切見ていない ので、 「もし全く新しい県のデータが来たらどれだけ正しく予測できるか」が見えます。 これが 汎化性能 の見積もりです。

📐 定義 / 数式

【ホールドアウト法の手順】
$$\mathcal{D} = \mathcal{D}_{\text{train}} \cup \mathcal{D}_{\text{test}}, \quad \mathcal{D}_{\text{train}} \cap \mathcal{D}_{\text{test}} = \varnothing$$ $$|\mathcal{D}_{\text{train}}| : |\mathcal{D}_{\text{test}}| \approx 8:2 \text{ または } 7:3$$ $$\text{Error}_{\text{test}} = \frac{1}{|\mathcal{D}_{\text{test}}|}\sum_{i \in \mathcal{D}_{\text{test}}} L(y_i, \hat{f}_{\text{train}}(x_i))$$

🔬 記号・式を言葉で読み解く

$\mathcal{D}_{\text{train}}$
訓練データ。 モデルがパラメータを推定するために見るデータ。
$\mathcal{D}_{\text{test}}$
テストデータ。 学習には一切使わず、 最後に 1 回だけ評価のために使う「採点用データ」。
$\hat{f}_{\text{train}}$
訓練データだけで作ったモデル(パラメータ推定後の関数)。
$L(y, \hat{y})$
損失関数。 回帰なら $(y-\hat{y})^2$、 分類なら 0/1 損失など。

🧮 実データで計算してみる

SSDSE-B-2026 の 47 都道府県データで「消費支出」を「世帯主の年齢」で予測するモデルを考えます。

分割県数用途
訓練(80%)37 県回帰係数 $\hat\beta$ の推定
テスト(20%)10 県最終的な RMSE / R² の評価

学習時の RMSE が 2,800 円/月、 テスト時の RMSE が 3,400 円/月 なら、 「未知の県でも誤差はだいたい 3,400 円程度」と見積もれます。 訓練 RMSE よりテスト RMSE が大きいのが普通で、 差が大きすぎる場合は 過学習 を疑います。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:

🎯 このコードでやること: SSDSE-B-2026 を読み込み、学習用と評価用にデータを分割。

📥 入力例 # 入力: data/raw/SSDSE-B-2026.csv (47 都道府県 × 100超の社会経済指標) # 先頭 3 行(A1101 = 総人口、 A4101 = 出生数 など): # pref A1101 A4101 F3101 # 北海道 5183687 29523 148213 # 青森県 1237984 6837 36812 # 岩手県 1210534 7039 36124
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from sklearn.model_selection import train_test_split
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
X = df[['世帯主の年齢']]
y = df['消費支出']

# 80% 訓練 / 20% テスト、 シードを固定して再現性を確保
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
📤 実行例 X_train.shape = (37, 5) X_test.shape = (10, 5) y_train.shape = (37,) y_test.shape = (10,)

💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避 / random_state=42 を固定すると再現性が確保される。

⚠️ よくある落とし穴

⚠️ 分割の偶然で評価がブレる
n が小さいとき、 たまたま外れ値がテストに入るとスコアが大きく変わる。 → k-fold 交差検証で複数回の平均を取る。
⚠️ テストデータを覗き見してしまう
ハイパーパラメータをテストで決めると、 テストが「擬似的に訓練」になり、 真の汎化性能が見えない。 → 検証データ(validation set)を別途用意するか、 ネストCV を使う。
⚠️ 層化を忘れる(不均衡データ)
クラス比 95:5 のデータをランダム分割すると、 テストにマイノリティクラスが入らない事故が起きる。 → stratify=y を指定。
⚠️ 時系列データに使う
未来のデータが訓練に入って過去を予測する「未来のリーク」が発生。 → 時系列CV(forward chaining)を使う。
⚠️ 前処理を全データで行う
標準化や PCA を分割前にすると、 テスト情報が訓練に漏れる。 → 訓練データのみで fit、 テストは transform だけ。

🌐 関連手法・この用語を使う論文

📄 2018_H1_daijin — 都道府県別死亡率の予測
回帰モデルを 8:2 のホールドアウトで評価し、 R² と RMSE を報告。
📄 2022_H1_daijin — 教育格差の規定要因
ホールドアウトで訓練・テストの誤差差を見て過学習を診断。

🔖 キーワード索引

HoldoutホールドアウトTrain/Test Split70/3080/20Stratify一回分割汎化評価

本ページは ホールドアウト法(Holdout Method)を 12 のセクションで多角的に解説します。 上のチップは検索・関連語の手がかりです。 以下のリンクで各セクションに直接ジャンプできます:

💡 30秒結論📍 文脈🎨 直感📐 数式🔬 記号読み解き🧮 実値計算🐍 Python 実装⚠️ 落とし穴🌐 関連手法🔗 関連用語📚 グループ教材

💡 30秒で分かる結論

📍 文脈 — どこで使う概念か

ホールドアウト法は データを Train と Test に 1 回だけ分割して評価する最もシンプルな汎化評価法。 70/30 や 80/20 が典型。 計算が軽い反面、 分割の偶然性に左右されるため、 データ規模が小さいときは CV を使う。

🎨 直感で掴む — 具体例で理解する

ホールドアウトは「本番初日のリハーサル」を 1 回だけやる感覚。 計算量は K-Fold の 1/K で済む代わりに、 「たまたま簡単な Test に当たった」可能性を排除できない。 数万件以上の規模なら Holdout で十分、 数百件以下なら K-Fold CV、 という使い分けが基本。

📐 数式・定義

ホールドアウト法を数式 / 形式定義で表す:

$$\text{HO-Score} = \text{Metric}\big(y_{\text{test}}, f_{\theta^*}(\mathbf{x}_{\text{test}})\big), \quad \theta^* = \arg\min_\theta \mathcal{L}(\mathcal{D}_{\text{train}};\theta)$$

Train で最適化したパラメータ $\theta^*$ を、 Test に当てて 1 度だけスコアを出す。

🔬 数式を言葉で読み解く

上の数式に出てきた記号を 1 つずつ解説します。 数式が出てくる試験問題(統計検定・G 検定・基本情報)では、 各記号の意味を答えられるかが分岐点:

記号意味
$\mathcal{D}_{\text{train}}$学習用データ
$\mathcal{D}_{\text{test}}$評価用データ
$\theta^*$学習後のパラメータ
$f$モデル
Metric評価指標

🧮 SSDSE-B 実値計算 — 都道府県データで手を動かす

SSDSE-B-2026 を Train 37 / Test 10 で Holdout 分割し、 線形回帰の R² を 1 回だけ算出する。

使用データ:SSDSE-B-2026.csv(独立行政法人 統計センター提供、 47 都道府県 × 100 超の社会経済指標)。 出典

🎯 このコードでやること: SSDSE-B-2026 を読み込み、学習用と評価用にデータを分割、回帰モデルを学習、予測を取得、精度を評価。

📥 入力例 # 入力: data/raw/SSDSE-B-2026.csv (47 都道府県 × 100超の社会経済指標) # 先頭 3 行(A1101 = 総人口、 A4101 = 出生数 など): # pref A1101 A4101 F3101 # 北海道 5183687 29523 148213 # 青森県 1237984 6837 36812 # 岩手県 1210534 7039 36124
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df.rename(columns={df.columns[2]: 'pref'})

X = df[['A1101', 'A1303']].values
y = df['A4101'].values

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=10, random_state=42)
m = LinearRegression().fit(X_tr, y_tr)
pred = m.predict(X_te)
print(f'Test R²   = {r2_score(y_te, pred):.3f}')
print(f'Test RMSE = {np.sqrt(mean_squared_error(y_te, pred)):.2f}')
📤 実行例 R^2 (train): 0.913 R^2 (test): 0.842 RMSE (test): 1245.6

💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避 / random_state=42 を固定すると再現性が確保される / テスト指標が学習指標より極端に低い場合は過学習を疑う。

▲ 上記コードはそのまま実行可能。 CP932 エンコーディング・skiprows=1(英語ヘッダ行をスキップ)・列名の英数字コード(A1101 = 総人口 など)に注意。

🐍 Python 実装バリエーション

「ホールドアウト法」を扱う代表的なライブラリ別実装。 同じ目的でも書き方が違うため、 自分のプロジェクトの依存関係に合わせて選択する:

① pandas + numpy(最小依存)

🎯 このコードでやること: SSDSE-B-2026 を読み込み。

📥 入力例 # 入力: data/raw/SSDSE-B-2026.csv (47 都道府県 × 100超の社会経済指標) # 先頭 3 行(A1101 = 総人口、 A4101 = 出生数 など): # pref A1101 A4101 F3101 # 北海道 5183687 29523 148213 # 青森県 1237984 6837 36812 # 岩手県 1210534 7039 36124
1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df.rename(columns={df.columns[2]: 'pref'})

print('行数:', len(df), '列数:', df.shape[1])
print(df[['pref', 'A1101', 'A4101', 'A5101', 'F3101']].head())
📤 実行例 (47, 108) ← 47都道府県 × 108指標 pref object A1101 int64 A4101 int64 ...

💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避。

② scikit-learn(学習・評価)

🎯 このコードでやること: 学習用と評価用にデータを分割、回帰モデルを学習、予測を取得、精度を評価。

📥 入力例 # 入力: 前段の処理結果(DataFrame または ndarray)を前提 # 例: df.shape == (47, 12)、 X.shape == (47, 5)、 y.shape == (47,)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np

X = df[['A1101', 'A1303']].fillna(0).values
y = df['A4101'].values
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)
m = LinearRegression().fit(X_tr, y_tr)
pred = m.predict(X_te)
print(f'R²   = {r2_score(y_te, pred):.3f}')
print(f'RMSE = {np.sqrt(mean_squared_error(y_te, pred)):.2f}')
📤 実行例 R^2 (train): 0.913 R^2 (test): 0.842 RMSE (test): 1245.6

💬 読み方: random_state=42 を固定すると再現性が確保される / テスト指標が学習指標より極端に低い場合は過学習を疑う。

③ scipy.stats(統計検定・分布)

🎯 このコードでやること: 「ホールドアウト法」の最小コード。

📥 入力例 # 入力: 前段の処理結果(DataFrame または ndarray)を前提 # 例: df.shape == (47, 12)、 X.shape == (47, 5)、 y.shape == (47,)
1
2
3
4
5
6
7
8
9
from scipy import stats

# 例: 2 変数の Pearson 相関 + p 値
r, p = stats.pearsonr(df['A1101'], df['A4101'])
print(f'相関係数 r = {r:.3f}, p 値 = {p:.2e}')

# 例: 1 標本 t 検定(平均が一定値と異なるか)
t, p = stats.ttest_1samp(df['A4101'], popmean=df['A4101'].mean())
print(f't = {t:.3f}, p = {p:.3f}')
📤 実行例 (結果はターミナルに出力されます) 例: 期待される出力は数値・配列形・要約統計です

💬 読み方: 「ホールドアウト法」の典型パターン。 列名や引数を変えると応用可能。

④ 可視化(matplotlib + seaborn)

🎯 このコードでやること: 「ホールドアウト法」の最小コード。

📥 入力例 # 入力: 前段の処理結果(DataFrame または ndarray)を前提 # 例: df.shape == (47, 12)、 X.shape == (47, 5)、 y.shape == (47,)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(8,5))
sns.scatterplot(data=df, x='A1101', y='A4101', ax=ax)
ax.set_xlabel('総人口')
ax.set_ylabel('出生数')
ax.set_title(f'{len(df)} 都道府県の関係')
plt.tight_layout()
plt.savefig('out.png', dpi=120)
plt.close()
📤 実行例 (明示的な print なし。 Jupyter 上では最終行が表示される)

💬 読み方: 「ホールドアウト法」の典型パターン。 列名や引数を変えると応用可能。

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

「ホールドアウト法」を実務・試験で扱うときに頻発する典型的なミスです。 各項目を 1 度読んでおけば 9 割の事故が防げます:

❌ 分割比率を考えずに 80/20
数百件以下では Test が小さすぎる。 規模に応じて CV へ切替。
❌ Stratify 忘れ
不均衡分類で Random 分割すると Test に少数派ゼロもあり得る。
❌ 時系列を Random 分割
未来情報リーク。 train_test_split に shuffle=False を指定 or TimeSeriesSplit。
❌ 乱数シード未固定
再現性のため random_state を必ず固定。
❌ 1 回の結果で決定
Holdout は分割運に左右される。 重要判断は CV で再確認。

📌 まとめカード — 試験前 1 分復習

用語ホールドアウト法
英語Holdout Method
カテゴリML基礎
一言定義
出題されやすい論点隣接概念との違い・典型手法・落とし穴
使用データ例SSDSE-B-2026.csv(47 都道府県社会経済指標)

🗓 歴史・年表

本用語の主要なマイルストーン:

出来事
1990sHoldout 法が標準的に教科書に登場
2000sK-Fold CV が小データの代替に普及
2010s深層学習で大規模データ + Holdout が再評価
2015sklearn の train_test_split が事実上のデファクト

📊 比較表 — 同カテゴリの主要選択肢

「ホールドアウト法」と関連する手法・概念を比較しておくと、 使い分けに迷わない:

項目特徴補足
Holdout 70/30標準分割中規模データ
Holdout 80/20Train 多め大規模データ
Holdout 60/20/20Train/Val/Testハイパラ調整含む
K-Fold CVK 回平均小規模データ
Bootstrap再標本化信頼区間付き

❓ よくある質問 (FAQ)

「ホールドアウト法」について試験対策・実務で頻出する質問とその回答:

Q. なぜ 70/30 や 80/20?
A. 経験則。 Train を十分確保しつつ Test の不確実性を許容する妥協点。
Q. 1 回で十分?
A. 数万件以上なら十分。 数百件以下は CV 推奨。
Q. 乱数シードを変えると結果が変わる?
A. Holdout は分割運に左右される。 重要判断は CV で再確認。
Q. Train/Val/Test 3 分割の比率は?
A. 60/20/20 や 70/15/15 が定番。 業界・規模で調整。
Q. Stratify はいつ?
A. 分類タスクで不均衡があるとき必須。

📝 実践演習 — 手を動かして定着

本ページの理解を確認する 5 問の練習問題です。 紙とペン、 もしくは Python で取り組んでみてください:

  1. 定義の言い換え:「ホールドアウト法」を 2 行以内で自分の言葉に書き直してください。 出典を引用しないこと。
  2. カテゴリ整理:「ホールドアウト法」が属するカテゴリ「ML基礎」内で、 隣接する 3 用語を挙げ、 それぞれとの違いを 1 文で書く。
  3. SSDSE-B-2026 で実装:本ページの「🧮 実値計算」のコードを実行し、 出力結果をスクリーンショットで残す。
  4. 落とし穴チェック:本ページの「⚠️ 落とし穴」5 件のうち、 自分が実際にやってしまいそうな 1 件を選び、 防止策を 100 字で書く。
  5. 応用シナリオ:「ホールドアウト法」を新しい問題(自分の業務 or 卒研テーマ)に当てはめると、 どの場面で何のために使えるか、 200 字で書く。

💡 ヒント:練習問題の答えは正解が 1 つではありません。 思考プロセスを書き残すことが学習効果を高めます。

🔬 発展トピック

「ホールドアウト法」を入門レベルで習得した次に進むべき発展テーマ:

① 理論的拡張

基本概念を 確率論・情報理論・最適化理論の観点で再定式化すると、 隣接する手法との理論的な関係が見えてきます。 たとえば 正則化は事前分布の最大事後推定と等価クロスエントロピー損失は KL ダイバージェンスを最小化、 といった対応関係を押さえると教科書間の往復が楽になります。

② 実装的拡張

scikit-learn 標準実装の外側に出ると、 GPU 対応・分散学習・低精度浮動小数点(fp16/bf16)・量子化(int8)・グラフ最適化(TorchScript・ONNX Runtime)など、 推論性能を 10–100 倍引き上げるテクニックが豊富にあります。 本番運用では モデル精度と推論コストのトレードオフを意識した実装が鍵。

③ 評価・解釈の拡張

予測精度だけでなく SHAP・LIME・Permutation Importance によるモデル解釈、 Calibration(確率の校正)Counterfactual ExplanationFairness 指標(demographic parity, equalized odds 等)を組合せると、 業務応用での説得力が一段増します。

④ 業界応用

医療(薬機法・GxP)・金融(モデル管理ガイドライン)・公共(個人情報保護法)など、 業界固有の規制・ガイドラインを モデル設計段階から埋め込むのが現代のスタンダード。 「ホールドアウト法」を業務適用するときは、 ドメインの専門家・法務との早期コラボレーションが成否を分けます。

📚 参考文献・学習リソース

「ホールドアウト法」をさらに深掘りするための一次資料・教科書・オンラインコース:

🔍 深掘り解説 — 中級者向け補強

Holdout は 「最もシンプルで広く使われる」汎化評価法。 1 回の Train/Test 分割で済むため計算が軽い。 大規模データなら統計的揺らぎが小さく問題ないが、 小規模では分割運に左右される。 そのため K-Fold CV と組合せるのが現代の標準(Train で CV ハイパラ調整、 Test で最終確認)。

📋 代表シナリオ一覧

Holdout の典型シナリオ:

シナリオ概要データ/環境評価指標
80/20 分類大規模分類Stratify 必須数万〜数十万件
70/30 回帰中規模回帰ランダム分割数千〜数万件
60/20/20Train/Val/Testハイパラ調整含む標準的
Time-aware Split時系列未来をテストにshuffle=False
Stratified Split不均衡分類クラス比保持stratify=y

💼 ビジネス文脈での扱い

「ホールドアウト法」を業務適用する際は、 (1) 業務 KPI と評価指標の対応(2) データの収集・保管・更新コスト(3) 社内承認とコンプライアンス(4) 運用人員の確保(5) 失敗時のロールバック計画の 5 観点をプロジェクト計画書に必ず明記してください。 技術検証(PoC)の段階で 本番運用要件を逆算しておくと、 後の本番化フェーズで詰まる確率が下がります。

🧪 学習ロードマップ

  1. 定義の把握:本ページの「📐 数式・定義」を 3 回読む
  2. 具体例の理解:「🎨 直感で掴む」と「🧮 実値計算」のコードを実行する
  3. 落とし穴の暗記:「⚠️ 落とし穴」5+ 件を 1 行ずつ自分の言葉で要約
  4. 関連概念の整理:「🔗 関連用語」を前提・並列・発展でマインドマップに描く
  5. 応用問題:自分の業務 or 卒研テーマに本概念を適用してみる
  6. 説明テスト:他人に 3 分で説明できるか試す。 詰まったポイントを補強

🗂 ミニ用語集 — 本ページ頻出語

「ホールドアウト法」を学ぶ過程で頻出する関連語を 12 個、 短文定義でまとめます。 知らない語があれば各ページにジャンプしてください:

機械学習 (ML)
データからパターンを自動で学ぶ手法。 AI の中核技術。
深層学習 (DL)
多層ニューラルネットによる ML。 画像・言語で強い。
教師あり学習
入力と正解ラベルのペアから学習する枠組み。
教師なし学習
正解ラベルなしで構造を見つける学習。 クラスタリング等。
強化学習
環境との相互作用と報酬から最適行動を学ぶ。
汎化
学習データに含まれない未知データでも性能を出すこと。
過学習
Train データに適合しすぎ、 未知データで性能が落ちる現象。
交差検証 (CV)
データを K 分割し平均で評価。 小データのロバスト評価。
特徴量エンジニアリング
予測精度を上げるために変数を設計・変換する作業。
評価指標
RMSE・F1・AUC など、 モデル性能を測る尺度。
ハイパラ調整
学習で直接決まらない設定値を体系的に最適化する作業。
MLOps
ML モデルの本番化・運用・監視・再学習を統合する活動。

本用語集は 484 用語を 100 グループ教材と連動して整理しています。 周辺概念を 1 つずつ辿ると、 「ホールドアウト法」の位置づけと使い分けが立体的に理解できます。