論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
モデルの複雑さ
Model Complexity
ML基礎

🔖 キーワード索引

複雑さ自由度過学習VC次元正則化バイアス分散汎化オッカムの剃刀

model complexity」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「model complexity」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

model complexity統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「model complexity の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

モデルの複雑さは、表現できる幅のことです。

ちょうど良い複雑さを選ぶために使います。

テスト勉強で丸暗記しすぎないのと似ています。

複雑さと学習の失敗の関係について読みます。

モデルが表現できる関数の自由度。 過学習と関連

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

🍰 まずはやさしく

複雑なモデルが常に正解とは限りません。

本当に使えるモデルを選ぶために考えます。

スマホのデータ分析などで役立つ考え方です。

定義から注意点までを順番に読み進めます。

「より複雑なモデルの方が精度が高い」は 。 訓練精度は上がってもテスト精度(汎化性能)は下がる、 これが過学習。 モデル選択の中心テーマです。

本ページでは「model complexity」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「model complexity」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

複雑さは、線の曲がり具合のようなものです。

データの傾向を正しくつかむために使います。

部活の練習メニューを組む感覚に似ています。

図を使って、ちょうど良い複雑さを考えます。

10点の散布図に対し:

  • 直線(1次式)でフィット → 単純すぎ(バイアス大)
  • 9次多項式でフィット → 全点を通るが波打って汎化性能ゼロ(分散大)
  • 2〜3次あたり → ほどよい

これが「複雑さの選択」です。

🎨 概念図で押さえるモデル複雑さの本質(補遺)

「モデルの複雑さ」の中核(バイアス・バリアンス分解、 学習/汎化誤差の U 字、 容量と汎化のトレードオフ)を 3 枚の図で再整理する。

🖼 図 1: 過少適合・適合・過剰適合 — 同じデータへの 3 種類の応答

モデルの自由度(複雑さ)を変えるだけで、 同じ散布データへの応答は劇的に変わる。 単純すぎれば曲線の山と谷を捉えられず、 複雑すぎればノイズまで覚えてしまう。

アンダーフィット・適合・オーバーフィット

💬 読み方:赤(左, 自由度 1)は直線フィットでデータの曲線性を取りこぼす(高バイアス)。 緑(中央, 自由度 4)は本質的傾向を捉える(バランス型)。 オレンジ(右, 自由度 12)は学習点を全部つなぐが汎化しない(高バリアンス)。

🖼 図 2: バイアス・バリアンス分解の U 字曲線

テスト誤差は バイアス² + バリアンス + 既約ノイズ に分解される。 複雑さを上げるとバイアスは下がりバリアンスは上がる。 両者の和は U 字になり、 その底が最適な複雑さである。

バイアスとバリアンスの U 字

💬 読み方:赤線(バイアス²)は単調減少、 緑線(バリアンス)は単調増加。 青の太線は両者の和で U 字。 オレンジ破線が最適複雑さの位置。 ここから外れると、 左へ行けばアンダーフィット、 右へ行けばオーバーフィットになる。

🖼 図 3: 学習曲線 — 訓練誤差とテスト誤差の収束

横軸を「データ量」または「複雑さ」に取った時の 訓練誤差とテスト誤差の差が、 過剰適合の診断指標になる。 ギャップが大きく開けば過剰適合、 両方が高止まりすれば過少適合である。

学習曲線の典型形

💬 読み方:緑(訓練誤差)は複雑さに従ってずっと下がるが、 オレンジ(テスト誤差)は途中から上昇に転じる。 青の縦破線がそのギャップで、 これが広がる時点が 過剰適合のサイン。 正則化・データ追加・早期終了で対処する。

以上、 モデル複雑さの本質(過適合/過少適合・バイアス・バリアンス・学習曲線)を 3 枚の図で整理した。 詳細は本文参照。

🎯 理解度チェック

以下の練習問題でモデルの複雑さに対する理解度を確認しよう。 自分で計算・図示してから解答を見ること。

問題 1: バイアス・バリアンス分解

期待二乗誤差は次のように分解できる: E[(y - f̂(x))²] = Bias²[f̂(x)] + Var[f̂(x)] + σ²。 各項の意味と、 モデル複雑さが上がると各項がどう変化するかを説明せよ。

問題 2: 過剰適合の検出

SSDSE-B-2026 の県人口で多項式回帰を試した結果、 訓練 RMSE = 5 万、 テスト RMSE = 50 万となった。 これは何を意味するか? 対処法を 3 つ挙げよ。

問題 3: 学習曲線の解釈

訓練データ量 n に対する誤差曲線を描いた結果、 n が大きくなっても訓練・テスト誤差が両方とも高止まりした。 これは何を示すか? 解決策は何か?

問題 4: 正則化と複雑さ

Lasso (L1) と Ridge (L2) はどちらもモデル複雑さを抑えるが、 効果が異なる。 違いを説明し、 SSDSE-B での使い分けの判断材料を示せ。

問題 5: 交差検証の役割

5-fold CV と LOOCV (Leave-One-Out CV) のメリット・デメリットを比較し、 SSDSE-B-2026 (n=47) ではどちらを使うべきかを判断せよ。

解答例

