過学習に対応する手法で、正則化というものがあります。
正則化とは過学習を避ける手法です。具体的には、パラメーターを推定するときに、誤差だけではなくパラメーター自体の大きさも小さくしようとします。この追加する項を正則化項(ペナルティー)といい、正則化項にかかる係数を正則化パラメーター(α)といいます。αが0だと正則化の効果はありません。なお、Ridge
などのモデルでは、αはalpha
オプションに対応します。
よく使われる正則化項は、以下のものがあります。
- L2ペナルティー:パラメーターの二乗の和。Ridge(リッジ)回帰で使われます。
- L1ペナルティー:パラメーターの絶対値の和。Lasso(ラッソ)で使われます。
- L1とL2ペナルティー:L1ペナルティーとL2ペナルティーの重み和。Elastic Net(エラスティックネット)で使われます。
ここではRidge回帰を確認し、この後の問題で、LassoとElastic Netを確認しましょう。
データとしてボストン市の住宅価格データ(input/boston.csv
)を使います。
下記のようにして、説明変数(X
)と目的変数(y
)を作成します。
%matplotlib inline
import pandas as pd, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import r2_score
df = pd.read_csv("input/boston.csv") # ボストン市の住宅価格データ一式
# 予測の対象になる多次元のデータ
X = df.iloc[:, :-1]
# 予測の元になる多次元のデータ
y = df.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=0) # データの分割
# 線形回帰
lr = LinearRegression()
lr.fit(X_train, y_train)
# Ridge回帰
ridge = Ridge(alpha=1)
ridge.fit(X_train, y_train)
Ridge(alpha=1)
# 線形回帰の予測
y_pred1 = lr.predict(X_test)
# 線形回帰の評価
score1 = r2_score(y_test, y_pred1)
# Ridge回帰の予測
y_pred2 = ridge.predict(X_test)
# Ridge回帰の評価
score2 = r2_score(y_test, y_pred2)
score1, score2
(0.6354638433202133, 0.6266182204613859)
# パラメーターの比較
df = pd.DataFrame({'LR': lr.coef_, 'Ridge': ridge.coef_})
df.plot.bar();
線形回帰(LinearRegression
)とRidge回帰(sklearn.linear_model.Ridge
)を作成しフィッティングします。
やり方は同じですが、Ridge回帰を作成するとき正則化パラメータ(α)を指定します。
決定係数の値は、ほぼ変わりませんが、Ridge回帰の方が値が小さいので、若干悪くなっています。
回帰モデルのパラメーターがどう変わったかを棒グラフで確認します。
「パラメーターの二乗の和」が加わったので、5番目の絶対値の大きなパラメータが、Ridge回帰では小さくなっているのが確認できます。
Ridge回帰の正則化パラメーターαによって結果は変わります。
デフォルトは1ですが、事前に決めるのは難しいです。実際に使うときは、値を変えて結果を確認しながら決めるとよいでしょう。
コメント