注意
前往結尾以下載完整的範例程式碼,或透過 JupyterLite 或 Binder 在您的瀏覽器中執行此範例
透過資訊準則選擇 Lasso 模型#
此範例重現了 [ZHT2007] 的圖 2 範例。在糖尿病資料集上擬合 LassoLarsIC
估計器,並使用 AIC 和 BIC 準則來選擇最佳模型。
注意
重要的是要注意,使用 LassoLarsIC
尋找 alpha
的最佳化依賴於在樣本中計算的 AIC 或 BIC 準則,因此直接在訓練集上計算。此方法與交叉驗證程序不同。若要比較這兩種方法,您可以參考以下範例:Lasso 模型選擇:AIC-BIC / 交叉驗證。
參考文獻
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
我們將使用糖尿病資料集。
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True)
n_samples = X.shape[0]
X.head()
Scikit-learn 提供一個名為 LassoLarsIC
的估計器,它使用 Akaike 的資訊準則 (AIC) 或貝氏資訊準則 (BIC) 來選擇最佳模型。在擬合此模型之前,我們將縮放資料集。
在以下內容中,我們將擬合兩個模型來比較 AIC 和 BIC 報告的值。
from sklearn.linear_model import LassoLarsIC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
lasso_lars_ic = make_pipeline(StandardScaler(), LassoLarsIC(criterion="aic")).fit(X, y)
為了符合 [ZHT2007] 中的定義,我們需要重新縮放 AIC 和 BIC。事實上,Zou 等人忽略了一些與從線性模型的最大對數似然導出的 AIC 原始定義相比的常數項。您可以參考使用者指南的數學詳細資訊部分。
import numpy as np
aic_criterion = zou_et_al_criterion_rescaling(
lasso_lars_ic[-1].criterion_,
n_samples,
lasso_lars_ic[-1].noise_variance_,
)
index_alpha_path_aic = np.flatnonzero(
lasso_lars_ic[-1].alphas_ == lasso_lars_ic[-1].alpha_
)[0]
lasso_lars_ic.set_params(lassolarsic__criterion="bic").fit(X, y)
bic_criterion = zou_et_al_criterion_rescaling(
lasso_lars_ic[-1].criterion_,
n_samples,
lasso_lars_ic[-1].noise_variance_,
)
index_alpha_path_bic = np.flatnonzero(
lasso_lars_ic[-1].alphas_ == lasso_lars_ic[-1].alpha_
)[0]
現在我們收集了 AIC 和 BIC,我們也可以檢查兩個準則的最小值是否發生在相同的 alpha 處。然後,我們可以簡化以下的圖。
index_alpha_path_aic == index_alpha_path_bic
np.True_
最後,我們可以繪製 AIC 和 BIC 準則以及後續選擇的正規化參數。
import matplotlib.pyplot as plt
plt.plot(aic_criterion, color="tab:blue", marker="o", label="AIC criterion")
plt.plot(bic_criterion, color="tab:orange", marker="o", label="BIC criterion")
plt.vlines(
index_alpha_path_bic,
aic_criterion.min(),
aic_criterion.max(),
color="black",
linestyle="--",
label="Selected alpha",
)
plt.legend()
plt.ylabel("Information criterion")
plt.xlabel("Lasso model sequence")
_ = plt.title("Lasso model selection via AIC and BIC")

腳本的總執行時間: (0 分鐘 0.107 秒)
相關範例