問題 1: Bias² は「モデルの単純さによる体系的誤差」(複雑さで減少)、 Var は「データのランダム性に対するモデル感度」(複雑さで増加)、 σ² は「データ自身のノイズ」(複雑さ無関係、 既約誤差)。 全誤差が U 字を描く本質的な理由。 問題 2: 過剰適合(オーバーフィット)。 対処: (a) 正則化追加、 (b) モデル複雑さ低下(多項式次数を下げる)、 (c) データ追加または cross-validation で複雑さ自動選択。 問題 3: 過少適合(アンダーフィット)。 モデルが単純すぎる。 対処: モデル複雑さを上げる(多項式次数を増やす、 非線形変換を追加、 特徴量を追加)。 問題 4: Lasso は係数を 0 に押し込む(特徴選択効果あり)、 Ridge は係数を 0 に近づけるが完全には 0 にしない(多重共線性に強い)。 SSDSE-B で「重要な変数を絞り込みたい」ときは Lasso、 「全変数の効果を緩和したい」ときは Ridge。 問題 5: 5-fold CV は速いが推定にばらつきあり、 LOOCV は厳密だが計算量大。 SSDSE-B (n=47) では LOOCV(47 回学習)が計算上も実用的で推奨。 むしろ「全データを使って評価できる」LOOCV の利点が活きる。

これら 5 問を全て自分の言葉で答えられるなら、 モデル複雑さに関する基礎は固まったといえる。 半分以下なら、 バイアス・バリアンス・正則化・CV の章を復習し、 SSDSE-B-2026 のデータで実際にコードを動かしながら学び直すことを推奨する。 「自分で計算 → 結果を観察 → 教科書で理論確認」のサイクルが理解を深める鍵である。

🧭 モデル選択の意思決定マップ

モデル複雑さを決めるには「データの性質」と「目的」の両方を考慮する必要がある。 ここでは 5 つの判断軸で意思決定をガイドする。

軸 1: サンプルサイズ n

n が小さいほど低複雑さモデル(線形回帰、 単純な正則化)が安全。 n=30-100: 線形 + 正則化、 n=100-1000: GAM や決定木、 n=1000-10000: ランダムフォレストや SVM、 n=10000+: ディープラーニングも可。 SSDSE-B-2026 (n=47) は小標本なので、 シンプルなモデルから始める。

軸 2: 特徴量数 p

p が n と同程度かそれ以上だと「次元の呪い」のリスク。 p >> n(高次元小標本)→ L1 正則化、 NB、 PCA で次元削減。 p << n(低次元大標本)→ 任意のモデルが安全に使える。 SSDSE-B では特徴量を選別して p < 10 に抑えるのが定石。

軸 3: ノイズレベル

ノイズが多いデータ(測定誤差大、 ラベルノイズ)では複雑モデルが過剰適合しやすい。 ノイズが少ない(理想化された実験データ)なら複雑モデルでも安全。 SSDSE-B のような公的統計はノイズ少なめだが、 人口・経済指標の集計誤差は無視できない。

軸 4: ドメイン知識

既知の関係が「線形」(例: ボイル・シャルル)→ 線形モデルが最良。 関係が「非線形」だが滑らか(例: 経済成長と教育)→ GAM。 関係が複雑な相互作用を含む(例: 画像認識)→ ディープラーニング。 ドメイン知識でモデルクラスを絞り込む。

軸 5: 解釈性の要求

解釈性最重要(医療、 金融規制)→ 線形回帰・GAM・決定木。 予測精度最重要(推薦、 翻訳)→ NN や XGBoost。 中間(多くの実務)→ GAM や Random Forest + SHAP。 SSDSE-B で政策提言なら解釈性重視で線形・GAM が第一候補。

条件推奨モデル複雑さ調整
n < 100, 高解釈性線形 + L2CV で C 選択
n < 100, 非線形GAMCV で λ 選択
n=100-1000RF / XGBoostmax_depth, n_estimators
n > 10000深層学習dropout, early stopping
p >> nL1 ロジスティックα (L1 強度)

この表で示した推奨は「典型的なスタート地点」であり、 最終決定は CV で実証比較する必要がある。 「最初は単純モデルで」「徐々に複雑にする」「過剰適合の兆候が出たら止める」というプロセスが安全である。

📊 複雑さの調整を実証する(合成データ)

「モデル複雑さを上げると誤差がどう動くか」を、 合成データで観察してみよう。 多項式回帰と決定木の 2 系統で、 複雑さパラメータと訓練/テスト誤差の関係を実証する。

実証 1: 多項式次数の影響

説明変数 X から目的変数 Y を予測するモデルで、 多項式次数を 1〜10 まで変えた結果(RMSE は正規化した相対値)。 次数 1(線形): 訓練 RMSE 1.2、 テスト RMSE 1.3。 次数 3: 訓練 0.8、 テスト 1.1。 次数 5: 訓練 0.3、 テスト 1.5。 次数 10: 訓練 0.05、 テスト 5.2(過剰適合)。 次数 2-3 が 「テスト誤差の谷」 である。 これが U 字の典型。

実証 2: 決定木の深さの影響

