Scikit 学习 Lasso 回归

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验展示了如何在密集和稀疏数据上使用 Scikit-learn 的 Lasso 回归算法。Lasso 算法是一种线性回归方法,它对回归系数添加了一个惩罚项。这个惩罚项促使模型产生稀疏系数。Lasso 算法在特征数量相对于样本数量较大的情况下很有用。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库

我们首先导入必要的库。我们需要 Scikit-learn、NumPy 和 SciPy。

from time import time
from scipy import sparse
from scipy import linalg
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso

生成密集数据

接下来,我们生成一些将用于 Lasso 回归的密集数据。我们使用 Scikit-learn 的make_regression函数来生成具有 5000 个特征的 200 个样本。

X, y = make_regression(n_samples=200, n_features=5000, random_state=0)

在密集数据上训练 Lasso

现在我们训练两个 Lasso 回归模型,一个在密集数据上,另一个在稀疏数据上。我们将 alpha 参数设置为 1,最大迭代次数设置为 1000。

alpha = 1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)

将 Lasso 应用于密集数据

我们使用 Scikit-learn 的fit函数将 Lasso 回归模型应用于密集数据。我们还对拟合过程进行计时,并打印每个 Lasso 模型的时间。

t0 = time()
sparse_lasso.fit(X_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(X, y)
print(f"Dense Lasso done in {(time() - t0):.3f}s")

比较密集 Lasso 和稀疏 Lasso 的系数

我们比较密集 Lasso 模型和稀疏 Lasso 模型的系数,以确保它们产生相同的结果。我们计算系数之间差异的欧几里得范数。

coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")

生成稀疏数据

接下来,我们生成一些将用于 Lasso 回归的稀疏数据。我们从上一步复制密集数据,并将所有小于 2.5 的值替换为 0。我们还将稀疏数据转换为 Scipy 的压缩稀疏列格式。

Xs = X.copy()
Xs[Xs < 2.5] = 0.0
Xs_sp = sparse.coo_matrix(Xs)
Xs_sp = Xs_sp.tocsc()

在稀疏数据上训练 Lasso

现在我们训练两个 Lasso 回归模型,一个在密集数据上,另一个在稀疏数据上。我们将 alpha 参数设置为 0.1,最大迭代次数设置为 10000。

alpha = 0.1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)

将 Lasso 应用于稀疏数据

我们使用 Scikit-learn 的fit函数将 Lasso 回归模型应用于稀疏数据。我们还对拟合过程进行计时,并打印每个 Lasso 模型的时间。

t0 = time()
sparse_lasso.fit(Xs_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(Xs, y)
print(f"Dense Lasso done in  {(time() - t0):.3f}s")

比较密集 Lasso 和稀疏 Lasso 的系数

我们比较密集 Lasso 模型和稀疏 Lasso 模型的系数,以确保它们产生相同的结果。我们计算系数之间差异的欧几里得范数。

coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")

总结

在本实验中,我们展示了如何在密集数据和稀疏数据上使用 Scikit-learn 的 Lasso 回归算法。我们证明了 Lasso 算法在密集数据和稀疏数据上能产生相同的结果,并且在稀疏数据的情况下,该算法运行得更快。