はじめに
この実験では、Lasso 回帰モデルに対する最適なハイパーパラメータ alpha を選択する方法について学びます。2 つのアプローチが議論されます。(1) 訓練セットといくつかの情報基準のみを使用して alpha の最適値を選択すること、および (2) 交差検証を使用して最適なハイパーパラメータを選択すること。この例では、糖尿病データセットを使用します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データセット
まず、sklearn.datasets からの load_diabetes 関数を使用して糖尿病データセットを読み込みます。このデータセットは、10 のベースライン変数、年齢、性別、体重指数、平均血圧、および 6 つの血清測定値と、ベースラインから 1 年後の病気進行の定量的測定値で構成されています。
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True)
X.head()
ランダムな特徴量の追加
Lasso モデルによって行われる特徴量選択をよりよく説明するために、元のデータにいくつかのランダムな特徴量を追加します。ランダムな特徴量は、numpy の RandomState 関数を使用して生成されます。
import numpy as np
import pandas as pd
rng = np.random.RandomState(42)
n_random_features = 14
X_random = pd.DataFrame(
rng.randn(X.shape[0], n_random_features),
columns=[f"random_{i:02d}" for i in range(n_random_features)],
)
X = pd.concat([X, X_random], axis=1)
X[X.columns[::3]].head()
情報基準を使った Lasso の選択
正則化パラメータ alpha の最適値を選択するために、赤池情報量基準 (AIC) またはベイズ情報量基準 (BIC) を使用する Lasso 推定器を提供するために、sklearn.linear_model からの LassoLarsIC 関数を使用します。まず、AIC 基準を使って Lasso モデルをフィットさせます。
import time
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LassoLarsIC
from sklearn.pipeline import make_pipeline
start_time = time.time()
lasso_lars_ic = make_pipeline(StandardScaler(), LassoLarsIC(criterion="aic")).fit(X, y)
fit_time = time.time() - start_time
結果の保存と最適な alpha の確認
fit 中に使用された各 alpha の値に対する AIC 指標を保存します。次に、BIC 基準を使用して同じ分析を行います。最後に、どの alpha の値が最小の AIC と BIC につながるかを確認します。
results = pd.DataFrame(
{
"alphas": lasso_lars_ic[-1].alphas_,
"AIC criterion": lasso_lars_ic[-1].criterion_,
}
).set_index("alphas")
alpha_aic = lasso_lars_ic[-1].alpha_
lasso_lars_ic.set_params(lassolarsic__criterion="bic").fit(X, y)
results["BIC criterion"] = lasso_lars_ic[-1].criterion_
alpha_bic = lasso_lars_ic[-1].alpha_
def highlight_min(x):
x_min = x.min()
return ["font-weight: bold" if v == x_min else "" for v in x]
results.style.apply(highlight_min)
AIC と BIC の値をプロットする
最後に、異なる alpha 値に対する AIC と BIC の値をプロットします。プロット内の垂直線は、各基準に対して選択された alpha に対応します。選択された alpha は、AIC または BIC 基準の最小値に対応します。
ax = results.plot()
ax.vlines(
alpha_aic,
results["AIC criterion"].min(),
results["AIC criterion"].max(),
label="alpha: AIC estimate",
linestyles="--",
color="tab:blue",
)
ax.vlines(
alpha_bic,
results["BIC criterion"].min(),
results["BIC criterion"].max(),
label="alpha: BIC estimate",
linestyle="--",
color="tab:orange",
)
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel("criterion")
ax.set_xscale("log")
ax.legend()
_ = ax.set_title(
f"Information-criterion for model selection (training time {fit_time:.2f}s)"
)
交差検証を用た Lasso の選択
統合された交差検証を使用して、最適なハイパーパラメータ alpha を選択するために、2 つの異なる推定器を使用します:LassoCV と LassoLarsCV。両方のアルゴリズムについて、20 分割交差検証戦略を使用します。
座標降下法による Lasso
LassoCV を使用してハイパーパラメータのチューニングを行います。
from sklearn.linear_model import LassoCV
start_time = time.time()
model = make_pipeline(StandardScaler(), LassoCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time
最小角回帰による Lasso
LassoLarsCV を使用してハイパーパラメータのチューニングを行います。
from sklearn.linear_model import LassoLarsCV
start_time = time.time()
model = make_pipeline(StandardScaler(), LassoLarsCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time
交差検証アプローチの概要
両方のアルゴリズムはおおよそ同じ結果を得ます。Lars は、パス内の各折れ目に対してのみ解のパスを計算します。その結果、特徴量やサンプルが少ない場合のように、折れ目が少ない場合には非常に効率的です。逆に、座標降下法は事前に指定されたグリッド上でパス点を計算します(ここではデフォルトを使用します)。したがって、グリッド点の数がパス内の折れ目の数より少ない場合、それがより効率的です。特徴量の数が本当に多く、交差検証の各フォールドで選択する十分なサンプルがある場合、このような戦略は興味深い場合があります。数値誤差の面では、強く相関した変数の場合、Lars はより多くの誤差を蓄積しますが、座標降下法アルゴリズムはグリッド上でのみパスをサンプリングします。
まとめ
この実験では、Lasso 回帰モデルの最適なハイパーパラメータ alpha を選択する方法について学びました。2 つのアプローチについて説明しました。(1) 学習セットと情報基準のみを使用して alpha の最適値を選択する方法、および (2) 交差検証を使用して最適なハイパーパラメータを選択する方法。この例では糖尿病データセットを使用しました。両方のアプローチは同様に機能する場合がありますが、サンプル内のハイパーパラメータ選択は計算性能の面でその有効性を示します。ただし、特徴量の数に比べてサンプル数が十分に多い場合にのみ使用できます。交差検証によるハイパーパラメータ最適化は、さまざまな設定で機能する安全な戦略です。