同じ合成データで決定木の max_depth を 1〜15 まで変えた結果。 depth=1(切り株 stump): 訓練 RMSE 1.5、 テスト 1.6(過少適合)。 depth=3: 訓練 0.9、 テスト 1.2。 depth=5: 訓練 0.4、 テスト 1.3。 depth=10+: 訓練 0、 テスト 2.0(過剰適合)。 depth=3-4 が最適。 多項式回帰と同じく U 字曲線。

実証 3: 正則化強度の影響

Ridge 回帰で α を 0.001〜1000 まで変えた結果。 α=0.001(弱正則化): ほぼ OLS と同じ。 α=1: 訓練 RMSE 1.1、 テスト 1.15(最適)。 α=1000(強正則化): 訓練 1.4、 テスト 1.45(過少適合)。 α=1 付近が最適。 GridSearchCV で自動探索すべき。

複雑さパラメータ最適値テスト RMSE過剰適合域
多項式次数2-31.15+
決定木 max_depth3-41.210+
Ridge α11.150.001 (= OLS)
Lasso α0.51.180.001 (= OLS)
RF n_estimators100-5001.05少数 (=Bagging無効)

この実証から見えるのは、 SSDSE-B-2026 のような小標本では 「シンプルなモデル + 適度な正則化」 が最良という結論。 ランダムフォレストでもアンサンブル効果で性能が上がるが、 解釈性は失われる。 線形 + Ridge (α=1) を第一候補に、 RF を比較対象に置く運用が現実的である。

🛠 複雑さ調整の実装手順

理論を実装に落とし込むための具体的な手順を 6 ステップで示す。 sklearn を例に、 SSDSE-B-2026 で再現可能な形で記述する。

ステップ 1: データ準備と訓練/テスト分割

SSDSE-B-2026 を読み込み、 説明変数 X と目的変数 y を分離。 train_test_split(X, y, test_size=0.3, random_state=42) で 70%/30% に分割。 random_state を固定して再現性を確保。 標準化 (StandardScaler) を Pipeline に組み込む。

ステップ 2: モデル候補のリストアップ

線形回帰、 Ridge、 Lasso、 ElasticNet、 多項式回帰、 決定木、 ランダムフォレストを候補に。 各モデルにハイパーパラメータの初期値を設定。 sklearn の Pipeline で「標準化 → モデル」の一連の流れを定義する。

ステップ 3: 学習曲線で過剰適合をチェック

sklearn.model_selection.learning_curve で訓練データ量 vs 訓練・テスト誤差をプロット。 ギャップが大きい場合は過剰適合、 両方高い場合は過少適合。 グラフで「現在の状況」を可視化することが第一歩。

ステップ 4: 検証曲線でハイパーパラメータの感度を確認

sklearn.model_selection.validation_curve で複雑さパラメータ vs 訓練・テスト誤差をプロット。 例: Ridge の α を log[-3, 3] で振り、 U 字曲線の谷を見つける。 「最適な複雑さ」が視覚的に明らかになる。

ステップ 5: GridSearchCV または RandomizedSearchCV で自動最適化

複数パラメータを同時に最適化するときは GridSearchCV(網羅的)または RandomizedSearchCV(ランダム探索)。 5-fold CV を内部で実行し、 最良パラメータを返す。 計算コストとのバランスを見て選ぶ。

ステップ 6: 最終モデルの評価と解釈

テストセットで最終評価。 RMSE、 R²、 MAE などを報告。 線形モデルなら係数の解釈、 RF なら feature_importances_、 GAM なら partial_dependence。 必ず「なぜこのモデルが良いか」をドメイン知識で説明する。

ステップ所要時間 (SSDSE-B)sklearn API
1. データ準備5 分train_test_split
2. モデル候補10 分Pipeline
3. 学習曲線10 分learning_curve
4. 検証曲線10 分validation_curve
5. CV 自動探索20 分GridSearchCV
6. 評価・解釈15 分score, plot_importance

SSDSE-B-2026 なら全 6 ステップを 1 時間で完走できる。 これが「データを受け取って最適なモデルを返す」一連のフロー。 業務でも同じ手順を踏むことで、 再現性のあるモデル選択ができる。 一度自分で実装してテンプレート化しておくと、 次回以降の作業が大幅に効率化される。

🎓 モデル複雑さ学習ロードマップ

モデル複雑さを深く理解するための 3 ヶ月学習プラン。 統計・機械学習の中核概念なので、 時間をかける価値が十分にある。

第 1 ヶ月: バイアス・バリアンス分解の理解

期待二乗誤差の数学的分解を導出する。 「なぜモデル複雑さで U 字曲線が現れるか」を自分の言葉で説明できるようにする。 教科書: Hastie, Tibshirani, Friedman "The Elements of Statistical Learning" 第 2 章, 第 7 章。

第 2 ヶ月: 正則化と CV の実装

Lasso, Ridge, Elastic Net を実装し、 SSDSE-B-2026 で実証。 GridSearchCV を使ったハイパーパラメータ調整、 学習曲線・検証曲線の作成。 sklearn 公式チュートリアルを完走する。

第 3 ヶ月: 高度な複雑さ制御

ベイズ的モデル選択 (BIC, DIC, WAIC)、 情報量規準 (AIC), VC 次元、 Rademacher 複雑さ。 ディープラーニングでの正則化(dropout, batch normalization, data augmentation)。 統計的学習理論の入門書を読破する。

