003《Python数据分析、挖掘与可视化(第2版)》/套索回归.py
from time import time
from scipy.sparse import coo_matrix
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso

X, y = make_regression(n_samples=1000, n_features=8000,  # 样本数量,特征数量
                       n_informative=20,                 # 实际有效的特征数量
                       noise=0.9,                        # 高斯噪声的标准差
                       random_state=20230409,            # 使得每次运行结果相同
                      )
# 把部分数据置0,使数据稀疏
X[X<2] = 0
# 创建压缩稀疏列格式的矩阵,可以使用toarray()转换为稠密格式的数组
X_sparse = coo_matrix(X).tocsc()
# 查看压缩比,nnz属性的值为稀疏矩阵实际保存的数据个数
print(f'压缩后数据量变为原来的:{X_sparse.nnz/X.size:.3%}')

# 创建套索回归对象,参数alpha的值越大,选择的特征数量越少
estimator = Lasso(alpha=3, fit_intercept=False, max_iter=10000)
# 使用原始数据拟合模型,记录所用时间以及训练后的模型参数
start = time()
estimator.fit(X, y)
print(f'原始稠密数据训练用时:{time()-start}秒')
coef_dense = estimator.coef_

# 使用稀疏矩阵格式的数据重新拟合模型,记录所用时间以及训练后的模型参数
start = time()
estimator.fit(X_sparse, y)
print(f'稀疏矩阵格式的数据训练用时:{time()-start}秒')
coef_sparse = estimator.coef_

print(f'两种格式的数据训练后模型参数之差的最大值为:{(coef_sparse-coef_dense).max()}')