Lassoのαの探索

LassoCVも確認してみましょう。

なお、αの探索リストは、alphas_に入ります。選択されたαは、alpha_に入ります。

%matplotlib inline
# 出力時に小数点以下3桁に
%precision 3
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LassoCV
from sklearn.metrics import mean_squared_error

df = pd.read_csv("input/boston.csv")  # ボストン市の住宅価格データ一式
X, y = df.iloc[:, :-1], df.iloc[:, -1]  # サンプルデータ
# αの確認
lasso = LassoCV(cv=3)
lasso.fit(X, y)
float(lasso.alpha_)
0.725

オプションなしで実行してみます(LassoCV())。αは、0.725となります。

# αの確認
lasso = LassoCV(eps=0.0001, cv=3)
lasso.fit(X, y)
float(lasso.alpha_)
0.139

eps=0.0001として、探索範囲を広げてみましょう。0.139となります。

# αの確認
lasso = LassoCV(eps=0.0001, n_alphas=200, cv=3)
lasso.fit(X, y)
float(lasso.alpha_)
0.145

n_alphas=200を追加して、分割数を増やしてみましょう。0.145となります。

# 係数の確認
lasso.coef_
array([-0.097,  0.049, -0.028,  0.234, -0.   ,  3.573, -0.008, -1.136,
        0.28 , -0.015, -0.779,  0.01 , -0.581])
# 平均二乗誤差の確認
float(mean_squared_error(y, lasso.predict(X)))
23.258

このαで平均二乗誤差を確認すると、23.264となります(mean_squared_error(y, lasso.predict(X)))。

# αの探索リスト
plt.yscale('log')
plt.plot(lasso.alphas_);

αの探索リストを対数軸のグラフで確認します。比率が一定でy軸を対数スケールにしているので、グラフは直線になります。

LassoCV

LassoCVを使うと、クロスバリデーション(CV)して、平均二乗誤差が最小のαを選択できます。
αの探索リストは、自動で求められた範囲を対数スケールで分割して決められます。評価関数は、平均二乗誤差で変更できません。

  • αの探索リストは、alphas_に入ります。選択されたαは、alpha_に入ります。
  • αの探索リストごと、CVの分割ごとの平均二乗誤差は、mse_path_に入ります。

LassoCVの主なパラメーターは以下のようになります。

オプションデフォルト説明
eps0.001αの範囲の最小値/αの範囲の最大値
n_alphas100αの範囲の分割数
alphasNoneαの探索リスト(Noneだと自動生成)
fit_interceptTrue切片が0でないか
precomputeautoグラム行列を計算するかどうか
cvNoneクロスバリデーション分割数(デフォルトのNoneのときは5分割)
positiveFalse全ての係数を正にするか

※ epsを小さくすると、探索範囲が広がります。
※ n_alphasは、alphas=Noneのときに、内部でnumpy.logspacenumオプションとして使われます。αの探索リストは等比数列になります。
※ グラム行列については、今は気にしなくても良いでしょう。

コメント

タイトルとURLをコピーしました