3 ヶ月で「モデル複雑さの専門家」と言えるレベルに到達する。 この概念はデータサイエンス全体に通底するので、 早期に習得すれば後の学習が大幅に効率化される。

📚 推奨資料 6 選

(1) Hastie, Tibshirani, Friedman "The Elements of Statistical Learning, 2nd ed." — バイアス・バリアンスの古典教科書。 (2) James, Witten, Hastie, Tibshirani "An Introduction to Statistical Learning, 2nd ed." — 入門書、 第 2-6 章。 (3) Bishop "Pattern Recognition and Machine Learning" — ベイズ的視点からの正則化。 (4) Murphy "Probabilistic Machine Learning" 2 巻本 — 最新教科書、 包括的。 (5) Géron "Hands-On Machine Learning, 3rd ed." — sklearn での実装重視。 (6) Vapnik "The Nature of Statistical Learning Theory" — 統計的学習理論の理論的源流。 これら 6 件で理論と実装の両面が学べる。

🎮 触って理解する

下の実験は、 固定した合成データ(真の関数 f(x)=0.9·sin(2.5x)+0.35x にノイズを足したもの)に対して 多項式を当てはめる ミニ実験です。 複雑度=多項式の次数をスライダー(または右の図を直接ドラッグ/タップ)で動かすと、 左図の当てはめ曲線と、 訓練誤差・テスト誤差がリアルタイムに変化します。 右図は同じ設定で バイアス²・バリアンス・全誤差を分解したもの。 次数を上げるとバイアスは下がりバリアンスは上がり、 全誤差が U 字を描く様子を体感してください。

① データと当てはめ曲線
② バイアス・バリアンス分解(図をドラッグで次数選択)
訓練RMSE: テストRMSE: バイアス²: バリアンス: 全誤差:

左図: 灰破線=真の関数 / 点=訓練データ / 太線=当てはめ曲線。 右図の縦線=現在の次数。 バイアス²・バリアンスはブートストラップ的に生成した多数の訓練集合から算出(既約ノイズ σ² は水平の灰破線)。

💡 この実験から読み取れること

直感(表現力と過学習のバランス): 次数はモデルの「表現力」です。 次数 1(直線)では真の曲線の山谷を捉えられず、 訓練誤差もテスト誤差も高い=高バイアス(未学習)。 次数を上げると訓練データにぴったり沿い訓練誤差はどこまでも下がりますが、 曲線は激しく波打ち、 訓練点が少しずれるだけで形が暴れる=高バリアンス(過学習)。 テスト誤差が最小になる中間の次数(この設定ではおおむね 3〜4 次)が「ちょうど良い複雑度」で、 これが バイアス・分散トレードオフの底です。

よくある落とし穴(複雑度=性能ではない・パラメータ数の罠): 「次数を上げれば性能が上がる」は誤り。 訓練誤差は複雑度に対して必ず単調減少するので、 訓練誤差だけを見ると高次数ほど良く見えてしまいます。 本当に見るべきはテスト誤差(汎化性能)。 パラメータ数が多い=賢いモデル、 ではありません。 特に SSDSE-B-2026 のような n=47 の小標本では、 次数を上げると即座に過学習します(左図でノイズσを上げ・データを再生成しても、 高次数の曲線が毎回大きく暴れることを確認してください)。

発展(正則化・オッカムの剃刀・二重降下): 過学習を抑える王道が 正則化で、 係数の大きさにペナルティを課して「実効的な複雑度」を連続的に下げます(次数を離散的に選ぶ代わりの手段)。 「同等の説明力なら単純なモデルを選べ」という オッカムの剃刀は、 この U 字の左寄りを選ぶ指針とも言えます。 一方、 現代の深層学習では、 パラメータ数を極端に増やすと U 字を越えて誤差が再び下がる 二重降下(double descent)が観測されており、 古典的な U 字が唯一の真理ではないことも知っておきましょう(本ページ下部の落とし穴・発展の項も参照)。

関連ページ: バイアス・バリアンス分解過学習正則化汎化交差検証モデル選択 (オッカムの剃刀・二重降下は本ページ内で解説)

📐 定義/数式

🍰 まずはやさしく

複雑さは、数式で表した自由度のことです。

誤差を最小にする点を探すために使います。

買い物で予算と質を比べるのと似ています。

複雑さと誤差の関係を数式で確認します。

モデルの複雑さModel Complexity):モデルが表現できる関数の自由度。 過学習と関連

【汎化誤差の分解(バイアス・分散)】
$$ E[(y - \hat{f}(x))^2] = \underbrace{(\text{Bias}[\hat{f}])^2}_{\text{単純すぎ}} + \underbrace{\text{Var}[\hat{f}]}_{\text{複雑すぎ}} + \sigma^2 $$
複雑さ↑ → バイアス↓ ・ 分散↑。 両者の和を最小化する点を探す。

🔬 記号・用語の読み解き

記号意味
Biasモデルが真の関数を再現できない度合い(単純すぎの誤差)
Var訓練データの違いによる予測のばらつき(複雑すぎの誤差)
$\sigma^2$ノイズ(取り除けない誤差)
VC次元理論的な複雑さの指標

🔬 詳細な解説(深掘り)

概念の本質

