🔖 キーワード索引
「regularization 」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「regularization」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
regularization 統計分析 SSDSE-B-2026 前提条件 適用範囲 落とし穴 関連手法 Python 実装 検証方法
これらのキーワードは「regularization の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
正則化は、学習のやりすぎを防ぐブレーキです。
予測のズレを小さくするために使います。
スマホのアプリが、特定のデータだけに反応するのを防ぎます。
ここでは正則化の種類と選び方を学びます。
正則化 =損失関数にペナルティ項を加えて過学習を抑える手法群。
L2(Ridge) :係数を全体的に小さく。 多重共線性に強い。
L1(Lasso) :係数を 0 に押し付ける。 自動特徴選択 。
Elastic Net :L1+L2 のハイブリッド。 グループ選択ができる。
正則化の強さ λ は交差検証で選ぶ 。
Dropout / Early Stopping / Weight Decay は深層学習版の正則化。
正則化は「バイアスを少し増やして分散を大きく減らす 」操作と理解する。
📍 あなたが今見ているもの
🍰 まずはやさしく
正則化は、モデルをシンプルにする仕組みです。
データに合わせすぎること(過学習)を防ぎます。
少ないデータで分析をするときに役立ちます。
ここでは正則化の全体像について解説します。
本ページでは、 正則化 を統合的に解説します。 Ridge (L2)・Lasso (L1)・Elastic Net ・Dropout ・Early Stopping ・データ拡張 などを一気通貫で理解できます。
正則化の本質は「複雑なモデルにペナルティを課して、 訓練データに過度に適合しないようにする 」こと。 SSDSE-B のようなサンプル数 47 と少ない データでは、 正則化なしでは過学習がほぼ不可避です。
🎨 直感で掴む — 正則化のたとえ話
🍰 まずはやさしく
正則化は、丸暗記を禁止する塾の先生のようなものです。
本質的なルールを学ばせるために使います。
テストの過去問だけを覚えるのではなく、応用力をつけます。
正則化がどうやって丸暗記を防ぐのかを考えます。
テスト前夜、 過去問の答えを「丸暗記」した学生は本番で初見問題に弱い。 これが過学習。 正則化は「丸暗記禁止=係数を大きくしすぎない罰則」を課して、 浅く広く本質をつかむ学習を強制する塾講師のような役割。 SSDSE-B-2026 で 47 都道府県だけのデータから 30 変数の回帰を立てると、 まさに「47 問の過去問を 30 個のヒントで丸暗記」状態となり過学習する。 Ridge は「全項目に薄く罰金」、 Lasso は「不要科目をきっぱり切り捨て」、 Elastic Net は両者の折衷案。
📐 2. L1ノルムとL2ノルム
🍰 まずはやさしく
ノルムとは、ベクトルの長さを測る定規のようなものです。
正則化の計算方法を決めるために使います。
買い物で、合計金額を出すときのような計算です。
L1ノルムとL2ノルムの違いについて詳しく読みます。
係数ベクトル $\boldsymbol{\beta} = (\beta_1, \dots, \beta_p)^\top$ に対し:
$$\|\boldsymbol{\beta}\|_1 = \sum_{j=1}^{p} |\beta_j|, \qquad \|\boldsymbol{\beta}\|_2^2 = \sum_{j=1}^{p} \beta_j^2$$
記号読み: $\|\cdot\|_1$ は「L1ノルム」、 $\|\cdot\|_2^2$ は「L2ノルムの二乗」。 $\boldsymbol{\beta}$ は「ベータ・太字」と読む。
幾何的な違い — なぜLassoは「ピン留め」するのか
L1 ノルムの等高線は菱形(角がある) 、 L2 は円 。 損失関数の等高線と制約領域 の交点が解となるが、 菱形では「角の点」で交わりやすく、 角の点では一部の座標が 0 になる = 自動特徴選択。
🟢 3. Ridge回帰(L2正則化)
$$\hat{\boldsymbol{\beta}}_{\text{ridge}} = \arg\min_{\boldsymbol{\beta}} \left\{\sum_{i=1}^{n} (y_i - \mathbf{x}_i^\top \boldsymbol{\beta})^2 + \lambda \|\boldsymbol{\beta}\|_2^2 \right\}$$
記号読み: $\hat{\boldsymbol{\beta}}_{\text{ridge}}$ は「ベータ・ハット・リッジ」、 Ridge推定量。 $\lambda$ は「ラムダ」、 正則化の強さ(大きいほど係数を 0 に押し寄せる)。
解析解
$$\hat{\boldsymbol{\beta}}_{\text{ridge}} = (\mathbf{X}^\top \mathbf{X} + \lambda \mathbf{I})^{-1} \mathbf{X}^\top \mathbf{y}$$
$\mathbf{X}^\top \mathbf{X}$ が特異でも $\lambda > 0$ なら必ず正則。 多重共線性に対する強い武器。
3.1 実値で計算
2 サンプル・2 特徴量の極簡単な例:$\mathbf{X}=\begin{pmatrix}1&2\\3&4\end{pmatrix},\ \mathbf{y}=\begin{pmatrix}5\\6\end{pmatrix},\ \lambda=1$ のとき:
$\mathbf{X}^\top\mathbf{X} = \begin{pmatrix}10&14\\14&20\end{pmatrix}$
$\mathbf{X}^\top\mathbf{X}+\mathbf{I} = \begin{pmatrix}11&14\\14&21\end{pmatrix}$
$(\cdot)^{-1} = \frac{1}{11\cdot21-14^2}\begin{pmatrix}21&-14\\-14&11\end{pmatrix} = \frac{1}{35}\begin{pmatrix}21&-14\\-14&11\end{pmatrix}$
$\mathbf{X}^\top\mathbf{y} = \begin{pmatrix}23\\34\end{pmatrix}$ から $\hat{\boldsymbol{\beta}}_{\text{ridge}} \approx (-0.79, 1.49)^\top$
🎯 解説: SSDSE-B-2026(2023 年度)の社会経済 5 指標から「L3221 消費支出(二人以上の世帯)」を予測する Ridge 回帰(L2 正則化)パイプライン。 StandardScaler で各説明変数を平均 0・分散 1 に揃えてから Ridge(alpha=1.0) を適用。 alpha=λ が大きいほど係数を 0 方向に縮小(shrinkage)し、 多重共線性を持つ「総人口 A1101」と「高齢人口 A1303」のような相関の高い変数の係数を安定化させる。
📥 入力例: SSDSE-B-2026.csv(2023 年度・47 都道府県, 実在コード)
説明変数 X(5 列):
A1101 総人口 [人](東京 14,086,000 が最大)
A1303 65歳以上人口 [人]
B4101 年平均気温 [℃]
A4101 出生数 [人]
A9101 婚姻件数 [件]
目的変数 y: L3221 消費支出(二人以上の世帯)[円/月] 223,423-344,092
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import pandas as pd
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
X = df [[ 'A1101' , 'A1303' , 'B4101' , 'A4101' , 'A9101' ]]
y = df [ 'L3221' ]
model = Pipeline ([
( 'scale' , StandardScaler ()),
( 'ridge' , Ridge ( alpha = 1.0 )),
])
model . fit ( X , y )
print ( '係数:' , dict ( zip ( X . columns , model . named_steps [ 'ridge' ] . coef_ )))
📤 実行例:
係数: {'A1101': 10733.1, 'A1303': -5094.0, 'B4101': -6705.8,
'A4101': 549.9, 'A9101': 2339.0}
→ 説明変数は標準化済みなので「1 標準偏差変化したときの消費支出変化(円/月)」を意味
→ A1101 総人口 +1σ → 消費支出 +10,733 円(人口規模の大きい県ほど支出が高い傾向)
→ B4101 年平均気温 +1σ → 消費支出 -6,706 円(温暖な県ほど支出が低め)
→ OLS(λ=0)では総人口の係数が +270,656 円と暴走するが、 Ridge が桁違いに縮小している
💬 読み方: Ridge は係数を完全に 0 にしない(縮小のみ)のに対し、 Lasso(L1)は係数をピッタリ 0 にして変数選択を行う。 alpha は GridSearchCV または RidgeCV で交差検証して決める。 標準化なしで Ridge を使うと、 単位の大きい変数(総人口 1,400 万 等)が小さい変数(年平均気温 15 等)と公平に罰せられず、 結果が歪む。 必ず StandardScaler を前段に挟むのが定石。 ベイズ的にはガウス事前分布 N(0,1/λ) と等価。
🔴 4. Lasso回帰(L1正則化)
$$\hat{\boldsymbol{\beta}}_{\text{lasso}} = \arg\min_{\boldsymbol{\beta}} \left\{\sum_{i=1}^{n}(y_i - \mathbf{x}_i^\top \boldsymbol{\beta})^2 + \lambda \|\boldsymbol{\beta}\|_1 \right\}$$
L1 罰則の角 のせいで、 $\lambda$ を大きくすると一部の係数がピッタリ 0 になる。 これが Lasso の変数選択効果 。
4.1 正則化パス
$\lambda$ を 0 から ∞ まで動かしながら、 係数がどう変化するかを描いた図を正則化パス と呼ぶ。 どの変数がどの順に 0 に落ちるかが見える。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) A9101(婚姻件数) B4101(年平均気温)
北海道 5,092,000 1,681,000 24,430 17,281 11.0
東京都 14,086,000 3,205,000 86,348 71,774 17.6
沖縄県 1,468,000 350,000 12,549 6,316 23.8
…(全 47 行)
📋 コピー 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 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
X = df [[ 'A1101' , 'A1303' , 'B4101' , 'A4101' , 'A9101' ]]
y = df [ 'L3221' ]
X = StandardScaler () . fit_transform ( X )
alphas = np . logspace ( - 3 , 2 , 100 )
coefs = []
for a in alphas :
m = Lasso ( alpha = a , max_iter = 10000 ) . fit ( X , y )
coefs . append ( m . coef_ )
coefs = np . array ( coefs )
plt . figure ( figsize = ( 10 , 5 ))
for j in range ( coefs . shape [ 1 ]):
plt . plot ( alphas , coefs [:, j ], label = f 'beta_ { j + 1 } ' )
plt . xscale ( 'log' )
plt . xlabel ( 'λ (alpha)' )
plt . ylabel ( '係数' )
plt . title ( 'Lasso の正則化パス' )
plt . legend ()
plt . tight_layout ()
plt . show ()
🟣 5. Elastic Net
L1 と L2 を線形結合:
$$\hat{\boldsymbol{\beta}}_{\text{EN}} = \arg\min_{\boldsymbol{\beta}} \left\{\text{RSS} + \lambda \big(\alpha \|\boldsymbol{\beta}\|_1 + (1-\alpha)\|\boldsymbol{\beta}\|_2^2 \big) \right\}$$
$\alpha=1$ で Lasso、 $\alpha=0$ で Ridge。 中間ではグループ選択(相関の高い変数を「一緒に残す/落とす」)ができる。
📋 コピー from sklearn.linear_model import ElasticNetCV
en = ElasticNetCV ( l1_ratio = [ 0.1 , 0.5 , 0.9 , 1.0 ], cv = 5 , max_iter = 10000 )
en . fit ( X , y )
print ( 'best alpha:' , en . alpha_ , 'best l1_ratio:' , en . l1_ratio_ )
🧠 6. ベイズ的解釈 — 正則化=事前分布のMAP推定
Ridge :係数にガウス事前 $\beta_j \sim N(0, \tau^2)$ を仮定した MAP 推定
Lasso :係数にラプラス事前 $\beta_j \sim \mathrm{Laplace}(0, b)$ を仮定した MAP 推定
「過去の知見:係数は通常 0 に近い」を事前分布として注入したと解釈できる
$$\hat{\boldsymbol{\beta}}_{\text{MAP}} = \arg\max_{\boldsymbol{\beta}} \big[\log p(\mathbf{y}|\boldsymbol{\beta}) + \log p(\boldsymbol{\beta})\big]$$
🎯 7. 正則化の強さ λ の選び方
7.1 交差検証で選ぶ(基本)
📋 コピー import numpy as np
from sklearn.linear_model import RidgeCV , LassoCV
ridge = RidgeCV ( alphas = [ 0.01 , 0.1 , 1 , 10 , 100 ], cv = 5 ) . fit ( X , y )
print ( 'best alpha:' , ridge . alpha_ )
# alphas=None は新しい scikit-learn では使えない。
# 候補の配列を自分で渡すのが、どの版でも通る書き方
lasso = LassoCV ( alphas = np . logspace ( - 3 , 2 , 50 ), cv = 5 , max_iter = 10000 ) . fit ( X , y )
print ( 'best alpha:' , lasso . alpha_ )
7.2 1-SEルール
最小 CV 誤差から「1 標準誤差以内」で最も強い正則化(最も単純)を選ぶ。 解釈性重視のときに使う。
7.3 標準化を忘れない
L1/L2 ペナルティは係数のスケール に依存。 必ず StandardScaler でスケーリングする。
🧪 8. 深層学習における正則化
8.1 Weight Decay(L2 と等価)
$$\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta(\nabla L + \lambda \boldsymbol{\theta})$$
SGD では L2 正則化と等価だが、 Adam では AdamW として分離した方が良い。
8.2 Dropout
学習時に各ニューロンを確率 $p$ でランダムに 0 化する。 アンサンブル平均効果で過学習を抑える。
📋 コピー import torch.nn as nn
model = nn . Sequential (
nn . Linear ( 20 , 64 ), nn . ReLU (), nn . Dropout ( 0.3 ),
nn . Linear ( 64 , 32 ), nn . ReLU (), nn . Dropout ( 0.3 ),
nn . Linear ( 32 , 1 ),
)
8.3 Early Stopping
検証損失が改善しなくなった時点で学習を打ち切り、 最良時点の重みを使う。 暗黙的な正則化。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 best_loss = float ( 'inf' )
patience , wait = 10 , 0
for epoch in range ( 200 ):
train_one_epoch ()
val_loss = evaluate ()
if val_loss best_loss :
best_loss = val_loss
wait = 0
save_checkpoint ()
else :
wait += 1
if wait >= patience :
print ( f 'Early stop at epoch { epoch } ' )
break
8.4 データ拡張
訓練データを拡張 (画像なら回転・反転、 テキストなら同義語置換)して実効サンプル数を増やす。 効果的な暗黙的正則化。
8.5 BatchNorm / LayerNorm
各層の活性化を正規化することで学習を安定化。 副次的に正則化効果も持つ。
📊 9. 正則化手法の比較
手法
対象
主効果
特徴選択
適用場面
Ridge (L2) 線形・GLM 係数縮小 × 多重共線性
Lasso (L1) 線形・GLM 係数 0 化 ○ 高次元データ
Elastic Net 線形・GLM 縮小 + 選択 ○ 相関群あり
Dropout NN アンサンブル化 × 深層学習
Weight Decay NN L2 と等価 × 深層学習
Early Stopping NN・GBM 最適点で停止 × 反復学習
データ拡張 画像・テキスト 実効 n 増 × 深層学習
Ridge と Lasso の決定的な違いは「等高線が円か菱形か」という幾何的事実から導かれる。 ここを腑に落とすと、 「なぜ Lasso だけがゼロを生むか」が完全に分かる。
🔬 数式を言葉で読み解く — 罰則最小化と制約最小化の双対性
Ridge は次の 2 形式が同値:
$$\hat\beta^{Ridge} = \arg\min_\beta \sum_i (y_i - \mathbf{x}_i^\top \beta)^2 + \lambda \|\beta\|_2^2$$
$$\hat\beta^{Ridge} = \arg\min_\beta \sum_i (y_i - \mathbf{x}_i^\top \beta)^2 \quad \text{s.t.}\ \|\beta\|_2^2 \le t$$
λ と t は 1 対 1 対応する(KKT 条件)。 λ→∞ ↔ t→0(強い縮小)、 λ→0 ↔ t→∞(OLS)。
Lasso も同様に $\|\beta\|_1 \le t$ という菱形制約の双対表現を持つ。 重要なのは「等高線が制約領域に最初に触れる点が解」という幾何的解釈で、 **L2 円は丸いので軸上に触れにくく、 L1 菱形は頂点で軸上に触れやすい** → Lasso 解はスパース。
🔬 数式を言葉で読み解く — Ridge の解析解
Ridge は閉形式解を持つ:
$$\hat\beta^{Ridge} = (X^\top X + \lambda I_p)^{-1} X^\top y$$
OLS の $(X^\top X)^{-1}$ に対角 $\lambda I_p$ が加わり、 多重共線性で特異な $X^\top X$ を正則化(regularize)する。 これが「正則化」という名前の由来そのもの。
🔬 数式を言葉で読み解く — Lasso の劣勾配と座標降下法
Lasso の目的関数 $\|y - X\beta\|_2^2 + \lambda\|\beta\|_1$ は β=0 で微分不能。 劣勾配を使う:
$$\partial_{\beta_j} = -2 X_j^\top(y - X\beta) + \lambda \cdot \text{sign}(\beta_j)$$
座標降下では各 $\beta_j$ をソフト閾値関数で更新:
$$\hat\beta_j \leftarrow S_\lambda\!\left(\frac{X_j^\top r}{X_j^\top X_j}\right), \quad S_\lambda(z) = \text{sign}(z) \max(|z| - \lambda, 0)$$
閾値 λ より小さい入力は問答無用でゼロに切り落とされる。 これがスパース性を生む計算機構。
🔬 数式を言葉で読み解く
$\sum_i (y_i - \mathbf{x}_i^\top \boldsymbol{\beta})^2$ : 通常の最小二乗誤差(データへのあてはまり)
$\lambda$ : 正則化の強度(ラムダ、 ≥0)。 大きいほど罰則が強い → 係数が 0 に寄る
$\|\boldsymbol{\beta}\|_2^2 = \sum_j \beta_j^2$ : L2 ノルムの二乗。 全係数の二乗和を罰する(Ridge)
$\|\boldsymbol{\beta}\|_1 = \sum_j |\beta_j|$ : L1 ノルム。 絶対値和を罰する(Lasso)。 角があるため一部の $\beta_j$ がピッタリ 0 に
$\arg\min$ : 「最小化する $\boldsymbol{\beta}$ を求める」演算子。 損失+罰則の合計を最も小さくする係数を返す
🧮 SSDSE-B-2026 実値計算例 — 「消費支出 L3221」を α 別に予測
正則化の強さ α を変えると係数と CV-MSE がどう変わるか、 47 都道府県データ(SSDSE-B-2026)で具体的に確認します。 ここでは「消費支出 L3221(二人以上の世帯)」を目的変数、 数値列すべてを説明変数とした Ridge/Lasso を、 標準化済みで 5-fold CV にかけたときの一般的な傾向を掲載します(再現コードは下の Python 章を参照)。
α
Ridge CV-MSE
Lasso CV-MSE
Lasso 非ゼロ係数 / 全体
解釈
0.001 ≈ OLS と同等 ≈ OLS と同等 ほぼ全部 罰則がほぼ無効。 過学習リスク大
0.01 わずかに改善 わずかに改善 大半が残る 弱い縮小、 過学習対策には不十分
0.1 良好(CV最小近辺) 多くの場合最良 半分〜2/3 SSDSE-B-2026 で典型的に選ばれる α
1.0 縮小強い 残り 5-10 個程度 5-10 / 全体 特徴選択が強く効く
10.0 過剰縮小 ほぼ全部 0 0〜2 バイアスが大きすぎる
具体的に再現するためのコード(実行で実値が得られます):
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 L3221(消費支出(二人以上の世帯))
北海道 296,888
東京都 341,320
沖縄県 251,222
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import numpy as np , pandas as pd
from sklearn.linear_model import Ridge , Lasso
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
num = df . select_dtypes ( include = 'number' )
X = num . drop ( columns = [ 'L3221' ])
y = num [ 'L3221' ]
for alpha in [ 0.001 , 0.01 , 0.1 , 1.0 , 10.0 ]:
for name , M in [( 'Ridge' , Ridge ), ( 'Lasso' , Lasso )]:
pipe = Pipeline ([( 's' , StandardScaler ()), ( 'm' , M ( alpha = alpha , max_iter = 20000 ))])
mse = - cross_val_score ( pipe , X , y , cv = 5 ,
scoring = 'neg_mean_squared_error' ) . mean ()
print ( f 'α= { alpha : >7 } { name } : MSE = { mse : .3f } ' )
※ SSDSE-B-2026 の数値列構成・件数(47都道府県)によって CV-MSE の絶対値はやや変動します。 重要なのは α 0.1 付近で最小 、 α=10 で過剰縮小 という形 です。
🧮 ベイズ事前分布としての解釈 — 正則化 = MAP 推定
Ridge と Lasso は、 それぞれ係数 β に**ガウス事前分布**または**Laplace 事前分布**を置いた MAP 推定と等価。 これは正則化が単なる工学的 trick ではなく、 ベイズ統計の中で自然な位置を持つことを示す。
🔬 数式を言葉で読み解く — Ridge ↔ ガウス事前
$\beta_j \sim \mathcal{N}(0, \tau^2)$ の事前分布を仮定すると、 MAP 推定は
$$\arg\max_\beta \log p(y|X,\beta) + \log p(\beta) = \arg\min_\beta \|y - X\beta\|_2^2 + \frac{\sigma^2}{\tau^2}\|\beta\|_2^2$$
となり、 $\lambda = \sigma^2 / \tau^2$ と置けば Ridge に一致。 τ が大きい(事前が広い)と λ 小、 τ が小さいと λ 大。
🔬 数式を言葉で読み解く — Lasso ↔ Laplace 事前
$\beta_j \sim \text{Laplace}(0, b)$ では事前密度が $e^{-|\beta_j|/b}$ の形で、 対数尤度を取ると $-|\beta_j|/b$ → 罰則項が L1 になる。 $\lambda = 2\sigma^2 / b$。 Laplace 分布は原点に「尖り」を持つので、 係数を 0 に押し込みやすい。
📊 表: 事前分布と正則化の対応
事前分布 罰則形 対応する正則化
Gaussian $\mathcal{N}(0,\tau^2)$ $\lambda\|\beta\|_2^2$ Ridge
Laplace $\lambda\|\beta\|_1$ Lasso
Horseshoe 非凸ペナルティ SCAD, MCP の親戚
Spike-and-Slab $\ell_0$ 罰則の連続近似 ベイズ変数選択
Group Lasso 用事前 $\lambda \sum_g \|\beta_g\|_2$ Group Lasso
Cauchy 非凸 ロバスト推定
🧮 数式に値を入れて手で計算する: Ridge ペナルティ
合成 3 係数 β=[2,1,-0.5] で L2 ペナルティを計算する。
Step 1: ペナルティ
L2 = λ·Σβ²
λ=0.1: 0.1·(4+1+0.25) = 0.525
λ=1.0: 1.0·5.25 = 5.25
λ=10: 52.5
Step 2: 影響
λ 大 → 係数が縮小
Ridge は係数を 0 にしない (Lasso と違う)
🐍 Python で再現
📋 コピー import numpy as np
beta = np . array ([ 2 , 1 , - 0.5 ])
for lam in [ 0.1 , 1.0 , 10 ]:
print ( f "λ= { lam } : penalty = { lam * ( beta ** 2 ) . sum () } " )
📤 実行結果
λ=0.1: penalty = 0.525
λ=1.0: penalty = 5.25
λ=10: penalty = 52.5
💬 手計算 (Step 1) と Python 出力が完全一致。
🐍 13. ライブラリ早見表
手法
パッケージ・クラス
主要引数
Ridge回帰 sklearn.linear_model.Ridgealpha, solver, fit_intercept
RidgeCV sklearn.linear_model.RidgeCValphas, cv, scoring
Lasso回帰 sklearn.linear_model.Lassoalpha, max_iter, selection
LassoCV sklearn.linear_model.LassoCValphas, cv, max_iter
Elastic Net sklearn.linear_model.ElasticNetalpha, l1_ratio
L1 Logistic LogisticRegression(penalty='l1')C = 1/λ, solver='liblinear'
Dropout torch.nn.Dropoutp (dropout率)
Weight Decay torch.optim.SGD/AdamWweight_decay
Early Stop callbacks=lgb.early_stopping(N)stopping_rounds
📜 14. 正則化の歴史
1943 :Tikhonov regularization の原型(数学的逆問題)
1970 :Hoerl & Kennard が Ridge回帰 を統計に導入
1996 :Tibshirani の Lasso (Journal of the Royal Statistical Society)
2005 :Zou & Hastie の Elastic Net
2006 :Hastie/Tibshirani/Friedman 「The Elements of Statistical Learning」改訂版で標準化
2012 :Hinton の Dropout (AlexNet で広く知られる)
2014 :Srivastava らが Dropout 論文化
2017 :Loshchilov らが AdamW (Weight Decay 分離)
💼 15. 実務応用例
マーケティング :高次元の購買特徴(数千変数)から有効変数を Lasso で絞り込む
遺伝統計 :数万の SNP から疾患関連遺伝子を Lasso で同定
計量経済学 :多重共線性のある経済変数で Ridge を使う
深層学習 :Dropout / WD / Early Stop / データ拡張は事実上の標準
勾配ブースティング :early_stopping_rounds で過学習を抑える
公共政策評価 :因子数が観測数より多い設定での効果推定
正則化は実装ライブラリによって微妙に挙動が変わります。 ここでは 4 種類の代表的アプローチを並べ、 「同じデータ・同じ α でも結果が変わる可能性」を意識できるようにします。
🅰️ scikit-learn の Pipeline + GridSearchCV(推奨デフォルト)
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 L3221(消費支出(二人以上の世帯))
北海道 296,888
東京都 341,320
沖縄県 251,222
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import pandas as pd , numpy as np
from sklearn.linear_model import Ridge , Lasso , ElasticNet
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
num = df . select_dtypes ( include = 'number' )
X , y = num . drop ( columns = [ 'L3221' ]), num [ 'L3221' ]
# 教材では計算時間の都合で候補を絞っています
# (本来は alpha を 30 点、l1_ratio を 6 点、max_iter=30000 くらいで探索します)
pipe = Pipeline ([( 's' , StandardScaler ()), ( 'm' , ElasticNet ( max_iter = 5000 ))])
grid = { 'm__alpha' : np . logspace ( - 3 , 1 , 12 ),
'm__l1_ratio' : [ .1 , .5 , .9 , 1.0 ]}
gs = GridSearchCV ( pipe , grid , cv = 5 , scoring = 'neg_mean_squared_error' , n_jobs =- 1 )
gs . fit ( X , y )
print ( 'Best α:' , gs . best_params_ [ 'm__alpha' ])
print ( 'Best l1_ratio:' , gs . best_params_ [ 'm__l1_ratio' ])
print ( 'Best CV-MSE:' , - gs . best_score_ )
🅱️ statsmodels — 検定統計量も得たい場合
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 L3221(消費支出(二人以上の世帯))
北海道 296,888
東京都 341,320
沖縄県 251,222
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import statsmodels.api as sm
import pandas as pd
# 年度の列名は、英字コードで読むと 'SSDSE-B-2026'、日本語で読むと '年度'。
# ここでは英字コードの列(L3221 など)を使うので skiprows=[1] で読む
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' ,
skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
num = df . select_dtypes ( include = 'number' )
X = sm . add_constant ( num . drop ( columns = [ 'L3221' ]))
y = num [ 'L3221' ]
# Ridge は fit_regularized で L1_wt=0
res_ridge = sm . OLS ( y , X ) . fit_regularized ( alpha = 0.1 , L1_wt = 0 )
# fit_regularized の params は ndarray なので、列名を付け直してから表示する
print ( 'Ridge coef:' )
print ( pd . Series ( res_ridge . params , index = X . columns ) . head ())
# Lasso は L1_wt=1
res_lasso = sm . OLS ( y , X ) . fit_regularized ( alpha = 0.1 , L1_wt = 1 )
print ( 'Lasso non-zero:' , ( res_lasso . params != 0 ) . sum ())
🅲 scipy.optimize で「数式から」正則化を実装(教育用)
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 L3221(消費支出(二人以上の世帯))
北海道 296,888
東京都 341,320
沖縄県 251,222
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import numpy as np , pandas as pd
from scipy.optimize import minimize
from sklearn.preprocessing import StandardScaler
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
num = df . select_dtypes ( include = 'number' )
X = StandardScaler () . fit_transform ( num . drop ( columns = [ 'L3221' ]))
y = num [ 'L3221' ] . values
def ridge_loss ( beta , X , y , alpha ):
r = y - X @ beta
return r @ r + alpha * ( beta @ beta )
beta0 = np . zeros ( X . shape [ 1 ])
res = minimize ( ridge_loss , beta0 , args = ( X , y , 1.0 ), method = 'L-BFGS-B' )
print ( 'Ridge β:' , res . x . round ( 3 ))
def lasso_loss ( beta , X , y , alpha ):
r = y - X @ beta
return r @ r + alpha * np . abs ( beta ) . sum ()
res2 = minimize ( lasso_loss , beta0 , args = ( X , y , 1.0 ), method = 'L-BFGS-B' )
print ( 'Lasso β:' , res2 . x . round ( 3 ))
🅳 glmnet スタイル — RidgeCV / LassoCV / ElasticNetCV を一気に
📋 コピー from sklearn.linear_model import RidgeCV , LassoCV , ElasticNetCV
import numpy as np
# 教材では alpha の候補を 50 点 → 20 点に、max_iter を 30000 → 5000 に減らしています
alphas = np . logspace ( - 3 , 2 , 20 )
print ( 'Ridge α*:' , RidgeCV ( alphas = alphas , cv = 5 ) . fit ( X , y ) . alpha_ )
print ( 'Lasso α*:' , LassoCV ( alphas = alphas , cv = 5 , max_iter = 5000 , n_jobs =- 1 ) . fit ( X , y ) . alpha_ )
en = ElasticNetCV ( l1_ratio = [ .1 , .5 , .7 , .9 , .95 , .99 , 1.0 ],
alphas = alphas , cv = 5 , max_iter = 5000 , n_jobs =- 1 ) . fit ( X , y )
print ( 'EN α*, l1_ratio*:' , en . alpha_ , en . l1_ratio_ )
📦 ライブラリ別「正則化強度」パラメータ対応表
ライブラリ
パラメータ
大きい値 = 強い罰則?
sklearn Ridge / Lasso alphaはい
sklearn LogisticRegression Cいいえ(C = 1/α)
statsmodels fit_regularized alpha, L1_wtはい
glmnet (R) lambdaはい
XGBoost reg_alpha, reg_lambdaはい
PyTorch optimizer weight_decayはい
⚠️ 10. よくある落とし穴
落とし穴
対処
標準化を忘れる L1/L2 は係数スケールに依存。 必ず StandardScaler を Pipeline で。
切片に罰則をかける sklearn は既定で切片に罰則なし。 自前実装では注意。
λ を訓練データで選ぶ 必ず CV で選ぶ。 訓練最適は λ=0 になる。
Lasso の係数を「効果量」と誤解 縮小推定なので OLS の効果量とは別物。 推論をしたいなら別途 OLS で再推定。
Dropout を予測時にも使う 推論時は model.eval() で必ず Dropout を切る。
Early Stopping の判断にテスト集合 必ず検証集合を使う。 テスト集合はリーク厳禁。
Weight Decay を BN/LN にも適用 BN/LN のスケール・バイアスには WD をかけないのが標準。
🏋️ 11. 練習問題(SSDSE-B-2026)
Q1. 消費支出 L3221 を全数値列で予測する。 OLS・Ridge・Lasso・Elastic Net の 4 モデルを 5-fold CV で比較しなさい。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 L3221(消費支出(二人以上の世帯))
北海道 296,888
東京都 341,320
沖縄県 251,222
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import pandas as pd
from sklearn.linear_model import LinearRegression , Ridge , Lasso , ElasticNet
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
num = df . select_dtypes ( include = 'number' )
X = num . drop ( columns = [ 'L3221' ])
y = num [ 'L3221' ]
models = {
'OLS' : LinearRegression (),
'Ridge' : Ridge ( alpha = 10.0 ),
'Lasso' : Lasso ( alpha = 0.1 , max_iter = 10000 ),
'EN' : ElasticNet ( alpha = 0.1 , l1_ratio = 0.5 , max_iter = 10000 ),
}
for name , m in models . items ():
pipe = Pipeline ([( 'scale' , StandardScaler ()), ( 'm' , m )])
sc = cross_val_score ( pipe , X , y , cv = 5 , scoring = 'neg_mean_squared_error' )
print ( f ' { name } : MSE = { - sc . mean () : .2f } ' )
Q2. Lasso の正則化パスを描き、 どの順で係数が 0 に落ちるか観察しなさい。
本ページの 4.1 のコードを参考に、 SSDSE-B のすべての数値列を使って正則化パスを描き、 最も early に残る変数 3 つを言語化してください。
Q3. RidgeCV と LassoCV で選ばれた α と、 そのときの CV 誤差を比較しなさい。
📋 コピー from sklearn.linear_model import RidgeCV , LassoCV
import numpy as np
ridge = RidgeCV ( alphas = np . logspace ( - 3 , 3 , 50 )) . fit ( X , y )
lasso = LassoCV ( alphas = np . logspace ( - 3 , 3 , 50 ), cv = 5 , max_iter = 10000 ) . fit ( X , y )
print ( 'Ridge best α:' , ridge . alpha_ )
print ( 'Lasso best α:' , lasso . alpha_ )
print ( 'Lasso 非ゼロ係数:' , ( lasso . coef_ != 0 ) . sum (), '/' , len ( lasso . coef_ ))
📝 12. 報告フォーマット
❌ NG例
「Lasso を使ったら良い結果が出ました。」
✅ OK例
「20変数の入力に対し、 標準化後 LassoCV(5-fold, α grid = logspace(-3,3,50))で α = 0.12 を選択。 12 変数の係数が 0 となり、 残った 8 変数で MSE = 1.83 を達成(OLS = 2.71、 +33% 改善)。 残った変数は 1-SE ルールでも同一であり、 安定した選択と判断した。」
⚠️ 落とし穴(補強版 — 実務でやりがちな7パターン)
① 標準化を CV 全体ではなく fold 内でしない(情報リーク)
CV の外側で StandardScaler を fit してから cross_val_score に渡すと、 検証集合の統計量が訓練側に漏れます。 これは正則化された推定の汎化誤差を楽観評価 する重大なバグで、 論文でも頻繁に見られます。 正解は Pipeline で ('scaler', StandardScaler()) と ('model', Ridge()) を結び、 fold 内で fit/transform を完結させること。 sklearn の Pipeline はこれを自動でやってくれる強力なツールなので、 必ず使ってください。
② Lasso の係数を「重要度」と直接解釈する
Lasso は縮小 と変数選択 を同時に行うため、 残った係数は OLS の効果量より系統的に 0 に向かってバイアスがかかって います。 つまり「Lasso 係数が 0.3」は「真の効果量が 0.3」ではなく、 0 寄りに圧縮された値です。 解釈・推論を目的とするなら、 Lasso で変数選択した後に選ばれた変数だけで OLS を再フィット する「post-selection OLS」が定番。 ただし、 これも厳密な信頼区間としては問題があり、 Tibshirani らの「selective inference」を併用する必要があります。
③ α の最小値だけで決めずに 1-SE ルールを忘れる
CV-MSE が最小の α を選ぶのが基本ですが、 「最小値 + 1 標準誤差以内 の中で最も罰則が強い α」を選ぶ「1-SE ルール」が推奨されます。 これは CV 誤差自体に推定誤差があるためで、 統計的に同等な α の中ではより単純(=罰則の強い)モデルを選ぶ方が、 新規データに対する性能が安定するからです。 SSDSE-B のような n=47 の小標本では特に重要で、 これを忘れると α が過小評価されがちです。
④ Ridge を変数選択に使ってしまう
Ridge は係数を 0 に縮める力はあっても正確に 0 にすることはほぼない ので、 変数選択には向きません。 「変数を減らしたい」のなら Lasso か Elastic Net を使うべきです。 一方で、 「全変数を残しつつ係数を安定化したい」(特に多重共線性がある場合)には Ridge が最適。 目的に応じて使い分けを意識しましょう。 「とりあえず Ridge」「とりあえず Lasso」は思考停止のサインです。
⑤ ダミー変数を標準化してしまう
カテゴリ変数を one-hot 化したダミー(0/1)を StandardScaler に通すと、 (0−p̂)/√(p̂(1−p̂)) のような変換になり、 解釈が難しくなります。 罰則の効き方も意図とずれます。 多くの実装で連続変数だけ標準化し、 ダミーはそのまま渡すのが定石。 ColumnTransformer で連続列だけ StandardScaler、 ダミー列は passthrough または OneHotEncoder で分けて処理してください。
⑥ Elastic Net の l1_ratio をデフォルトのまま動かさない
sklearn の ElasticNet は l1_ratio=0.5 がデフォルトですが、 これが最適とは限りません。 ElasticNetCV では l1_ratio=[.1, .5, .7, .9, .95, .99, 1] のようにグリッドで探すのが標準です。 l1_ratio=1 だと Lasso、 0 だと Ridge と等価なので、 自分のデータで最適なバランスを探りましょう。 「Elastic Net 使いました」だけでは不十分で、 l1_ratio と α の両方を報告するのが論文・実務での作法です。
⑦ Weight Decay を「等価な L2」だと盲信する(Adam の罠)
SGD では Weight Decay と L2 正則化は数学的に等価ですが、 Adam では一致しません 。 Adam は勾配を分散で正規化するため、 L2 損失に加える形では効果が歪みます。 Loshchilov & Hutter(2017)が提案した AdamW は、 Weight Decay を分離して適用することで、 本来の正則化効果を取り戻しました。 深層学習で正則化を語るときは Adam + weight_decay ではなく AdamW を使うのが現在の標準です。
⚠️ 正則化の 7 つの落とし穴
標準化を忘れると罰則が単位依存になる — 「面積(㎡)と価格(円)」を混ぜると、 円のスケールに罰則が引きずられ、 面積係数が異常に縮小。 必ず StandardScaler で X を標準化。 sklearn の Ridge は normalize が deprecated になったので、 Pipeline で手動標準化が必須。
λ を CV せずに勘で決める — λ=1 をデフォルトで使うと、 データのスケールによっては「OLS と区別不能」あるいは「全て 0」になる。 必ず RidgeCV / LassoCV / ElasticNetCV で対数スケール(np.logspace(-4, 4, 100))から選択。
Lasso の係数を有意性として誤読 — Lasso でゼロにならなかった係数は「重要」ではない。 同じ λ で再学習しただけで別の変数が選ばれることがある(不安定)。 Stability Selection(RandomizedLasso)や bootstrap 平均を併用。
多重共線群で Lasso が代表 1 つだけ拾う — 相関 0.99 の 2 変数があると Lasso はランダムに片方を 0 にする。 「両方とも意味があるのに片方しか選ばれない」誤読が起きる。 ElasticNet や Group Lasso に切替。
非線形効果を取りこぼす — 罰則は線形項に対してのみ。 「特徴量と y が U 字関係」だと、 Ridge/Lasso では捉えられない。 多項式特徴量(PolynomialFeatures)や Spline 拡張後に正則化を適用。
λ の単調性に過信 — 「λ が大きいほど係数は単調に縮む」と思い込みがちだが、 Lasso では λ の経路に沿って **係数の符号が反転** することもある(特に多重共線下)。 lasso_path で経路を可視化して確認。
Lasso の漸近正規性を仮定して t 検定 — OLS と違い、 Lasso 係数の漸近分布は単純な正規分布にならない。 信頼区間が欲しいなら **debiased Lasso**、 **selective inference**(Lee et al., 2016)、 もしくは bootstrap を使う。
🛠 λ 選択の 5 手法とその使い分け
λ 選択は正則化の中心的問いで、 文脈に応じた 5 つの方法がある。
手法 原理 推奨ケース
K-fold CV CV-RMSE 最小 予測精度重視、 標準
1-SE rule 最小 + 1SE の最大 λ 解釈性重視、 よりスパースに
AIC / BIC 情報量規準 CV が計算困難な大規模
経路アルゴリズム 全 λ に対する解を一括計算 解釈と可視化
empirical Bayes 事前分布のハイパーパラメータ MLE ベイズ的解釈
🐍 1-SE rule で Lasso の λ を「より保守的」に選ぶ
このコードでやること : LassoCV で CV 曲線を取り、 最小値 + 1SE の範囲で最大の λ を選ぶ(R の glmnet のデフォルトと同じ流儀)。
📋 コピー 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 import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.model_selection import KFold
# Xs / ys はこのブロックで作る(標準化した X と、配列にした y)
Xs = StandardScaler () . fit_transform ( X )
ys = np . asarray ( y , dtype = float )
alphas = np . logspace ( - 3 , 2 , 100 )
kf = KFold ( n_splits = 10 , shuffle = True , random_state = 42 )
mse_path = np . zeros (( len ( alphas ), 10 ))
for j , ( tr , va ) in enumerate ( kf . split ( Xs )):
for i , a in enumerate ( alphas ):
m = Lasso ( alpha = a , max_iter = 10000 ) . fit ( Xs [ tr ], ys [ tr ])
mse_path [ i , j ] = np . mean (( ys [ va ] - m . predict ( Xs [ va ])) ** 2 )
mean = mse_path . mean ( axis = 1 )
se = mse_path . std ( axis = 1 ) / np . sqrt ( 10 )
i_min = np . argmin ( mean )
i_1se = np . max ( np . where ( mean <= mean [ i_min ] + se [ i_min ])[ 0 ])
print ( f "min CV: α = { alphas [ i_min ] : .4f } , MSE = { mean [ i_min ] : .4f } " )
print ( f "1-SE: α = { alphas [ i_1se ] : .4f } , MSE = { mean [ i_1se ] : .4f } " )
print ( f "非ゼロ係数 (1-SE 解) = "
f " { sum ( abs ( Lasso ( alpha = alphas [ i_1se ], max_iter = 10000 ) . fit ( Xs , ys ) . coef_ ) > 1e-6 ) } " )
📤 実行例:
min CV: α = 1.0723, MSE = 21.2704
1-SE: α = 1.2045, MSE = 26.7427
非ゼロ係数 (1-SE 解) = 10
💬 SSDSE-B-2026 の 2023 年・47 都道府県(n=47、 説明変数 109 列)で実際に走らせると、 1-SE ルールが選ぶ α は最小 CV の 1.0723 に対し 1.2045、 わずか 1.12 倍 にしかならず、 非ゼロ係数も 10 個のまま変わらない 。 α の候補を 100 点に細かく刻んだうえ CV 誤差の谷が浅いためで、 「1-SE ルールを使えば必ずモデルが小さくなる」わけではないことが分かる。 1-SE ルールはあくまで同程度の誤差なら単純な方を選ぶ という基準であり、 効き方はデータ次第。 なお CV MSE が 21 と極端に小さいのは、 n=47 に対し p=109 と変数が多く、 L3221 と強く連動する費目列が説明変数側に残っているため(実務ではこうした漏れを先に取り除く)。
🔗 関連用語
🔗 関連用語(前提・並列・発展)
📚 前提となる用語(先に押さえると本ページが楽になる)
重回帰分析 — 正則化はその上に重ねる罰則項であり、 OLS の理解が前提
過学習 — そもそも正則化が解決したい問題
バイアス・分散分解 — 正則化はバイアスを増やして分散を減らす 操作だと理解する基盤
標準化 — L1/L2 罰則は係数のスケールに依存するので、 標準化は前提
交差検証 — α の選択は CV なしには成立しない
🔄 並列・同じレベルの用語(互いに比較される)
🚀 発展・応用(本ページを理解した後に進む先)
🧪 SSDSE-B-2026 47 県重回帰で Ridge / Lasso / ElasticNet を比較
正則化の威力を実データで確かめる。 SSDSE-B-2026(2023 年度・47 都道府県)で「A4101 出生数」を被説明変数に、 人口規模と強く相関する 10 の社会経済指標から重回帰し、 OLS・Ridge・Lasso・ElasticNet の係数と汎化性能を比較する。
📥 入力データ: 47 県 × 10 説明変数
被説明変数 A4101 出生数、 説明変数は総人口・年少人口・高齢人口・死亡数・婚姻件数・小学校児童数・中学校生徒数・一般診療所数・保育所等数・消費支出の 10 列。 多重共線性が強い(総人口 A1101 と年少人口 A1301 は相関 0.997、 A1101 と死亡数 A4200 は 0.989 など)。
サンプル数 n = 47
特徴量数 p = 10
y = A4101 (出生数)
X 各列の VIF:
E2501 (小学校児童数) = 14412.5 ← 多重共線性深刻
A1301 (年少人口) = 14055.6 ← 多重共線性深刻
E3501 (中学校生徒数) = 6497.7 ← 多重共線性深刻
A1303 (高齢人口) = 5864.4 ← 多重共線性深刻
A1101 (総人口) = 5716.1 ← 多重共線性深刻
L3221 (消費支出) = 1.6 ← ほぼ独立
🐍 OLS が暴れる例 — 大きすぎる係数と係数符号の反転
このコードでやること : 標準化済み 10 変数で OLS を当て、 係数の絶対値と CV RMSE を確認。 多重共線性で係数が暴れる現象を観察。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression , Ridge , Lasso , ElasticNet , RidgeCV , LassoCV , ElasticNetCV
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
latest = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
features = [ 'A1101' , 'A1301' , 'A1303' , 'A4200' , 'A9101' ,
'E2501' , 'E3501' , 'I5102' , 'J2503' , 'L3221' ]
X = latest [ features ] . values
y = latest [ 'A4101' ] . values
sc_X = StandardScaler (); sc_y = StandardScaler ()
Xs = sc_X . fit_transform ( X )
ys = sc_y . fit_transform ( y . reshape ( - 1 , 1 )) . ravel ()
ols = LinearRegression () . fit ( Xs , ys )
print ( "OLS 係数 (絶対値ソート):" )
for f , c in sorted ( zip ( features , ols . coef_ ), key = lambda x : - abs ( x [ 1 ]))[: 5 ]:
print ( f " { f } : { c : +.3f } " )
print ( f " \n OLS CV-RMSE (10-fold) = "
f " { np . sqrt ( - cross_val_score ( ols , Xs , ys , cv = 10 , scoring = 'neg_mean_squared_error' )) . mean () : .3f } " )
📤 実行例:
OLS 係数 (絶対値ソート):
A1301: +2.099 ← 異常に大きい
E3501: -0.825 ← 符号が直感と逆
A1101: -0.432 ← 符号が直感と逆
A9101: +0.340
E2501: -0.236
OLS CV-RMSE (10-fold) = 0.050
💬 年少人口 A1301 の係数が +2.1 と突出し、 総人口 A1101 と中学校生徒数 E3501 に負号が立つ。 いずれも「多い県ほど出生数も多い」はずで、 この負号は多重共線性(VIF が数千〜1.4 万)の典型症状。 CV-RMSE 0.050 は標準化スケールでの誤差。
🐍 Ridge — L2 罰則で全係数を縮小
このコードでやること : RidgeCV で α を CV 自動選択。 OLS との係数比較で「縮小」を観察。
📋 コピー alphas = np . logspace ( - 3 , 3 , 50 )
ridge = RidgeCV ( alphas = alphas , cv = 10 ) . fit ( Xs , ys )
print ( f "最適 α (Ridge) = { ridge . alpha_ : .3f } " )
print ( "Ridge 係数:" )
for f , c in sorted ( zip ( features , ridge . coef_ ), key = lambda x : - abs ( x [ 1 ]))[: 5 ]:
print ( f " { f } : { c : +.3f } " )
ridge_cv = np . sqrt ( - cross_val_score (
Ridge ( alpha = ridge . alpha_ ), Xs , ys , cv = 10 , scoring = 'neg_mean_squared_error' )) . mean ()
print ( f " \n Ridge CV-RMSE = { ridge_cv : .3f } " )
📤 実行例:
最適 α (Ridge) = 0.001
Ridge 係数:
A1301: +1.626
E3501: -0.661
A1101: -0.419
A9101: +0.372
A1303: +0.104
Ridge CV-RMSE = 0.052
💬 交差検証は弱い罰則(α=0.001)を選んだ。 出生数は人口規模でほぼ決まるため OLS でも汎化誤差は小さく(0.050→0.052)、 ここでの Ridge の主効果は RMSE 改善よりも係数の安定化にある。 最大係数は 2.1→1.6 へ緩み、 極端な暴れが和らぐ。 📝 より正確な分析(教材補足) :正則化は常に RMSE を下げるわけではない。 誤差がほぼ説明され尽くしている問題では、 正則化の価値は「係数の分散を抑えて解釈を安定させる」点に現れる。
🐍 Lasso — L1 罰則でスパース解(変数選択)
このコードでやること : LassoCV で α 自動選択。 ゼロになった係数を確認し、 「自動変数選択」効果を観察。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12 lasso = LassoCV ( alphas = alphas , cv = 10 , max_iter = 10000 ) . fit ( Xs , ys )
print ( f "最適 α (Lasso) = { lasso . alpha_ : .4f } " )
print ( "Lasso 係数:" )
for f , c in zip ( features , lasso . coef_ ):
status = "(選択)" if abs ( c ) > 1e-6 else "(ゼロ:除外)"
print ( f " { f } : { c : +.3f } { status } " )
nz = sum ( abs ( lasso . coef_ ) > 1e-6 )
print ( f " \n 非ゼロ係数 = { nz } / { len ( features ) } " )
lasso_cv = np . sqrt ( - cross_val_score (
Lasso ( alpha = lasso . alpha_ , max_iter = 10000 ),
Xs , ys , cv = 10 , scoring = 'neg_mean_squared_error' )) . mean ()
print ( f "Lasso CV-RMSE = { lasso_cv : .3f } " )
📤 実行例:
最適 α (Lasso) = 0.0023
Lasso 係数:
A1101: +0.000 (ゼロ:除外)
A1301: +0.721 (選択)
A1303: -0.000 (ゼロ:除外)
A4200: -0.000 (ゼロ:除外)
A9101: +0.180 (選択)
E2501: +0.000 (ゼロ:除外)
E3501: +0.000 (ゼロ:除外)
I5102: +0.104 (選択)
J2503: +0.000 (ゼロ:除外)
L3221: -0.007 (選択)
非ゼロ係数 = 4 / 10
Lasso CV-RMSE = 0.045
💬 Lasso は 10 変数中 6 個を**完全ゼロ**にし、 年少人口 A1301・婚姻件数 A9101・一般診療所数 I5102・消費支出 L3221 の 4 つだけ残した。 CV-RMSE 0.045(最適 α = 0.0023)。 相関 0.997 の A1101/A1301 群からは A1301 だけを代表として拾うため、 解釈性が大幅に向上する。
🐍 ElasticNet — L1+L2 のハイブリッド
このコードでやること : ElasticNetCV で l1_ratio と α を同時 CV 探索。 多重共線群を「全選択 or 全除外」する Ridge と「代表 1 個拾い」の Lasso の中間挙動を見る。
📋 コピー en = ElasticNetCV ( l1_ratio = [ 0.1 , 0.3 , 0.5 , 0.7 , 0.9 , 0.95 , 0.99 ],
alphas = alphas , cv = 10 , max_iter = 10000 ) . fit ( Xs , ys )
print ( f "最適 α = { en . alpha_ : .4f } " )
print ( f "最適 l1_ratio = { en . l1_ratio_ : .2f } " )
nz = sum ( abs ( en . coef_ ) > 1e-6 )
print ( f "非ゼロ係数 = { nz } / { len ( features ) } " )
en_cv = np . sqrt ( - cross_val_score (
ElasticNet ( alpha = en . alpha_ , l1_ratio = en . l1_ratio_ , max_iter = 10000 ),
Xs , ys , cv = 10 , scoring = 'neg_mean_squared_error' )) . mean ()
print ( f "ElasticNet CV-RMSE = { en_cv : .3f } " )
📤 実行例:
最適 α = 0.0031
最適 l1_ratio = 0.99
非ゼロ係数 = 4 / 10
ElasticNet CV-RMSE = 0.044
💬 l1_ratio=0.99 → ほぼ Lasso 寄り。 非ゼロ係数 4 個で Lasso と同じ変数を選択。 多重共線群でも代表選択しつつ縮小も効き、 CV-RMSE は Lasso と並ぶ最良水準(0.044)。
📚 章構成
📘 必読書 : Hastie, Tibshirani, Wainwright (2015) Statistical Learning with Sparsity: The Lasso and Generalizations . CRC Press. — Lasso 系の決定版
📗 原典論文 : Tibshirani (1996) "Regression shrinkage and selection via the lasso", JRSS B 58(1), 267-288. 引用 8 万超
📕 Ridge 原典 : Hoerl, Kennard (1970) "Ridge regression: Biased estimation for nonorthogonal problems", Technometrics 12(1), 55-67
📙 Elastic Net : Zou, Hastie (2005) "Regularization and variable selection via the elastic net", JRSS B 67(2), 301-320
📓 正則化の幾何 : Friedman, Hastie, Tibshirani (2010) "Regularization Paths for Generalized Linear Models via Coordinate Descent", JSS 33(1) — glmnet 論文
📔 Selective inference : Lee, Sun, Sun, Taylor (2016) "Exact post-selection inference, with application to the lasso", AoS 44(3), 907-927
📒 scikit-learn ユーザガイド : Linear Models 1.1 節(Ridge), 1.3 節(Lasso), 1.5 節(ElasticNet)
📷 正則化の視覚的整理 (Round 262 追補)
正則化は「複雑さに罰則を与えてモデルを単純化する」操作。 罰則のかけ方 (L1/L2) と効果を 3 図で整理する。
図A: 正則化の概念。 損失関数 = 誤差項 + 罰則項。 罰則項が係数を 0 方向に引き寄せ、 過学習を抑制する。 罰則の強さは λ (alpha) で制御。
図B: Ridge (L2) は係数を「縮小」する。 Lasso (L1) は係数の一部を「ちょうど 0」にする = 自動変数選択。 ElasticNet は両者の混合 (α で比率を調整)。
図C: 多重共線性 (説明変数同士が強相関) のとき OLS は分散爆発を起こす。 Ridge は分散を抑え、 推定を安定化させる。
→ 図 A→B→C は、 正則化の「動機 (過学習)」「種類 (L1/L2)」「効果 (分散安定)」を 1 章で見渡す視覚地図。 実務では Ridge を第一選択にし、 解釈性が必要なときに Lasso/ElasticNet に切り替える。
✅ 正則化を使うときの条件・チェックリスト (Round 262 追補)
正則化は万能ではない。 以下 8 条件を確認しないと「罰則をかけすぎて欠落バイアス」「罰則を強化したがクロスバリデーションをしていない」等の典型ミスに陥る。
# 条件 違反するとどうなるか 対応
1 特徴量の標準化 係数のスケール差で罰則が不公平にかかる 必ず 標準化 してから fit
2 切片に罰則をかけない 予測値が中心から外れる scikit-learn は fit_intercept=True がデフォルト、 切片には罰則を課さない設計
3 λ (alpha) のクロスバリデーション 固定値での選択は過学習・過罰則 RidgeCV / LassoCV を使う
4 train/test 分離 テストデータで標準化すると情報リーク パイプライン (Pipeline) で fit を学習データに限定
5 多重共線性の事前確認 L1 では相関の強い変数のどれが残るかランダム VIF を確認、 高ければ ElasticNet を選択
6 カテゴリ変数の扱い One-Hot 全体に罰則が等しくかかると不自然 Group Lasso、 もしくは事前に頻度の少ないカテゴリを統合
7 サンプルサイズと特徴量数 p ≫ n のとき OLS は解けない、 Lasso は安定 n < p のときは Lasso / ElasticNet を第一選択
8 解釈性と予測性能のトレードオフ Ridge は予測◎ 解釈× / Lasso は解釈◎ 予測△ 目的に応じて切り替え、 ElasticNet で中間
条件 1 (標準化) と条件 3 (CV) は必須。 これを忘れると、 高校レベルの誤りで論文採点・コンペ評価が下がる。
🎯 正則化の選び方フロー (Round 262)
状況 推奨手法 理由
特徴量数 p < サンプル数 n、 多重共線性が弱い OLS で十分、 必要なら Ridge 分散爆発のリスクが小さい
p ≈ n または p > n、 解釈性が必要 Lasso (L1) 不要変数を自動で 0 にし、 解釈しやすい
p > n、 相関の強い変数群がある ElasticNet Lasso 単独だと相関群からランダム 1 本選択する欠点を補う
カテゴリ変数の One-Hot がある Group Lasso 同じ元変数のダミーをまとめて 0 にする
深層学習の過学習 L2 weight decay / Dropout L1 だとスパース化が学習を不安定にする
解の安定性が最重要 Ridge 解は閉形式、 微小なデータ変動に強い
→ 「Ridge を起点に、 解釈・スパース性が必要になったら Lasso/ElasticNet へ」 が一般的な判断順序。 scikit-learn では Pipeline + GridSearchCV で同時に評価できる。
⚠️ 正則化での典型ミス 5 選
ミス 結果 修正
標準化せずに Ridge/Lasso スケールの大きい変数だけ縮小される StandardScaler を Pipeline に組み込む
α を 0.1 等で固定 過罰則 or 過小罰則、 偶然の結果 RidgeCV/LassoCV で 1e-4 〜 1e+4 を log scale で探索
テストデータも含めて fit_transform 情報リーク、 楽観的評価 Pipeline + cross_val_score
係数 = 0 を「重要でない」と解釈 強相関の代表変数が選ばれただけかも VIF と相関行列を併記
誤差項に罰則を含めて報告 OLS と比較できない R^2 や MSE は罰則項を含まず純粋な誤差で算出
🧮 SSDSE-B-2026 で見る正則化の効果
SSDSE-B-2026 の都道府県データで「出生数 A4101」を多数の変数 (総人口 A1101、 年少人口 A1301、 高齢人口 A1303、 婚姻件数 A9101 等) から予測する場合を考える。 OLS, Ridge, Lasso を比較すると以下のような典型的な傾向が出る。
手法 特徴 予測 R^2 (CV) 非ゼロ係数 解釈
OLS 罰則なし 約 0.93 (不安定) 全変数 多重共線性で係数の符号が不自然
Ridge α=1 L2 罰則 約 0.94 (安定) 全変数 (縮小) 係数は全体に小さくなる、 解釈は難
Lasso α=0.1 L1 罰則 約 0.93 5-7 個 主要変数のみ残り解釈しやすい
ElasticNet α=0.5, l1_ratio=0.5 L1+L2 約 0.94 10 個前後 相関群から複数残す、 バランス型
→ 「予測性能」だけ見ると Ridge と ElasticNet が良いが、 「どの変数が重要か」を知りたいときは Lasso が有用。 SSDSE-B-2026 のように説明変数間で相関が強い (総人口 A1101 ↔ 出生数 A4101 は r=0.995、 総人口 ↔ 婚姻件数 A9101 は r=0.989 等) 場合、 ElasticNet が最も実用的。
📐 L1 と L2 の幾何学的直感
項目 L1 (Lasso) L2 (Ridge)
罰則項の形 Σ|β_j| (絶対値の和) Σβ_j^2 (二乗の和)
制約領域の形状 菱形 (ダイヤモンド) 円 (球)
角の特性 軸上に角を持つ → 解が軸上に乗る → スパース 角がない → 解は厳密に 0 になりにくい
解の閉形式 存在せず、 座標降下法など反復計算 存在: β = (X'X + αI)^(-1) X'y
計算コスト 反復計算で重め、 並列化困難 1 回の線形代数、 軽量
微分可能性 原点で微分不可能 → サブグラディエント 常に微分可能
「L1 の制約領域が軸上に角を持つから、 最適解が角に乗りやすく β_j = 0 になりやすい」 という幾何的直感が、 Lasso が変数選択を行う理由。 教科書 (Hastie, Tibshirani, Friedman "Elements of Statistical Learning" Fig. 3.11) で必ず出る図。
🔬 ハイパーパラメータ α の選択手順
段階 処理 具体例
1 α の候補を log scale で生成 alphas = np.logspace(-4, 4, 100)
2 標準化を含む Pipeline 構築 Pipeline([('sc', StandardScaler()), ('reg', Ridge())])
3 K-fold CV (例 K=5) RidgeCV(alphas=alphas, cv=5)
4 各 α で平均検証スコア計算 負の MSE または R^2
5 最良 α を選択 model.alpha_
6 選ばれた α で全データで再学習 RidgeCV は自動的に行う
7 テストデータで最終評価 train/test 分離は事前に実施
「one-standard-error rule」: 最良 α そのものでなく、 「最良 α の検証スコアから 1 標準誤差以内で最もシンプルなモデル」を選ぶ。 これにより過剰適合を回避できる (Breiman 1984)。 LassoCV にもこの考えが組み込まれている。
📜 正則化の歴史的展開
年 人物 貢献
1943 Tikhonov 逆問題の正則化 (リッジ回帰の原型)
1962 Hoerl 「ridge regression」命名、 工学分野で使用
1970 Hoerl & Kennard 「Ridge Regression」を統計学に紹介
1996 Tibshirani Lasso (Least Absolute Shrinkage and Selection Operator) 提案
2004 Efron, Hastie, Johnstone, Tibshirani LARS (Least Angle Regression) で Lasso の解パスを高速計算
2005 Zou & Hastie ElasticNet 提案、 L1 と L2 の混合
2009 Friedman, Hastie, Tibshirani glmnet パッケージ公開、 大規模高速計算が可能に
2010 代 — 深層学習で L2 weight decay と Dropout が事実上の正則化
2020 代 — 大規模言語モデルで「正則化なしでも汎化する」二重降下 (double descent) 現象が注目
「過学習を防ぐ罰則」というシンプルな発想が、 線形回帰から深層学習まで形を変えて生き続けている。 現代の深層学習における weight decay, Dropout, Early Stopping, Data Augmentation はすべて正則化の一形態。
🎯 正則化とバイアス・分散トレードオフ
正則化を理解する最も重要な視点が、 「バイアス・分散トレードオフ」 である。 罰則を強くする (α を上げる) と、 モデルの自由度が下がり、 訓練データへの当てはまり (バイアス) は悪化するが、 訓練データの揺らぎに対する敏感さ (分散) は減る。 逆に罰則を弱くすると、 訓練データへの当てはまりは良くなるが、 微小なデータ変動で係数が大きく動く。 最適な α は「バイアス + 分散」が最小になる点で、 これがクロスバリデーションで決定すべき値。
直感的には、 「罰則 = モデル複雑さへの税金」 と考えると分かりやすい。 税率を上げれば過剰な複雑さ (係数の暴走) は抑えられるが、 必要な複雑さも削られる。 税率がちょうど良いところで、 過学習せず過小学習でもないモデルが得られる。 訓練データだけ見ていると「税金は安いほど良い」 と錯覚するが、 未知データ (検証データ) では「適度な税金」が最良なのが正則化の本質。 SSDSE-B-2026 のような小サンプル (47 件) では特に過学習しやすく、 適切な正則化が結果を大きく改善する。
🤖 深層学習における正則化の現代的形態
深層学習でも正則化は不可欠だが、 形を変えて実装されている。 「Weight decay」 は L2 罰則を勾配降下の更新式に組み込んだもので、 PyTorch の optim.SGD(weight_decay=0.01) や optim.AdamW で広く使われる。 「Dropout」 は学習時にランダムにニューロンを 0 にして、 過剰な依存を防ぐ。 「Batch Normalization」 は各層の出力を正規化することで間接的に正則化効果を持つ。 「Early Stopping」 は検証損失が増え始めた時点で学習を止め、 過学習を回避する。 「Data Augmentation」 は学習データに人為的なバリエーション (回転・反転・ノイズ) を加えてモデルの汎化を促す。 すべて「複雑さを抑えて汎化性能を上げる」 という同じ原理。
2019 年に Belkin らが報告した「二重降下 (double descent)」 現象は、 「モデルが過剰にパラメータ化されると、 一旦悪化した汎化性能が再び改善する」 というもので、 大規模言語モデルや CNN で観察される。 これは古典的な正則化理論の枠を超える現象で、 「明示的な正則化なしでも、 過剰パラメータ化が暗黙的な正則化を生む」 という新しい解釈を示唆している。 ただし、 現実のほとんどの実務 (中規模データ・中規模モデル) では古典的な正則化が依然として有効。 初学者は「正則化は必須」 と覚えて差し支えない。
📋 正則化のベストプラクティス・チェックリスト
実務で正則化を使うときの推奨手順は以下のとおり。 (1) まずデータを訓練・検証・テストに分割 (典型的には 60-20-20)。 (2) 訓練データのみで StandardScaler.fit し、 検証・テストには transform のみ適用。 (3) Pipeline で前処理とモデルを連結し、 GridSearchCV または RidgeCV/LassoCV で α を選択。 (4) one-standard-error rule で最適 α 周辺の最も保守的なモデルを選ぶ。 (5) 検証セットで最終評価し、 過学習の兆候 (訓練 R^2 ≫ 検証 R^2) を確認。 (6) テストセットで一度だけ最終評価し、 報告する。 この手順を守れば、 情報リークと α 選択ミスを大きく減らせる。
SSDSE-B-2026 のような小サンプルデータでは、 K-fold CV の K を 5 か 10 に設定し、 LOOCV (leave-one-out) も検討に値する。 ただし LOOCV は計算量が大きいので、 47 サンプル程度なら問題ないが大きいデータでは避ける。 正則化のα を決めるだけでなく、 特徴量エンジニアリング (相関の強い変数の統合、 非線形変換) も検討するとよい。 正則化は「魔法の弾丸」 ではなく、 適切な特徴量設計と組み合わせて初めて真価を発揮する。 また、 解釈可能性が重要な場合 (政策決定、 医療判断 等) は Lasso による変数選択結果をドメイン専門家と検討する協働プロセスが必須。
Ridge / Lasso / ElasticNet 以外にも多様な正則化手法が研究されている。 「Group Lasso」 は変数を事前にグループ化し、 グループ単位で罰則を適用する手法で、 One-Hot エンコードされたカテゴリ変数や、 関連する変数群を同時に選択/排除したい場合に有効。 「Fused Lasso」 は係数の隣接差分にも罰則を加え、 時系列や順序付き変数で滑らかな変化を促す。 「Adaptive Lasso」 は OLS 推定値を重みとして罰則を調整し、 「Oracle property」 (真のモデルを漸近的に選択できる性質) を満たす。 「Group SCAD」 や「MCP」 は非凸罰則を導入し、 大きな係数への過剰な罰則を抑える。
高次元データ (p ≫ n) では「screening rules」 という前処理で多数の変数を事前に除去し、 計算量を減らす技法も使われる。 例えば「Strong Rules」 (Tibshirani et al. 2012) は、 α が変化したときに非ゼロ係数になりうる変数を事前推定し、 安全に除外できる変数を特定する。 これにより遺伝子発現データ (数万変数) でも Lasso が実用的に解ける。 SSDSE-B-2026 程度のデータでは不要だが、 ゲノミクスやテキスト分析の高次元データでは必須の技術。
💻 scikit-learn での実装パターン
scikit-learn では正則化を含むモデルは linear_model モジュールに集約されている。 Ridge, Lasso, ElasticNet に加え、 自動的に α をクロスバリデーションで選ぶ RidgeCV, LassoCV, ElasticNetCV がある。 これらは Pipeline と組み合わせることで、 標準化→fit→予測の流れをまとめて記述できる。 特に Pipeline([('sc', StandardScaler()), ('reg', RidgeCV(alphas=np.logspace(-4, 4, 100), cv=5))]) はコンペでも研究でも標準的な書き方。
予測精度の評価には cross_val_score を使い、 scoring='r2' または 'neg_mean_squared_error' を指定する。 学習曲線 (learning curve) は sklearn.model_selection.learning_curve で描画でき、 訓練データを増やすにつれて訓練・検証スコアがどう変化するかを可視化できる。 この曲線で「訓練と検証の差が大きい」 = 過学習 = 正則化を強くする、 「両者とも低い」 = 過小学習 = モデルを複雑にする、 という診断ができる。 SSDSE-B-2026 では特徴量を増減させながら学習曲線を描画する課題が良い教育素材となる。
📝 正則化のまとめと実務的指針
正則化は「モデルの複雑さに罰則を与えて過学習を防ぐ」 という単純な発想だが、 線形回帰から深層学習まで幅広く応用される基礎技術である。 L1 (Lasso) はスパース性を生み変数選択に有用、 L2 (Ridge) は係数の縮小に有用、 ElasticNet は両者の混合でバランス型、 という基本構造を覚えておくとよい。 適切な λ (alpha) はクロスバリデーションで決めるのが原則で、 標準化と組み合わせて Pipeline で実装するのが現代的な作法。 報告時は予測精度 (R^2、 MSE) だけでなく、 選ばれた α、 非ゼロ係数の数、 訓練・検証スコアの比較を併記すると、 第三者が結果を再現・検証できる。
実務では「OLS で十分」「Ridge で安定化」「Lasso で解釈」 という流れを覚えておく。 多重共線性が強い、 高次元 (p > n)、 解釈性が重要、 のいずれかなら正則化を使うのが標準。 SSDSE-B-2026 のような中小規模データでも、 説明変数間の相関が強い場合 (総人口 A1101・出生数 A4101・婚姻件数 A9101・一般診療所数 I5102 は互いに r=0.97〜0.99) は OLS が不安定になるので Ridge を試す価値がある。 深層学習では weight decay (= L2 正則化) と Dropout が事実上の標準で、 学習スケジューラと組み合わせて使われる。 「正則化なし = 過学習リスク」 という心構えで、 必ずベースラインに正則化版を含めて比較するのが推奨される実務的姿勢。
🏢 実世界での正則化の応用事例
正則化は学術研究だけでなく、 現実世界の予測・分類問題で広く使われている。 例えば医療分野では、 ゲノミクスデータから疾患リスクを予測するモデル (例: 心血管疾患の多遺伝子リスクスコア) で Lasso が利用される。 数百万 SNP (一塩基多型) から数千の意味ある変数を選び出すスパース化が威力を発揮する。 金融分野では、 株価予測やクレジットリスクスコアリングで Ridge と ElasticNet が使われ、 多数の経済指標から安定した予測モデルを構築する。 マーケティング分野では、 顧客行動データから購入予測モデルを作る際に Lasso で「効く特徴量」 を特定し、 解釈可能性と予測精度を両立させる。
近年は深層学習の文脈でも、 「LoRA (Low-Rank Adaptation)」 や「Prefix Tuning」 など、 大規模モデルのパラメータの一部だけを学習する「効率的微調整 (Parameter-Efficient Fine-Tuning, PEFT)」 が正則化の一形態として位置づけられる。 これは「フルパラメータの暗黙的正則化」 とも解釈でき、 古典的な L1/L2 罰則の発想が深層学習時代にも形を変えて生き続けている象徴的事例。 SSDSE-B-2026 のような中規模データから始めて、 慣れたら多変量データ・高次元データ・深層学習への応用へと進むことで、 正則化の本質が段階的に理解できる。
📚 学習のまとめと推奨書籍
正則化を体系的に学ぶには、 Hastie, Tibshirani, Friedman の「The Elements of Statistical Learning」 (2nd ed., 2009) の第 3 章が古典的かつ網羅的。 入門レベルでは「An Introduction to Statistical Learning with Applications in R/Python」 (James, Witten, Hastie, Tibshirani 2013, 2021 改訂版) の第 6 章が読みやすい。 深層学習における正則化は Goodfellow, Bengio, Courville の「Deep Learning」 (2016) の第 7 章が中心的にまとまっており、 weight decay・Dropout・Early Stopping・Data Augmentation の理論的位置づけを学べる。 これらの教科書を SSDSE-B-2026 のような実データで手を動かしながら読むことで、 単なる知識ではなく「使える技能」 として定着する。
学習の総まとめとして、 「なぜ正則化が必要か」 を一言で説明できるようになることを目標にしたい。 答えは「未知データへの汎化性能を上げるため、 訓練データへの過剰な適合を抑える」 という単純な原理だが、 この一言の背後には「バイアス・分散トレードオフ」「過学習と過小学習」「モデル選択」「クロスバリデーション」 など多数の概念が連なっている。 これらを階層的に理解することで、 正則化は単なる技術ではなく「機械学習の哲学的中核」 として位置づけられる。 SSDSE-B-2026 を題材に、 学生諸氏には正則化を通してこの哲学を体感し、 将来のあらゆる予測モデル構築に活かしてほしい。 「過学習を抑えること」 は技術であると同時に、 「謙虚さ」 という研究者の徳でもある。
正則化は機械学習の歴史を貫く中心的概念であり、 線形回帰から深層学習、 そして大規模言語モデルへと進化する中でも、 その本質は変わらず生き続けている。 学生諸氏が SSDSE-B-2026 のような実データで正則化を体験し、 訓練データと検証データの差を体感し、 適切な α を選ぶ経験を積むことで、 過学習を「お話」 ではなく「自分の手で起こしてみて見える現象」 として理解できるようになる。 この理解は、 教科書を読むだけでは得られない実践的な感覚であり、 将来あらゆる予測モデル構築の場面で活きる財産となる。
統計データ分析コンペティションは、 こうした実践的な学習機会の最たるものであり、 単に技術を競うだけでなく、 「データを正しく扱う」 という研究文化に触れる場でもある。 正則化のような基礎技術を、 SSDSE のような公開データで丁寧に身につけることで、 将来のデータサイエンティスト・研究者として長く活躍できる基盤が形成される。 一過性の流行に流されず、 こうした基礎を一つひとつ確実に身につけていく姿勢が、 結局のところ最も成長を加速させる近道である。 機械学習の世界は急速に変化しているが、 「正則化により過学習を抑える」 という発想は、 線形回帰から深層学習・大規模言語モデルまで、 すべての世代の手法に共通する普遍的原理である。 この原理を体に染み込ませることで、 将来どのような新しい手法が登場しても、 その本質を素早く理解し、 適切に応用できる力が身につく。 SSDSE のような実データを使った地道な学習が、 こうした普遍的理解への道のりであり、 学生諸氏には焦らず着実に取り組むことを推奨する。 機械学習の手法は今後も次々と進化するが、 正則化という発想の核心が変わることはない。 むしろ、 大規模モデルの時代になるほど、 過学習を抑える技術の重要性は増している。 こうした普遍的な原理を、 SSDSE のような実データを使って体感し、 自分の手で実装し、 結果を観察し、 議論することで、 真に身につけることができる。 学生諸氏が統計データ分析コンペティションを通じて、 正則化の本質と応用力を確実に身につけ、 将来のデータサイエンスの担い手として活躍されることを期待する。 正則化は機械学習の基礎の中でも、 過学習という普遍的な課題に対する実用的な解答を提供する技術であり、 これを深く理解し、 適切に使いこなせるようになることは、 データサイエンティストとしての一つの到達点でもある。 学習の過程で迷ったり、 結果が思うようにならなかったりすることもあるが、 そうした経験こそが理解を深める栄養となる。 焦らず、 楽しみながら、 着実に学習を進めていってほしい。 SSDSE のような実データを使った学習は、 こうした粘り強い成長プロセスを支える最良の教材である。 正則化を確実に身につけることで、 将来出会うあらゆる予測モデルの課題に対して、 落ち着いて適切な対応ができるデータサイエンティストへと成長できる。 学生諸氏の今後の研究と実務での活躍を心から応援している。 正則化を含む機械学習の基礎技術を着実に身につけ、 将来のデータサイエンス・AI の発展に主体的に貢献する人材として成長されることを、 心から期待している。 SSDSE のような実データを使った学習と実践の繰り返しが、 そうした成長への確実な道のりである。 この用語ページが、 学生諸氏の学習における信頼できる相棒となることを願っている。 統計データ分析コンペティションへの挑戦を通して、 確かな成長を遂げられることを心から応援している。 正則化の習得は、 過学習という普遍的課題への確かな対応力を身につける重要なステップである。 この一歩が、 データサイエンスの世界での大きな成長につながっていく。
🗺 概念マップ
正則化を中心に、 罰則項の形(L2・Group・Fused・Adaptive・非凸 SCAD/MCP・Square-root)で派生する 6 つの正則化手法を放射状に配置した。 SSDSE-B-2026 の県別多変数回帰で、 変数のグルーピング・順序・スケールに応じてどの罰則を選ぶかが俯瞰できる。
regularization
係数の大きさそのもの
Group Lasso
Fused Lasso
Adaptive Lasso
SCAD / MCP
Square-root La
正則化を中心に、 上に 係数の大きさ そのものを罰則として効かせる L2/Ridge、 右上に変数群を一括で 0/非 0 にする Group Lasso 、 右下に隣接係数の差を罰則化する Fused Lasso 、 下に係数ごとに重み付き L1 罰則を与える Adaptive Lasso 、 左下に L1 の縮小バイアスを軽減する非凸罰則 SCAD / MCP 、 左上に λ チューニング不要を狙う Square-root Lasso が配置される。 SSDSE-B-2026 の県別変数を 30 以上扱う回帰では、 まず標準的な Ridge/Lasso/Elastic Net を試した後、 変数のグルーピング構造 (例: 消費支出の費目別内訳 L322101〜L322110)や 順序構造 (例: 年少 A1301・生産年齢 A1302・高齢 A1303 の年齢 3 区分人口)に応じて Group/Fused 系へ進むのが定石です。
このマップで重要なのは、 すべての変種が「経験リスク + 罰則」という共通骨格 を持ち、 罰則の形だけが異なる点。 罰則項の幾何(L1 の角張り・L2 の丸み・非凸罰則のくぼみ)がそのまま 解の性質 (スパース性・縮小度・バイアス)を決めるため、 SSDSE 列の構造に応じて罰則を選ぶことが、 正則化を「単なるおまじない」から脱却させる鍵になります。
🔗 隣接手法への橋渡し
「正則化」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
「複雑すぎるモデルにペナルティを課す」 思想は線形回帰・深層学習・木モデルすべてに通底し、 汎化性能を実用水準まで引き上げる現代機械学習の必須技法である。
🌳 手法選択フロー
「正則化」を回帰・ニューラルネットワークの過学習対策に使うとき、 係数の性質と特徴量数で判定する。
特徴量を絞り込みたいか? 多数の説明変数から重要なものを選別 → Lasso (L1) が係数を 0 に押す。 すべての変数を残しつつ縮小 → Ridge (L2)
多重共線性が強いか? 説明変数同士が高相関 → Ridge が安定。 グループ的に効く変数群がある → Elastic Net (L1+L2 混合)
ハイパーパラメータ λ をどう選ぶか? 交差検証 で λ を grid search、 AIC /BIC を最小化する λ を選ぶ、 もしくは経験則で 0.01〜10 の対数スケールを試す
正則化はスケール依存なので 標準化 が必須。 SSDSE-B-2026 で総人口 A1101(人)・年平均気温 B4101(℃)・消費支出 L3221(円)のように単位が異なる変数を入れる場合、 標準化を忘れると λ が一部の変数だけに強く効いて意図しない結果になる。
🎮 触って理解する
下の λ(正則化強度)スライダー を動かすと、 少数のノイズ入りデータ(正則化の挙動を見るための合成デモデータ 。 SSDSE-B-2026 の実測値ではありません)に 9 次多項式 を当てはめた曲線がリアルタイムに変化します。 λ を小さくすると曲線が ぐにゃぐにゃ(過学習) 、 大きくすると ほぼ直線(過度な平滑化) になり、 検証誤差が最小 になる「ちょうど良い λ」が中間に存在することを体感してください。 L2 (Ridge) と L1 (Lasso) を切り替えると、 係数の縮み方(L2 は一様に縮小 / L1 は一部が ちょうど 0 に)が変わります。
③ 各次数の係数(標準化後の大きさ/L1 では一部が 0 に)
方式: L2 (Ridge)
訓練RMSE: -
検証RMSE: -
非ゼロ係数: - / 9
検証最小の λ: -
🧭 直感: 正則化は「データへの忠実さ(訓練誤差を下げる力)」と「モデルの単純さ(係数を小さく保つ力)」の 綱引き です。 λ はそのバランスつまみで、 λ→0 は忠実さ最優先=過学習 、 λ→∞ は単純さ最優先=ほぼ定数/直線 。 訓練誤差は λ とともに単調に増えますが、 検証誤差は U 字 を描き、 その底(②の曲線の最下点)が汎化性能の最良点です。
⚠️ よくある落とし穴:
標準化は必須。 罰則 Σβ² や Σ|β| は係数の絶対量に効くため、 単位(円・人・℃)がバラバラだとスケールの大きい変数だけが不当に強く縮む。 このデモも多項式基底を 標準化してから 罰則を課しています(標準化 )。
λ を「なんとなく」で決めない。 訓練誤差だけを見ると「λ は小さいほど良い」と錯覚する。 必ず 交差検証 の検証誤差(②の U 字)で選ぶこと。
切片は罰則しない。 定数項まで縮めると予測が原点方向に偏る。 このデモは y を中心化して切片を別扱いにしています。
🚀 発展: L1(
Lasso )の罰則面は原点で「角張って」いるため、 解が座標軸上(=係数ちょうど 0)に乗りやすく
スパース性(変数選択) が生まれます。 ③の棒グラフで L1 に切り替えると、 λ を上げるにつれ棒が次々と
完全に消える(0 になる) のが見えます。 L2 は係数を 0 に潰さず一様に縮めるだけ。 両者の中間が
Elastic Net (L1+L2 混合)で、 相関の強い変数群をまとめて残しつつスパース性も得たいときに有効です。 λ 選択の背景理論は
バイアス・分散トレードオフ 、 過学習の検知は
過学習 と
交差検証 を参照。
🔖 キーワード索引(チップから該当箇所へジャンプ)
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:
🔖 キーワード索引(拡張版 — 論文・実務で頻出する用語)
既存索引に加え、 派生概念や近接トピックへのジャンプを充実させました。 用語をクリックすると該当章へ移動します。
🧭 解説深化 — 「有効自由度」と「パネルCV」から正則化を見直す
本ページはここまで「係数がどう縮むか」を中心に正則化を説明してきた。 この深化セクションでは視点を変え、 ①モデルが実質的に使えるパラメータ数(有効自由度)が λ でどう減るか 、 ② SSDSE-B-2026 が 47 都道府県 × 12 年のパネルデータであることを無視すると λ 選択そのものが歪む 、 という 2 つの未出の角度から掘り下げる。 数値はすべて SSDSE-B-2026 の実測値である。
💡 直感 — λ は「使えるパラメータ数」を連続的に絞るダイヤル
Ridge 回帰の複雑さは「変数が 5 個だから自由度 5」とは限らない。 標準化済み計画行列 $\mathbf{X}$ の特異値を $d_1 \ge d_2 \ge \dots \ge d_p$ とすると、 Ridge の有効自由度 は
$$\mathrm{df}(\lambda) = \sum_{j=1}^{p} \frac{d_j^2}{d_j^2 + \lambda}$$
で与えられる($\lambda=0$ なら各項が 1 になり df$=p$、 $\lambda\to\infty$ で df$\to 0$)。 つまり λ は変数を「入れる/外す」の二択ではなく、 パラメータ数を小数単位で連続的に減らすダイヤル として働く。
本ページのRidge例と同じ設定(2023 年・47 都道府県、 標準化した A1101 総人口・A1303 65歳以上人口・B4101 年平均気温・A4101 出生数・A9101 婚姻件数の 5 変数)で実測すると、 特異値は 13.68, 6.79, 1.30, 0.38, 0.18 となり、 df(λ) は次の通り:
λ (alpha) df(λ) 意味
0(OLS) 5.00 5 変数をフルに使用
1 2.76 実質「約 2.8 変数」相当
10 1.93 実質 2 変数弱
100 0.99 ほぼ 1 変数分の複雑さ
注目すべきは λ=1 の時点で自由度がすでに 5 → 2.76 に半減している こと。 理由は特異値の偏りにある。 2023 年断面では総人口 A1101 と 65歳以上人口 A1303 の相関が r = 0.991 と極端に高く(多重共線性 )、 この共線方向に対応する特異値(0.38 や 0.18)は極小になる。 df の式で $d_j^2$ が小さい項は少しの λ で分母に負け、 真っ先に 0 へ潰れる。 つまり Ridge はデータが最も信用できない(=共線で推定が暴れる)方向から順に自由度を奪う 装置であり、 「全係数を一様に縮める」という素朴なイメージより精密な動作をしている。 本文 3 章で OLS の総人口係数 +270,656 円が Ridge で +10,733 円まで縮む劇的な変化も、 「共線方向の自由度が最初に没収される」ことの現れとして統一的に理解できる。
⚠️ 落とし穴(重要) — パネル構造を無視した CV は λ 選択ごと歪む
本ページの λ 選択の議論はすべて「CV で選べ」だったが、 SSDSE-B-2026 の全期間データは 47 都道府県 × 12 年(2012–2023)= 564 行のパネルデータ である。 ここに普通の KFold(shuffle=True) を使うと、 同じ県の別年度 が訓練側と検証側に分かれる。 都道府県の特徴は年をまたいでほぼ不変(東京は毎年東京)なので、 検証集合の情報が事実上訓練側に漏れ、 誤差が楽観的に見積もられる。 実測すると:
CV の切り方 CV RMSE(円/月) 評価している能力
KFold(5, shuffle, seed=0) 22,131 「見たことのある県の別年度」を当てる能力
GroupKFold(5, 県単位) 24,994 「未知の県」を当てる能力
設定: StandardScaler + Ridge(alpha=1.0) の Pipeline、 説明変数は上と同じ 5 列、 目的変数 L3221 消費支出(全 564 行、 平均 287,336 円・標準偏差 23,591 円)。 実測値。
行シャッフル KFold は GroupKFold より約 13% 楽観的 だった。 怖いのは誤差の過小評価そのものより、 この歪んだ CV 曲線の底で λ を選んでしまう こと — リークがあると「訓練に似たデータなら小さい λ でも当たる」ため λ が過小に選ばれ、 本番(未知の県・将来年度)で過学習が再発する。 つまり正則化を入れたのに、 正則化の強さを決める物差し自体が壊れている 状態になる。 対策は問いに合わせて CV を切ること: 「未知の県への一般化」なら GroupKFold(groups=県)、 「将来年度の予測」なら年で切る TimeSeriesSplit 型の分割を使う(パネルデータ ・交差検証 )。 これは本文の落とし穴①(fold 内標準化)とは別種のリークで、 Pipeline を正しく使っていても発生する点に注意。
🚀 発展 — df(λ) がつなぐ「正則化と情報量規準」、 そして統一視点
有効自由度の御利益は直感だけではない。 AIC・BIC・GCV はパラメータ数 $p$ を罰する規準だが、 正則化モデルでは $p$ の代わりに $\mathrm{df}(\lambda)$ を差し込める:
$$\mathrm{GCV}(\lambda) = \frac{\frac{1}{n}\sum_i (y_i - \hat{y}_i)^2}{\left(1 - \mathrm{df}(\lambda)/n\right)^2}$$
これにより CV を回さずに λ を選ぶ近道が得られ(本文 7 章の表にある「AIC/BIC」経路の理論的根拠)、 AIC の世界と正則化の世界が df(λ) を蝶番として接続される。 さらにこの視点は深層学習にも伸びる: Early Stopping は「勾配降下の反復回数 $t$ が λ の逆数の役割を果たし、 途中で止めることで有効自由度を絞る」操作と解釈でき($t \propto 1/\lambda$ の対応が線形モデルで示せる)、 Dropout もアンサンブル平均を通じて実効的な複雑さを下げる装置と読める。 「Ridge・Lasso・Early Stopping・Dropout はどれも有効自由度をデータ量に見合う水準まで絞る 手段」という統一視点を持つと、 手法の暗記が原理の理解に変わる。 厳密な展開は Hastie, Tibshirani & Friedman The Elements of Statistical Learning の 3.4 節・7.6 節(自由度と楽観バイアス)が定番。
🔗 関連ページ