まとめ
- 調整済み R² は説明変数の数に応じて過学習を補正した適合度指標です。
- 変数数を増やしたときに R² と調整済み R² がどう変化するかを Python で確認します。
- サンプル数が少ない場合の注意点や、他指標との使い分けを整理します。
1. 定義 #
$$ \mathrm{Adjusted};R^2 = 1 - (1 - R^2)\frac{n - 1}{n - p - 1} $$
ここで \(n\) はサンプル数、\(p\) は説明変数(特徴量)の数です。\(p\) が増えると分母 \(n - p - 1\) が小さくなるため、改善しない変数を追加すると値が下がります。
2. Python で計算する #
scikit-learn の LinearRegression は決定係数を返すため、調整済み R² は自分で計算します。
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X, y = make_regression(
n_samples=1_000,
n_features=10,
n_informative=6,
noise=5.0,
random_state=0,
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
model = LinearRegression()
model.fit(X_train, y_train)
r2 = model.score(X_test, y_test)
n, p = X_test.shape
adj_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
print(f"R2 = {r2:.3f}")
print(f"Adjusted R2 = {adj_r2:.3f}")
n - p - 1 が 0 にならないよう、検証用データのサンプル数には十分な余裕を持たせましょう。
3. 直感と使いどころ #
- 特徴量が増えると厳しくなる
不要な特徴量を追加すると調整済み R² は低下し、モデルの複雑さに対するペナルティが働きます。 - サンプルが少ない場合に注意
\(n\) が小さいと値が不安定になります。サンプル数が乏しい場合は交差検証と併用して確認します。 - モデル比較に便利
同じデータセットでより少ない変数で高い調整済み R² を達成できるモデルは、より汎化性能が高いと考えられます。
4. 他指標との使い分け #
| 指標 | 特徴 | 注意点 |
|---|---|---|
| R² | 直感的で広く知られる指標 | 説明変数を追加すると必ず上昇する |
| Adjusted R² | 変数数を考慮し公平に比較できる | サンプルが少ないと不安定 |
| AIC / BIC | 損失関数 + ペナルティで最小化する | モデルが仮定を大きく外れると解釈が難しい |
5. 実務での活用 #
- 特徴量選択:ステップワイズ法などで特徴量を増減させる際、調整済み R² の向上を目安にします。
- 説明責任:R² だけでなく調整済み R² も提示すると、過学習を抑えていることを示しやすくなります。
- 比較検証:正規化やスケーリングの異なるモデルを比べる際、調整済み R² が改善していれば実質的な性能向上と判断しやすいです。
まとめ #
- 調整済み R² は決定係数に特徴量のペナルティを掛けた指標で、モデル改善が本当に有効だったかを確認できます。
- サンプル数と特徴量のバランスに注意しながら、R² と併用してモデル評価に活用しましょう。
- AIC / BIC など他の情報量規準とも組み合わせると、より頑健なモデル選択が可能になります。