简介
在本实验中,我们将学习如何为套索回归模型选择最佳超参数 alpha。我们将讨论两种方法:(1)仅使用训练集和一些信息准则来选择 alpha 的最优值,以及(2)使用交叉验证来选择最佳超参数。在本示例中,我们将使用糖尿病数据集。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
数据集
首先,我们将使用 sklearn.datasets 中的 load_diabetes 函数加载糖尿病数据集。该数据集由 10 个基线变量组成,包括年龄、性别、体重指数、平均血压和六项血清测量值,以及基线一年后疾病进展的定量测量值。
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()
通过信息准则选择套索回归模型
我们将使用 sklearn.linear_model 中的 LassoLarsIC 函数来提供一个套索回归估计器,该估计器使用赤池信息准则(AIC)或贝叶斯信息准则(BIC)来选择正则化参数 alpha 的最优值。我们将首先使用 AIC 准则拟合一个套索回归模型。
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)"
)
通过交叉验证选择套索回归模型
我们将使用两种不同的估计器,通过集成交叉验证来选择最佳超参数 alpha:LassoCV 和 LassoLarsCV。对于这两种算法,我们将使用 20 折交叉验证策略。
通过坐标下降法实现的套索回归
我们将使用 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
通过最小角回归实现的套索回归
我们将使用 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 会累积更多误差,而坐标下降算法只会在网格上对路径进行采样。
总结
在本实验中,我们学习了如何为套索回归模型选择最佳超参数 alpha。我们讨论了两种方法:(1)仅使用训练集和一些信息准则来选择 alpha 的最优值,以及(2)使用交叉验证来选择最佳超参数。在这个例子中我们使用了糖尿病数据集。两种方法的效果可能相似,但样本内超参数选择在计算性能方面显示出其有效性。然而,只有当样本数量相对于特征数量足够大时,它才能使用。通过交叉验证进行超参数优化是一种在不同设置下都有效的安全策略。