【scikit-learn】リッジ回帰の意味と使い方について

はるか
はるか
リッジ回帰って聞いたことある?
ふゅか
ふゅか
うん!線形回帰に正則化項を加えた手法だよね。

1. リッジ回帰

リッジ回帰(Ridge Regression)は、機械学習や統計学で使用される線形回帰の一種です。通常の線形回帰に正則化(ペナルティ)を加えることで、過学習を防ぎ、モデルの安定性を向上させる手法です。

1.1. リッジ回帰とは?

リッジ回帰は、以下のような式で表される回帰モデルです。

$$L(\beta)= \sum_{i=1}^{n}(y_i – \hat{y}_i)^2 + \alpha \sum_{j=1}^{p} |\beta_j|^2$$

  • 最初の項:線形回帰と同じく、予測値 $\hat{y}$  と実際の値 $y$の誤差を最小化します。
  • 2番目の項:モデルの重み(回帰係数) $\beta_j$ でペナルティを課すことで、過度な複雑化を抑えます。
  • $\alpha$:正則化の強さを調整するハイパーパラメータ。大きくするとペナルティが強くなり、小さくすると通常の線形回帰に近づきます。
  • $p$:特徴量の総数。
はるか
はるか
ペナルティの強さを変えるパラメータが、α。

2. scikit-learnでリッジ回帰の使い方

2.1. データ準備

まず、必要なライブラリをインポートし、データセットを準備します。今回はScikit-learnに組み込まれているtoyデータセットである「irisデータセット」を使います。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

# データの読み込み
iris = load_iris()
X,y = iris.data,iris.target

# データを訓練用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.2.  リッジ回帰モデルの構築と学習

# リッジ回帰モデルの作成
ridge = Ridge(alpha=1000000000.0)  # alphaは正則化の強さを調整するパラメータ

# モデルの学習
ridge.fit(X_train, y_train)

# テストデータで予測
y_pred = ridge.predict(X_test)
はるか
はるか
次は、リッジ回帰モデルの作成。
ふゅか
ふゅか
alphaの値を調整することで、正則化の強さをコントロールできるんだよね!

2.3. モデルの評価

予測結果を評価するため、平均二乗誤差(Mean Squared Error)を計算します。

# 評価指標:平均二乗誤差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

今回の場合は、

Mean Squared Error: 5361.533443880525

2.4. ハイパーパラメータ $\alpha$の調整

$α\alpha$の値によってモデルの性能が大きく変わるため、適切な値を見つけることが重要です。以下のように、グリッドサーチを使って最適な値を探索できます。

from sklearn.model_selection import GridSearchCV

# ハイパーパラメータの候補
param_grid = {'alpha': [0.1, 1.0, 10, 100,100000000]}

# グリッドサーチ
grid = GridSearchCV(Ridge(), param_grid, cv=5, scoring='neg_mean_squared_error')
grid.fit(X_train, y_train)

# 最適なalpha値
print(f"Best alpha: {grid.best_params_['alpha']}")

今回のケースは、次のようになりました。

PR