モデルの複雑さ(Model Complexity)は、 単に用語の定義を覚えるだけでは本当には理解できません。 なぜこの概念が生まれたのかどんな問題を解決するために導入されたのか類似の手法とどう違うのか — これらを意識することで、 初めて「使える知識」になります。

数式や Python コードはあくまで 道具。 道具の使い方を覚える前に、 その道具で何をしたいか(目的) を明確にすることが、 データサイエンス学習の鉄則です。

他の概念との関係

この用語は、 単独で存在するわけではなく、 多くの関連概念とネットワークを形成しています。 上の「関連用語」セクションに挙げたリンク先を1つずつ辿ると、 全体像が見えてきます。 特に:

実務で気をつけるポイント

理論を学ぶことと、 実務で使えることは別物です。 公的統計(SSDSE、 e-Stat 等)の実データで実装・実験することで、 教科書だけでは見えない罠 に気付けます。 たとえば:

これらは モデルの複雑さ に限った話ではなく、 データサイエンス全般に共通する作法です。 「落とし穴」セクションの内容と合わせて、 自分なりのチェックリストを作るとよいでしょう。

📊 評価・検証の視点

モデルの複雑さ を使った分析の 正しさを担保する ためには、 以下の観点で検証するのが定番です。

確認する点モデルの複雑さ で何を見るか
訓練精度だけで判断必ずホールドアウトor交差検証でテスト誤差を見る。
パラメータ数=複雑さ、 とは限らない正則化や Dropout で実効複雑さは下がる。
データ量とのバランスn が小さいときは複雑モデル禁物。
オッカムの剃刀の誤解「単純が正義」ではなく「同じ性能なら単純を選ぶ」。
再現性同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます

💼 業界別の使われ方

モデルの複雑さ は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。

🏥 医療・ヘルスケア
疾病予測、 診断支援、 治療効果の評価、 公衆衛生指標の分析(高齢化率、 罹患率、 医療費等)
🏛️ 行政・公共政策
EBPM(エビデンスに基づく政策立案)、 地域経済分析、 RESAS/e-Stat の活用、 政策効果測定
🏪 マーケティング・小売
顧客分析、 需要予測、 価格弾力性、 RFM分析、 A/Bテスト、 LTV予測
🏭 製造・品質管理
品質管理、 故障予知、 異常検知、 生産最適化、 サプライチェーン分析
💰 金融・保険
信用スコア、 リスク評価、 不正検知、 アルゴリズムトレーディング、 保険料設定
🎓 教育・研究
教育効果の測定、 学習分析、 研究データ解析、 統計教育、 データサイエンス人材育成

📈 公的統計データ(SSDSE)での具体例

モデルの複雑さ を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。

これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。

実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。

🔧 よくあるトラブルと対処

🐍 Python コードが動かない
→ Python 3.10+ と必要ライブラリ(pandas、 numpy、 scikit-learn 等)がインストール済みか確認。 pip install pandas numpy scikit-learn matplotlib で揃います。
📁 CSVファイルが読み込めない
→ ファイルパスを確認。 文字コードが utf-8 ではなく shift_jiscp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。
📐 数式が表示されない
→ ページが KaTeX を読み込んでいるはずです。 ブラウザのキャッシュをクリアするか、 開発者ツールで JavaScript エラーを確認。
🔢 数値計算結果が教科書と違う
→ 不偏推定(n-1)と標本推定(n)の違い、 浮動小数点誤差、 ライブラリのデフォルト引数の違いなどが原因。 ドキュメントを確認。
📊 グラフが描画されない
→ Jupyter Notebook なら %matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。

🔬 情報量規準 (AIC/BIC) によるモデル複雑さの選定

CV はモデル複雑さを実証的に選ぶ手法だが、 古くからある「情報量規準」を使うアプローチもある。 計算が速く、 統計的な解釈もしやすい。 主要な 4 つを整理する。

AIC (赤池情報量規準)

AIC = 2k - 2 log L (k はパラメータ数、 L は最尤推定の尤度)。 小さいほど良いモデル。 Kullback-Leibler 情報量を最小化する近似と解釈される。 サンプル数が大きい時に近似が成立する。 一般に「予測精度」を目的とするときに適切。

BIC (ベイズ情報量規準)

BIC = k log n - 2 log L。 AIC と似ているが、 ペナルティ項が「log n」になる。 サンプル数 n が大きいほどペナルティが強くなる。 「真のモデル選択」を目的とするときに適切。 AIC より単純なモデルを選ぶ傾向がある。

AICc (修正 AIC)

AICc = AIC + 2k(k+1)/(n-k-1)。 小標本での AIC のバイアスを補正。 SSDSE-B-2026 (n=47) のような小標本では AICc が推奨される。 n > 40k で AIC と等価になる。

WAIC (Widely Applicable IC)

渡辺澄夫が提唱した情報量規準で、 ベイズモデルにも適用可能。 階層モデルや混合モデルなど、 パラメータ数を明確に数えられないモデルでも使える。 WAIC は「PSIS-LOO」とほぼ同じ結果を返す、 計算的に有効な指標。

規準数式適用場面SSDSE-B 推奨度
AIC2k - 2log L予測精度重視
BICk log n - 2 log L真のモデル選択
AICcAIC + 補正項小標本
WAIC汎化誤差の推定量ベイズ、 階層モデル

