別名・略称:(なし)
ホールドアウト法(Holdout Method):データを1回だけ分割して評価する方法
訓練 : テスト の 2 つにスパっと分割し、 訓練で学んだモデルをテストで 1 回だけ評価 する基本手法。random_state=42 など 乱数シード固定 必須。たとえば 47 都道府県のデータで「人口あたり消費支出を予測するモデル」を作るとき:
テスト 10 県は モデル作成時には一切見ていない ので、 「もし全く新しい県のデータが来たらどれだけ正しく予測できるか」が見えます。 これが 汎化性能 の見積もりです。
SSDSE-B-2026 の 47 都道府県データで「消費支出」を「世帯主の年齢」で予測するモデルを考えます。
| 分割 | 県数 | 用途 |
|---|---|---|
| 訓練(80%) | 37 県 | 回帰係数 $\hat\beta$ の推定 |
| テスト(20%) | 10 県 | 最終的な RMSE / R² の評価 |
学習時の RMSE が 2,800 円/月、 テスト時の RMSE が 3,400 円/月 なら、 「未知の県でも誤差はだいたい 3,400 円程度」と見積もれます。 訓練 RMSE よりテスト RMSE が大きいのが普通で、 差が大きすぎる場合は 過学習 を疑います。
SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:
🎯 このコードでやること: SSDSE-B-2026 を読み込み、学習用と評価用にデータを分割。
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) |
💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避 / random_state=42 を固定すると再現性が確保される。
stratify=y を指定。fit、 テストは transform だけ。本ページは ホールドアウト法(Holdout Method)を 12 のセクションで多角的に解説します。 上のチップは検索・関連語の手がかりです。 以下のリンクで各セクションに直接ジャンプできます:
ホールドアウト法は データを Train と Test に 1 回だけ分割して評価する最もシンプルな汎化評価法。 70/30 や 80/20 が典型。 計算が軽い反面、 分割の偶然性に左右されるため、 データ規模が小さいときは CV を使う。
ホールドアウトは「本番初日のリハーサル」を 1 回だけやる感覚。 計算量は K-Fold の 1/K で済む代わりに、 「たまたま簡単な Test に当たった」可能性を排除できない。 数万件以上の規模なら Holdout で十分、 数百件以下なら K-Fold CV、 という使い分けが基本。
ホールドアウト法を数式 / 形式定義で表す:
Train で最適化したパラメータ $\theta^*$ を、 Test に当てて 1 度だけスコアを出す。
上の数式に出てきた記号を 1 つずつ解説します。 数式が出てくる試験問題(統計検定・G 検定・基本情報)では、 各記号の意味を答えられるかが分岐点:
| 記号 | 意味 |
|---|---|
| $\mathcal{D}_{\text{train}}$ | 学習用データ |
| $\mathcal{D}_{\text{test}}$ | 評価用データ |
| $\theta^*$ | 学習後のパラメータ |
| $f$ | モデル |
| Metric | 評価指標 |
SSDSE-B-2026 を Train 37 / Test 10 で Holdout 分割し、 線形回帰の R² を 1 回だけ算出する。
使用データ:SSDSE-B-2026.csv(独立行政法人 統計センター提供、 47 都道府県 × 100 超の社会経済指標)。 出典
🎯 このコードでやること: SSDSE-B-2026 を読み込み、学習用と評価用にデータを分割、回帰モデルを学習、予測を取得、精度を評価。
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}') |
💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避 / random_state=42 を固定すると再現性が確保される / テスト指標が学習指標より極端に低い場合は過学習を疑う。
▲ 上記コードはそのまま実行可能。 CP932 エンコーディング・skiprows=1(英語ヘッダ行をスキップ)・列名の英数字コード(A1101 = 総人口 など)に注意。
「ホールドアウト法」を扱う代表的なライブラリ別実装。 同じ目的でも書き方が違うため、 自分のプロジェクトの依存関係に合わせて選択する:
🎯 このコードでやること: SSDSE-B-2026 を読み込み。
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()) |
💬 読み方: skiprows=1 で英語ヘッダ行を飛ばし、 encoding='cp932' で文字化けを回避。
🎯 このコードでやること: 学習用と評価用にデータを分割、回帰モデルを学習、予測を取得、精度を評価。
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}') |
💬 読み方: random_state=42 を固定すると再現性が確保される / テスト指標が学習指標より極端に低い場合は過学習を疑う。
🎯 このコードでやること: 「ホールドアウト法」の最小コード。
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}') |
💬 読み方: 「ホールドアウト法」の典型パターン。 列名や引数を変えると応用可能。
🎯 このコードでやること: 「ホールドアウト法」の最小コード。
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() |
💬 読み方: 「ホールドアウト法」の典型パターン。 列名や引数を変えると応用可能。
「ホールドアウト法」を実務・試験で扱うときに頻発する典型的なミスです。 各項目を 1 度読んでおけば 9 割の事故が防げます:
| 用語 | ホールドアウト法 |
| 英語 | Holdout Method |
| カテゴリ | ML基礎 |
| 一言定義 | |
| 出題されやすい論点 | 隣接概念との違い・典型手法・落とし穴 |
| 使用データ例 | SSDSE-B-2026.csv(47 都道府県社会経済指標) |
本用語の主要なマイルストーン:
| 年 | 出来事 |
|---|---|
| 1990s | Holdout 法が標準的に教科書に登場 |
| 2000s | K-Fold CV が小データの代替に普及 |
| 2010s | 深層学習で大規模データ + Holdout が再評価 |
| 2015 | sklearn の train_test_split が事実上のデファクト |
「ホールドアウト法」と関連する手法・概念を比較しておくと、 使い分けに迷わない:
| 項目 | 特徴 | 補足 |
|---|---|---|
| Holdout 70/30 | 標準分割 | 中規模データ |
| Holdout 80/20 | Train 多め | 大規模データ |
| Holdout 60/20/20 | Train/Val/Test | ハイパラ調整含む |
| K-Fold CV | K 回平均 | 小規模データ |
| Bootstrap | 再標本化 | 信頼区間付き |
「ホールドアウト法」について試験対策・実務で頻出する質問とその回答:
本ページの理解を確認する 5 問の練習問題です。 紙とペン、 もしくは Python で取り組んでみてください:
💡 ヒント:練習問題の答えは正解が 1 つではありません。 思考プロセスを書き残すことが学習効果を高めます。
「ホールドアウト法」を入門レベルで習得した次に進むべき発展テーマ:
基本概念を 確率論・情報理論・最適化理論の観点で再定式化すると、 隣接する手法との理論的な関係が見えてきます。 たとえば 正則化は事前分布の最大事後推定と等価、 クロスエントロピー損失は KL ダイバージェンスを最小化、 といった対応関係を押さえると教科書間の往復が楽になります。
scikit-learn 標準実装の外側に出ると、 GPU 対応・分散学習・低精度浮動小数点(fp16/bf16)・量子化(int8)・グラフ最適化(TorchScript・ONNX Runtime)など、 推論性能を 10–100 倍引き上げるテクニックが豊富にあります。 本番運用では モデル精度と推論コストのトレードオフを意識した実装が鍵。
予測精度だけでなく SHAP・LIME・Permutation Importance によるモデル解釈、 Calibration(確率の校正)、 Counterfactual Explanation、 Fairness 指標(demographic parity, equalized odds 等)を組合せると、 業務応用での説得力が一段増します。
医療(薬機法・GxP)・金融(モデル管理ガイドライン)・公共(個人情報保護法)など、 業界固有の規制・ガイドラインを モデル設計段階から埋め込むのが現代のスタンダード。 「ホールドアウト法」を業務適用するときは、 ドメインの専門家・法務との早期コラボレーションが成否を分けます。
「ホールドアウト法」をさらに深掘りするための一次資料・教科書・オンラインコース:
Holdout は 「最もシンプルで広く使われる」汎化評価法。 1 回の Train/Test 分割で済むため計算が軽い。 大規模データなら統計的揺らぎが小さく問題ないが、 小規模では分割運に左右される。 そのため K-Fold CV と組合せるのが現代の標準(Train で CV ハイパラ調整、 Test で最終確認)。
Holdout の典型シナリオ:
| シナリオ | 概要 | データ/環境 | 評価指標 |
|---|---|---|---|
| 80/20 分類 | 大規模分類 | Stratify 必須 | 数万〜数十万件 |
| 70/30 回帰 | 中規模回帰 | ランダム分割 | 数千〜数万件 |
| 60/20/20 | Train/Val/Test | ハイパラ調整含む | 標準的 |
| Time-aware Split | 時系列 | 未来をテストに | shuffle=False |
| Stratified Split | 不均衡分類 | クラス比保持 | stratify=y |
「ホールドアウト法」を業務適用する際は、 (1) 業務 KPI と評価指標の対応、 (2) データの収集・保管・更新コスト、 (3) 社内承認とコンプライアンス、 (4) 運用人員の確保、 (5) 失敗時のロールバック計画の 5 観点をプロジェクト計画書に必ず明記してください。 技術検証(PoC)の段階で 本番運用要件を逆算しておくと、 後の本番化フェーズで詰まる確率が下がります。
「ホールドアウト法」を学ぶ過程で頻出する関連語を 12 個、 短文定義でまとめます。 知らない語があれば各ページにジャンプしてください:
本用語集は 484 用語を 100 グループ教材と連動して整理しています。 周辺概念を 1 つずつ辿ると、 「ホールドアウト法」の位置づけと使い分けが立体的に理解できます。