ElasticNetCV
も確認してみましょう。
なお、αの探索リストは、alphas_
に入ります。選択されたαは、alpha_
に入ります。
# 出力時に小数点以下3桁に
%precision 3
import pandas as pd
import numpy as np
from sklearn.linear_model import ElasticNetCV
from sklearn.metrics import mean_squared_error
df = pd.read_csv("input/boston.csv") # ボストン市の住宅価格データ一式
X, y = df.iloc[:, :-1], df.iloc[:, -1] # サンプルデータ
# l1_ratioの探索リスト
l1_ratio = np.arange(0.1, 1.1, 0.1)
l1_ratio
array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
l1_ratioの探索リストを、[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]にします。
0.1 から1.1まで0.1刻みという意味
# l1_ratioとαの探索
enet = ElasticNetCV(l1_ratio=l1_ratio, cv=3)
enet.fit(X, y)
float(enet.l1_ratio_), float(enet.alpha_)
(0.600, 1.208)
ElasticNetCV(l1_ratio=l1_ratio)で実行してみます。l1_ratio_は0.6に、αは1.208となります。
# αの探索リストの範囲
enet.alphas_.min(), enet.alphas_.max()
(0.7248204283772594, 7248.204283772596)
αの探索リストの範囲を確認すると、1.208は端の値ではありません。もし、端の値に一致していると、探索範囲が狭い可能性があります。
# 平均二乗誤差
float(mean_squared_error(y, enet.predict(X)))
27.238
平均二乗誤差を確認すると、27.238になります。
# l1_ratioとαの探索
enet = ElasticNetCV(l1_ratio=l1_ratio, eps=0.0001, cv=3)
enet.fit(X, y)
float(enet.l1_ratio_), float(enet.alpha_)
(0.200, 0.479)
αの探索リストの範囲を広げてみます。
ElasticNetCV(l1_ratio=l1_ratio, eps=0.0001)で実行してみます。epsを小さくしたので、探索範囲が広がります。l1_ratio_は0.2に、αは0.479となります。
# αの探索リストの範囲
enet.alphas_.min(), enet.alphas_.max()
(0.07248204283772595, 7248.204283772596)
αの探索リストの範囲を確認すると、0.479は端の値ではありません。
# 平均二乗誤差
float(mean_squared_error(y, enet.predict(X)))
24.931
平均二乗誤差を確認すると、24.934になります。
先程より良い値になります。このように、端の値ではなくても、探索範囲の外側にもっと良いパラメーターが存在することもあります。
ElasticNetCV
ElasticNetCV
を使うと、クロスバリデーションして、平均二乗誤差が最小のαとl1_ratio
を選択できます。
選択されたl1_ratio
はl1_ratio_
に入ります。
αの探索リストは、自動で求められた範囲を比率が一定になるように分割して決められます。評価関数は、平均二乗誤差で変更できません。
αの探索リストは、alphas_
に入ります。選択されたαは、alpha_
に入ります。
αの探索リストごと、CVの分割ごとの平均二乗誤差は、mse_path_
に入ります。
ElasticNetCV
の主なパラメーターは、LassoCV
とほぼ同じです。
違いは、l1_ratio
パラメーターです。探索する実数または実数のリストを指定します。デフォルトは0.5です。
コメント