Elastic Netでの探索

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_ratiol1_ratio_に入ります。

αの探索リストは、自動で求められた範囲を比率が一定になるように分割して決められます。評価関数は、平均二乗誤差で変更できません。
αの探索リストは、alphas_に入ります。選択されたαは、alpha_に入ります。

αの探索リストごと、CVの分割ごとの平均二乗誤差は、mse_path_に入ります。

ElasticNetCVの主なパラメーターは、LassoCVとほぼ同じです。
違いは、l1_ratioパラメーターです。探索する実数または実数のリストを指定します。デフォルトは0.5です。

コメント

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