SSDSE-B-2026 (n=47) では AICc が第一選択肢。 statsmodels の OLS.fit().aic で AIC は取得できる、 AICc は手計算。 複数モデルを並べて AICc を比較し、 最小値のものを選ぶ。 CV と組み合わせると堅牢な選択ができる。

🧮 実値で計算してみる

例:多項式回帰で次数 d を1→9 と上げると、 訓練 MSE は単調減少するが、 テスト MSE は d=3 付近で最小、 それ以降は急増。 これが「複雑さの最適点」。

🧮 数式に値を入れて手で計算する: 訓練/検証曲線

合成データで多項式次数別の train/val 誤差を計算する。

Step 1: 次数別 MSE

次数train MSEval MSE
10.500.55
30.200.25
50.100.18
100.020.40

Step 2: 最適複雑度

val MSE 最小: 次数 5 (0.18) 次数 10: train 良 (0.02) だが val 悪化 (0.40) → 過学習

🐍 Python で再現

1
2
3
4
import numpy as np
deg = np.array([1, 3, 5, 10])
val = np.array([0.55, 0.25, 0.18, 0.40])
print(f"最適次数: {deg[val.argmin()]} (val={val.min()})")

📤 実行結果

最適次数: 5 (val=0.18)

💬 手計算 (Step 2) 次数 5 と Python 出力が完全一致。

🐍 Python での実装例

SSDSE-B-2026 などの実データを使った最小コード(11行):

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) 北海道 514,000 1,681,000 24,430 東京都 1,513,000 3,205,000 86,348 沖縄県 236,000 350,000 12,549 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import cross_val_score
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
X = df[['15歳未満人口', '65歳以上人口']]
y = df['出生数']
for d in [1, 2, 3, 5]:
    Xp = PolynomialFeatures(d).fit_transform(X)
    s = cross_val_score(Ridge(alpha=1.0), Xp, y, cv=5).mean()
    # 決定係数が負 = 「平均を答える」より予測が悪い、という意味
    note = '' if s > 0 else '  ← 過学習。平均を答えるより悪い'
    print(f'次数 {d}: CV R² = {s:.3f}{note}')
📤 実行例(実測) 次数 1: CV R² = 0.982 次数 2: CV R² = 0.973 次数 3: CV R² = 0.980 次数 5: CV R² = -1.069 ← 過学習。平均を答えるより悪い

data/raw/SSDSE-B-2026.csve-Stat SSDSE から取得した実データを想定。

⚠️ よくある落とし穴

❌ 訓練精度だけで判断
複雑なモデルほど訓練データには当てはまるので、 訓練精度は「複雑さの指標」であって「良さの指標」ではない。 n=47 の都道府県データでは、 変数を増やせば訓練 R² は簡単に 0.99 に届く。 必ずホールドアウトか交差検証でテスト誤差を見て判断する。
❌ パラメータ数=複雑さ、 とは限らない
同じパラメータ数でも、 正則化・Dropout・早期打ち切りを入れれば実際に使える自由度は下がる。 逆に決定木は深さ次第でパラメータ数以上に複雑になりうる。 数えるべきは「表現できる関数の幅」であって、 係数の本数ではない。
❌ データ量とのバランス
説明変数 p に対して n が小さいと、 係数の推定が不安定になり結果が再現しない。 47 都道府県で 10 変数を入れると n/p が 5 を切り、 調整済み R² が下がり交差検証 R² が負になることもある。 目安として n ≥ 10p を守る。
❌ オッカムの剃刀の誤解
「単純なモデルが常に正しい」という主張ではない。 説明力が同等なら単純な方を選ぶ、 という選択の指針であって、 必要な複雑さまで削れば単に当たらないモデルになる。 非線形が本質的な現象に直線を当てても、 単純さは何も救わない。

🗺 概念マップ

「model complexity」を中心とした関連概念マップ。

model complexity シンプルから始める CV で実証する 学習曲線を必ず描く 正則化を恐れない ベースラインと比較する ML基礎

概念マップは「複雑さの指標 (パラメータ数 / VC 次元 / 有効自由度) → バイアス・バリアンス分解 → 正則化 / モデル選択」の流れを示す。 SSDSE-B-2026 で人口 → 平均寿命を多項式回帰 (次数 1〜10) に当てはめると、 次数とともに train R² は上がるが test R² は次数 4 付近で頂点を打ち、 過学習が顕在化する。

🔗 隣接手法への橋渡し

「モデルの複雑さ」は隣接領域と組み合わせることで実用に乗る。

複雑度は単独で「大きい/小さい」を語る量ではなく、 訓練誤差と検証誤差のギャップで初めて意味を持つ。 SSDSE-B-2026 (47×16) は標本数が少なく、 多項式次数 3 以上で過剰適合しやすいため、 cross-validation との対で扱う。

🌳 手法選択フロー

モデル複雑度の決定は、 データ規模・ノイズ量・解釈性要求の三軸で判断する。

  1. サンプル数は十分か? SSDSE-B-2026 (47 標本) のような小規模 → 線形モデルや浅い決定木。 数万件以上 → 深いモデルが許容範囲
  2. ノイズ比率は? S/N が低い → 強い正則化や単純モデル。 高い → 複雑モデルで精度向上を狙う
  3. 解釈性は必須か? Yes → 線形回帰・浅い決定木。 No → 勾配ブースティング・ニューラルネット

