はじめに
回帰分析は、データサイエンスと機械学習の分野で最も基本的かつ重要な手法の一つです。本記事では、回帰モデルの基本概念から始め、線形回帰、リッジ回帰、LASSO回帰という3つの主要な回帰手法について詳しく解説します。これらのモデルの特徴、違い、そして実装方法について理解を深めていきましょう。
回帰分析の基本
回帰分析とは、データからわかる結果を客観的に説明する手法です。具体的には、一つ以上の説明変数(独立変数)と目的変数(従属変数)の関係を数学的にモデル化し、その関係性を定量的に表現します3。
主要な概念
- 説明変数:結果を説明する変数(例:気温)
- 目的変数:得たい結果、分析する目的としての変数(例:アイスクリームの売上)
- 回帰係数:説明変数が目的変数に与える影響の大きさ
- 残差:実際の値と予測値の差
線形回帰
線形回帰は最も基本的な回帰モデルで、説明変数と目的変数の間に線形の関係があると仮定します。
単回帰分析
単回帰分析は、1つの説明変数から目的変数を予測する手法です1。
例:y = ax + b
ここで、yは目的変数、xは説明変数、aは回帰係数、bは切片です。
重回帰分析
重回帰分析は、複数の説明変数を用いて目的変数を予測します3。
例:y = a1x1 + a2x2 + … + anxn + b
最小二乗法
線形回帰モデルのパラメータ推定には、通常、最小二乗法(OLS: Ordinary Least Squares)が用いられます。これは、残差の二乗和を最小化することで最適なパラメータを求める方法です3。
線形回帰の特徴
- 解釈が容易:各説明変数の影響を直接的に理解できる
- 計算が比較的簡単
- 過学習のリスク:説明変数が多い場合や、多重共線性がある場合に問題が生じる可能性がある
リッジ回帰
リッジ回帰は、線形回帰に正則化項を加えたモデルです。具体的には、L2正則化を使用します2。
リッジ回帰の目的関数
最小化する目的関数:
∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1pβj2∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1pβj2
ここで、λは正則化の強さを制御するハイパーパラメータです。
リッジ回帰の特徴
- 多重共線性の問題を軽減
- すべての特徴量を保持しつつ、その影響を小さくする
- 過学習を抑制
- 経済データの分析など、多くの要因が複雑に絡み合う場合に有効2
LASSO回帰
LASSO(Least Absolute Shrinkage and Selection Operator)回帰は、L1正則化を使用する回帰手法です2。
LASSO回帰の目的関数
最小化する目的関数:
∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1p∣βj∣∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1p∣βj∣
LASSO回帰の特徴
- 特徴量選択の効果:一部の係数を完全に0にする
- モデルの解釈性が向上:重要な特徴量のみを残す
- 遺伝子データの解析など、多数の特徴量から重要なものを選択する場合に有効2
3つのモデルの比較
- 正則化:
- 線形回帰:なし
- リッジ回帰:L2正則化(係数の二乗和にペナルティ)
- LASSO回帰:L1正則化(係数の絶対値和にペナルティ)
- 特徴量選択:
- 線形回帰:行わない
- リッジ回帰:係数を0に近づけるが、完全に0にはしない
- LASSO回帰:一部の係数を完全に0にする
- 適用場面:
- 線形回帰:説明変数が少なく、多重共線性がない場合
- リッジ回帰:多重共線性がある場合、全ての特徴量を考慮したい場合
- LASSO回帰:特徴量選択が必要な場合、モデルの解釈性を高めたい場合
- 解の一意性:
- 線形回帰:一意解が存在(多重共線性がない場合)
- リッジ回帰:常に一意解が存在
- LASSO回帰:解が一意でない場合がある
実装例(Python)
以下に、Pythonを使用した各回帰モデルの実装例を示します。
pythonimport numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# サンプルデータの生成
np.random.seed(42)
X = np.random.randn(100, 5)
y = 3*X[:, 0] + 2*X[:, 1] + 0.5*X[:, 2] + np.random.randn(100)
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの定義
linear_reg = LinearRegression()
ridge_reg = Ridge(alpha=1.0)
lasso_reg = Lasso(alpha=1.0)
# モデルの学習
linear_reg.fit(X_train, y_train)
ridge_reg.fit(X_train, y_train)
lasso_reg.fit(X_train, y_train)
# 予測
y_pred_linear = linear_reg.predict(X_test)
y_pred_ridge = ridge_reg.predict(X_test)
y_pred_lasso = lasso_reg.predict(X_test)
# MSEの計算
mse_linear = mean_squared_error(y_test, y_pred_linear)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
print(f"Linear Regression MSE: {mse_linear}")
print(f"Ridge Regression MSE: {mse_ridge}")
print(f"LASSO Regression MSE: {mse_lasso}")
# 係数の比較
plt.figure(figsize=(10, 6))
plt.bar(range(5), linear_reg.coef_, alpha=0.5, label='Linear')
plt.bar(range(5), ridge_reg.coef_, alpha=0.5, label='Ridge')
plt.bar(range(5), lasso_reg.coef_, alpha=0.5, label='LASSO')
plt.legend()
plt.title("Comparison of Regression Coefficients")
plt.xlabel("Feature Index")
plt.ylabel("Coefficient Value")
plt.show()
このコードは、サンプルデータを生成し、3つの回帰モデルを学習させ、その性能(MSE)と係数を比較します。
まとめ
回帰分析は、データの関係性を理解し予測するための強力なツールです。線形回帰は最も基本的なモデルですが、リッジ回帰とLASSO回帰は正則化を導入することで、過学習を抑制し、より汎化性能の高いモデルを構築することができます。
リッジ回帰は全ての特徴量を保持しつつその影響を調整するのに対し、LASSO回帰は特徴量選択の効果があります。実際の応用では、データの性質や分析の目的に応じて適切なモデルを選択することが重要です。
また、これらのモデルは基本的な手法であり、より複雑なデータや問題に対しては、非線形回帰や機械学習の他の手法を検討する必要があるかもしれません。データサイエンティストとして、様々な手法の特徴を理解し、適切に使い分けることが求められます。