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
の主なパラメーターは以下のようになります。
オプション | デフォルト | 説明 |
---|---|---|
eps | 0.001 | αの範囲の最小値/αの範囲の最大値 |
n_alphas | 100 | αの範囲の分割数 |
alphas | None | αの探索リスト(Noneだと自動生成) |
fit_intercept | True | 切片が0でないか |
precompute | auto | グラム行列を計算するかどうか |
cv | None | クロスバリデーション分割数(デフォルトのNoneのときは5分割) |
positive | False | 全ての係数を正にするか |
※ eps
を小さくすると、探索範囲が広がります。
※ n_alphas
は、alphas=None
のときに、内部でnumpy.logspace
のnum
オプションとして使われます。αの探索リストは等比数列になります。
※ グラム行列については、今は気にしなくても良いでしょう。
コメント