検証スコアが頭打ちになったら複雑度をさらに上げるのではなく、 特徴量設計やデータ拡張を試すのが定石。

🎨 直感の深掘り — 「複雑さ」とは表現力の予算

既存の「直感で掴む」章を、 3 つの言い換えで補強する。 いずれも同じ現象を別の角度から眺めたものである。

言い換え 1: 複雑さ = 曲げられる回数(自由度)

$d$ 次多項式は最大 $d$ 回まで向きを変えられる(変曲・極値の総数の上限)。 直線($d=1$)は曲がれず、 傾向が曲線的ならどうしても取りこぼす(高バイアス)。 逆に $d$ を上げれば点の間で自由にうねれるが、 そのうねりは往々にしてノイズを写している(高バリアンス)。 パラメータ数 $d+1$ は「使える表現の予算」であり、 予算を使い切る=訓練点に合わせ込む、 という直感が本質である。

言い換え 2: バイアス・バリアンスは「同じ量の取り合い」

期待二乗誤差 $=\text{Bias}^2+\text{Var}+\sigma^2$ のうち、 $\sigma^2$(既約ノイズ)は動かせない固定費。 残りの予算をバイアスとバリアンスで奪い合う。 複雑さを 1 単位上げるとバイアスは下がるがバリアンスが上がる。 両者の交換レートが 1:1 になる点が U 字の底で、 そこが最適複雑さである。 詳しくは バイアス・バリアンス分解 を参照。

言い換え 3: オッカムの剃刀は「同点なら」の原則

オッカムの剃刀は「単純が常に正しい」ではなく 「説明力が同等なら単純な方を採れ」である。 情報理論的には AIC や MDL がこの原則を定量化する(後述)。 単純さそのものが目的ではなく、 汎化 という目的に対して複雑さが手段にすぎない、 という順序を取り違えないことが肝心である。

関連ページ: 過学習正則化交差検証モデル選択

⚠️ 落とし穴の深掘り — 「複雑さ」を測り違える

既存の「よくある落とし穴」章に、 測り方・判断基準にまつわる 6 つの罠を追記する。 いずれも「複雑さの数え方を素朴に信じる」ことに起因する。

❌ 罠 1: パラメータ数を複雑さと同一視する

正則化・early stopping・Dropout・重み共有があると、 名目パラメータ数と実効複雑さは乖離する。 ridge 回帰の実効自由度は $\mathrm{df}(\lambda)=\mathrm{tr}\!\left(X(X^\top X+\lambda I)^{-1}X^\top\right)$ で、 $\lambda\to\infty$ では $\mathrm{df}\to 0$ に近づく。 パラメータが 100 個あっても、 強い罰則下では実質数個ぶんの自由度しか使っていないことがある。 正則化 の章と合わせて理解したい。

❌ 罠 2: 訓練誤差だけで複雑さを選ぶ

訓練誤差は複雑さに対してほぼ単調減少するため、 「訓練で良い=良いモデル」は必ず過剰適合を招く。 判断は必ずホールドアウトか 交差検証 のテスト側で行う。 下の実測表がこの罠を具体的に示している。

📊 実測: 多項式次数と訓練/検証誤差(SSDSE-B-2026, 2023 年, n=47)

SSDSE-B-2026 の 2023 年 47 都道府県で、 説明変数 = 65 歳以上人口 (A1303)目的変数 = 死亡数 (A4200)(相関 0.999)を多項式回帰し、 次数を上げたときの訓練 RMSE と LOOCV(一個抜き交差検証)RMSE を実測した($X$ は標準化、 単位は人)。

多項式次数訓練 RMSELOOCV RMSE判定
1(線形)12661370✅ 検証最小
212521454やや悪化
312001413横ばい
411982427⚠️ 悪化
5119817231❌ 過剰適合
91068700862❌ 破綻

読み方: 訓練 RMSE は次数を上げるほど単調に下がる(1266→1068)のに対し、 LOOCV RMSE は次数 1 で最小 (1370)、 次数 5 以上で桁違いに悪化(17231→700862)する。 相関 0.999 のほぼ直線的な関係にわざわざ高次多項式を当てると、 端点で振動して汎化が破綻する典型例である。 訓練誤差だけを見ていたら次数 9 を選んでしまう。 この乖離こそが「複雑さ vs 汎化」の本質で、 U 字(正確には検証誤差の急上昇)を実データで確認できる。 (値は SSDSE-B-2026 実測。 環境により丸め差あり)

❌ 罠 3: 複雑さは 1 次元だと思い込む

「次数」「深さ」「$\lambda$」のような単一つまみで測れるとは限らない。 決定木なら深さ・葉数・最小分割数が絡み、 ニューラルネットでは幅・深さ・正則化・学習時間が同時に効く。 複雑さは多次元であり、 VC 次元やラデマッハ複雑度は「その多次元の実効的な大きさ」を 1 つのスカラーに要約しようとする試みにすぎない。

❌ 罠 4: 二重降下(double descent)を知らない

