Traffine I/O

日本語

2022-11-21

ラッソ回帰

ラッソ回帰とは

ラッソ回帰(Least Absolute Shrinkage and Selection Operator Regression)は、線形回帰モデルであり、正則化を導入してモデルのパフォーマンスと解釈性を改善します。ラッソ回帰の主な目的は、コスト関数にL1ペナルティ項を追加することで、モデルの複雑性を最小限に抑え、特徴量の選択と過剰適合を防止することです。

正則化の必要性

機械学習では、モデルがトレーニングデータのノイズを学習し、未知のデータでパフォーマンスが低下する過剰適合が発生することがあります。正則化は、コスト関数にペナルティ項を追加することで、この問題に対処するための技術です。これにより、モデルはもっとも関連性の高い特徴量に焦点を当て、ノイズにフィットすることを避けるように強制されます。

正則化手法は大きくL1正則化とL2正則化の2つのカテゴリに分類されます。ラッソ回帰はL1正則化を使用し、いくつかの係数をゼロに設定してスパースなモデルを生成します。このラッソ回帰の性質は、特に多数の特徴を扱う場合に、特徴量選択の理想的な候補となります。

ラッソ回帰の数学的基礎

コスト関数

線形回帰では、コスト関数(または目的関数)は、予測値と実際値の間の差を測定するために使用されます。最適な係数を得るために、このコスト関数を最小化することが目的です。線形回帰のコスト関数は、平均二乗誤差(MSE)で与えられます。

J(\boldsymbol{\beta}) = \frac{1}{n}\sum_{i=1}^n (y_i - \boldsymbol{x}_i^T \boldsymbol{\beta})^2

ここで、nは観測値の数、y_iは実際の出力を表し、\boldsymbol{x}_i^Ti番目の入力ベクトルの転置を表し、\boldsymbol{\beta}は係数のベクトルです。

L1ペナルティ項

ラッソ回帰では、正則化を導入するためにコスト関数にL1ペナルティ項が追加されます。L1ペナルティ項は以下のようになります。

L1(\boldsymbol{\beta}) = \lambda \sum_{j=1}^p |\beta_j|

ここで、\lambdaは正則化パラメータであり、pは特徴量の数、\beta_jj番目の係数を表します。L1ペナルティ項は、いくつかの係数を正確にゼロにすることによって疎性を促進します。

ラグランジュ乗数

L1ペナルティ項をコスト関数に組み込むことにより、ラッソ回帰の目的関数を得ます。

J(\boldsymbol{\beta}) = \frac{1}{n}\sum_{i=1}^n (y_i - \boldsymbol{x}i^T \boldsymbol{\beta})^2 + \lambda \sum{j=1}^p |\beta_j|

ラグランジュ乗数\lambdaは、データを適合させると同時にモデルの疎性を確保するためのトレードオフを制御します。\lambdaの値が高いほど、より疎なモデルが生成され、\lambdaの値が低いほど、データに合わせたモデルが生成されます。

解の経路とラッソ制約

ラッソ回帰の重要な側面は、係数推定値が正則化パラメータ\lambdaの関数としてどのように変化するかを示す解の経路です。\lambdaが増加すると、より多くの係数がゼロになり、モデルはより疎になります。

ラッソ制約は、原点を中心とするL1ノルム球で幾何学的に表現されます。このL1ノルム球の半径は\frac{1}{\lambda}に比例します。ラッソ回帰の解は、コスト関数の等高線がL1ノルム球と交差する最初の点に対応します。L1ノルム球の幾何学的性質により、解は軸上にある可能性が高く、いくつかの係数が正確にゼロになる疎なモデルが生成されます。

Pythonでのラッソ回帰の実装

この章では、California Housingデータセットを使用してラッソ回帰を実装し、正則化パラメータが増加するにつれて係数の遷移を可視化します。

python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import ラッソ
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Load the California Housing dataset
data = fetch_california_housing()
X = data['data']
y = data['target']
feature_names = data['feature_names']

# Split the dataset into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Standardize the data
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Set the range of regularization parameter values
lambdas = np.logspace(-4, 1, 100)

# Store the coefficients for each lambda value
coefficients = []

# Fit ラッソ Regression for each lambda value and store the coefficients
for lmbda in lambdas:
    ラッソ = ラッソ(alpha=lmbda, max_iter=10000)
    ラッソ.fit(X_train_scaled, y_train)
    coefficients.append(ラッソ.coef_)

# Plot the transition of coefficients using Matplotlib and Seaborn
plt.figure(figsize=(12, 8))
sns.set(style='whitegrid', palette='muted')

# Customize plot appearance
for i, feature in enumerate(feature_names):
    sns.lineplot(x=lambdas, y=np.array(coefficients)[:, i], label=feature)

plt.xscale('log')
plt.xlabel('Regularization Parameter (λ)', fontsize=14)
plt.ylabel('Coefficient Values', fontsize=14)
plt.title('Transition of Coefficients in ラッソ Regression', fontsize=16, fontweight='bold')
plt.legend(fontsize=12, loc='upper right')

# Display the plot
plt.show()

ラッソ regression

このスクリプトでは、California Housingデータセットを読み込み、トレーニングセットとテストセットに分割し、特徴量を標準化します。その後、一連の正則化パラメータ値(\lambda)に対してラッソ回帰モデルを適合させ、係数を保存します。

最後に、MatplotlibとSeabornを使用して、正則化パラメータが増加するにつれて係数の遷移を視覚的に示す魅力的なプロットを作成します。このプロットは、ラッソ回帰の係数に与える影響を示し、\lambdaが増加するにつれて係数が縮小し、いくつかの係数が正確にゼロになることを示しています。これがラッソ回帰が疎性を促進し、特徴量の選択を実行する能力の本質です。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!