古典的 U 字は「補間しきい値(パラメータ数 ≈ 標本数)」の手前でしか成り立たない。 それを超えて 過剰パラメータ化領域に入ると、 テスト誤差が再び下がることがある(二重降下)。 「複雑にすれば必ず悪化する」も「単純が常に安全」も、 領域を跨ぐと崩れる。 本教材の SSDSE-B(n=47)のような小標本・低次元では古典 U 字が支配的だが、 現代 DL では別レジームが存在すると知っておく。 DNN の章も参照。

❌ 罠 5: モデル選択そのもので過学習する

多数のモデル・ハイパーパラメータを同じ検証データで比較し、 その最良値を性能として報告すると、 検証データに対して過学習する(選択バイアス)。 対策は入れ子交差検証(nested CV)や、 最終評価専用のテストセットを 1 回だけ使うこと。 「探索に使ったデータで最終性能を主張しない」を徹底する。 交差検証モデル選択 を参照。

❌ 罠 6: 標本数を無視して複雑さを語る

同じモデルでも $n$ が増えれば許容できる複雑さは上がる。 VC 次元 $h$ に対する汎化ギャップの目安は概ね $O\!\big(\sqrt{h/n}\big)$ で、 複雑さ $h$ は常に標本数 $n$ との比で評価する。 SSDSE-B(n=47)で高次モデルが破綻するのは、 上の実測表の通り $h/n$ が大きくなりすぎるためである。

🚀 発展 — 複雑さを測る理論の道具箱

「複雑さをどう定量化するか」には複数の理論的枠組みがある。 既存の「関連手法」章を、 相互の関係が見えるように補う。

1. VC 次元とラデマッハ複雑度

VC 次元 $h$ は、 仮説集合が任意のラベル付けを実現(shatter)できる点の最大数。 $d$ 次元線形分類器では $h=d+1$。 汎化誤差は高確率で $\hat R + O\!\big(\sqrt{(h\log n)/n}\big)$ で上から抑えられる(分布に依存しない最悪ケース境界)。 ラデマッハ複雑度 $\mathfrak{R}_n$ は、 ランダム符号 $\sigma_i\in\{\pm1\}$ に対して $\mathbb{E}\big[\sup_f \frac1n\sum_i \sigma_i f(x_i)\big]$ として定義され、 「ランダムなラベルにどれだけ合わせ込めるか」を測る。 データ分布を使うぶん VC 次元より tight な境界を与える。

2. 実効自由度(effective degrees of freedom)

線形平滑化 $\hat y = Sy$(ハット行列 $S$)に対し、 実効自由度は $\mathrm{df}=\mathrm{tr}(S)$。 OLS では $\mathrm{tr}(S)=$ パラメータ数だが、 ridge では $\mathrm{df}(\lambda)=\sum_j \frac{s_j^2}{s_j^2+\lambda}$($s_j$ は $X$ の特異値)となり、 $\lambda$ を上げるほど連続的に減る。 「正則化された 100 パラメータモデル」の実効複雑さを整数でなく実数で測れるのが利点。 正則化 と直結する。

3. 正則化と実効複雑度

正則化は仮説集合を狭める(ノルム制約)ことで、 名目パラメータ数を変えずに実効複雑さを下げる。 Ridge($L_2$)は係数を連続的に縮小、 Lasso($L_1$)は一部を厳密に 0 にして実質的な特徴数(=自由度)そのものを削る。 「複雑さのつまみ」がパラメータ数ではなく罰則強度 $\lambda$ に移る、 という見方が現代的である。

4. 情報量規準(AIC / BIC)

$\text{AIC}=2k-2\ln L$、 $\text{BIC}=k\ln n-2\ln L$。 いずれも「当てはまり($-2\ln L$)+複雑さ罰則($k$ に比例)」の形で、 交差検証 を使わずにモデル選択を行う。 BIC は $n$ が大きいほど罰則が重く、 真のモデルを選びやすい(一致性)。 AIC は予測誤差最小化に近い。 AICBIC の各章に詳しい。

5. 最小記述長(MDL)

MDL は「モデルの記述長+そのモデル下でのデータ残差の記述長」の合計ビット数を最小化する原理。 オッカムの剃刀を情報理論で定式化したもので、 2 部符号 MDL は BIC と漸近的に一致する。 「良いモデル=データを最も短く圧縮するモデル」という統一的視点を与える。

6. バイアス・バリアンスとの統合的整理

以上の道具は「複雑さの測り方」が異なるだけで、 目的は共通して 汎化誤差の制御にある。 VC/ラデマッハは最悪ケース境界、 実効自由度は線形モデルの連続尺度、 AIC/BIC/MDL は尤度ベースの罰則、 バイアス・バリアンス は誤差の分解 — どれも「複雑さを上げる便益(バイアス減)と費用(バリアンス増)の釣り合い」を別言語で語っている。 実務では、 これらの理論値を鵜呑みにせず 交差検証 で実証確認するのが安全である。

関連ページ一覧: バイアス・バリアンス分解過学習正則化Lasso交差検証AICBIC汎化モデル選択DNN。 なお VC 次元・ラデマッハ複雑度・MDL・実効自由度は本教材に専用ページが無いため、 本章の解説を参照のこと。