运用Lasso

# 导入numpy数值计算库,用于生成模拟数据集和执行基础数值运算(数据分析、矩阵操作的核心库)
import numpy as np
# 从sklearn的线性模型模块导入Lasso类(专门用于实现Lasso回归算法)
# 注:Lasso回归的核心是L1正则化,通过惩罚系数的绝对值和实现特征选择(可使部分系数归零)
from sklearn.linear_model import Lasso

# 生成特征矩阵X:
# np.random.rand(100, 1):生成100行1列的二维数组,元素取值服从[0,1)区间的均匀分布
# 乘以2后,特征值的取值范围扩展为[0,2),最终得到「100个样本、1个特征」的单变量特征数据集
X = 2*np.random.rand(100, 1)

# 生成标签向量y(模拟真实场景中的线性关系+随机噪声):
# 真实数据生成逻辑:y = 4(真实截距) + 3*X(真实特征系数) + 噪声项
# np.random.randn(100, 1):生成100行1列的二维数组,元素服从「标准正态分布」(均值=0,方差=1)
# 加入噪声的目的:模拟真实数据的随机性(真实世界数据不会完全符合理想线性关系)
y = 4 + 3*X + np.random.randn(100, 1)

# 初始化Lasso回归模型,配置核心参数:
# alpha=0.01:正则化强度系数(核心参数),alpha越大,正则化约束越强(系数被惩罚得越厉害,越易归零)
#            alpha=0时退化为普通线性回归,无正则化效果
# max_iter=30000:设置模型训练的最大迭代次数(确保模型在复杂数据或强正则化下仍能收敛)
# 注:Lasso回归的核心是「L1正则化」—— 损失函数中加入系数绝对值之和的惩罚项,会迫使不重要特征的系数变为0,实现特征选择
lasso_reg = Lasso(alpha=0.01, max_iter=30000)

# 训练Lasso回归模型:
# fit(X, y):模型通过特征矩阵X和标签向量y学习线性关系,最小化「损失函数+L1正则化项」
# 注意:Lasso类对标签y的维度兼容较好,此处y为(100,1)的二维数组无需额外reshape,直接传入即可
lasso_reg.fit(X, y)

# 模型预测:输入特征值为1.5(需用二维数组[[1.5]],符合sklearn模型的输入格式要求)
# 输出结果为模型基于学习到的线性关系,对该特征值对应的标签预测值
print(lasso_reg.predict([[1.5]]))

# 输出模型的截距项(intercept_):对应真实模型中的截距4,因噪声和正则化影响会有轻微偏差
print(lasso_reg.intercept_)

# 输出模型的特征系数(coef_):对应真实模型中的系数3,因L1正则化和噪声影响会有轻微偏差
# 注:若特征数量较多,Lasso可能会将部分不重要特征的系数压缩为0,实现自动特征选择
print(lasso_reg.coef_)

简洁版

import numpy as np
from sklearn.linear_model import Lasso

X = 2*np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)

lasso_reg = Lasso(alpha=0.01, max_iter=30000)
lasso_reg.fit(X, y)

print(lasso_reg.predict([[1.5]]))
print(lasso_reg.intercept_)
print(lasso_reg.coef_)

运用SGDRegressor

# 导入numpy数值计算库,用于生成模拟数据集、执行矩阵运算等基础数值操作(数据分析领域核心工具)
import numpy as np
# 从sklearn的线性模型模块导入SGDRegressor(随机梯度下降回归器)
# 核心原理:Lasso回归的本质是「线性回归 + L1正则化」,SGDRegressor通过指定penalty='l1',
# 用随机梯度下降优化带L1正则化的损失函数,从而实现Lasso回归功能
from sklearn.linear_model import SGDRegressor

# 生成特征矩阵X:
# np.random.rand(100, 1):生成100行1列的二维数组,元素服从[0,1)区间的均匀分布
# 乘以2后,特征值取值范围扩展为[0,2),最终得到「100个样本、1个特征」的单变量特征数据集
# 样本量和特征数可根据需求调整,此处为简化演示用单特征
X = 2*np.random.rand(100, 1)

# 生成标签向量y(模拟真实世界的线性数据分布,含随机噪声):
# 真实数据生成逻辑:y = 4(真实截距项) + 3*X(真实特征系数) + 噪声项
# np.random.randn(100, 1):生成100行1列的二维数组,元素服从「标准正态分布」(均值=0,方差=1)
# 加入噪声的目的:模拟真实数据的随机性(真实场景中数据不会完全贴合理想线性关系),让实验更贴近实际
y = 4 + 3*X + np.random.randn(100, 1)

# 初始化随机梯度下降回归器,配置参数以实现Lasso回归:
# penalty='l1':指定正则化类型为L1正则化(Lasso回归的核心!惩罚项为模型系数的绝对值之和)
#              L1正则化的关键作用:会迫使模型中不重要的特征系数压缩至0,实现自动特征选择
# max_iter=10000:设置模型训练的最大迭代次数(随机梯度下降需多次迭代逼近最优解,次数足够确保收敛)
# 补充:SGDRegressor默认学习率策略、损失函数等参数已适配线性回归,无需额外调整即可实现Lasso
sgd_reg = SGDRegressor(penalty='l1', max_iter=10000)

# 训练Lasso回归模型:
# fit(X, y):核心训练方法,通过特征矩阵X和标签y,最小化「平方损失函数 + L1正则化项」,学习最优系数
# y.ravel():将y从(100,1)的二维数组转换为(100,)的一维数组
# 原因:SGDRegressor的fit方法对标签输入格式有要求,必须是一维数组,否则会报维度不匹配错误
# ravel()与reshape(-1,)功能一致,均用于降维,此处选择ravel()更简洁
sgd_reg.fit(X, y.ravel())

# 模型预测:
# 输入[[1.5]]:需为2D数组格式(形状为[样本数, 特征数]),符合sklearn模型的输入规范
# 功能:基于训练好的Lasso模型,预测特征值为1.5时对应的标签值
print(sgd_reg.predict([[1.5]]))

# 输出模型的截距项(intercept_):
# 对应真实模型中的截距4,因数据噪声和L1正则化的轻微惩罚,输出值会与4有小幅偏差(属正常现象)
print(sgd_reg.intercept_)

# 输出模型的特征系数(coef_):
# 对应真实模型中的系数3,因噪声和L1正则化约束,输出值会与3有小幅偏差
# 关键特性:若数据集含多个特征,L1正则化会将无关/弱相关特征的系数压缩为0,仅保留重要特征的非零系数(特征选择)
print(sgd_reg.coef_)

简洁版

import numpy as np
from sklearn.linear_model import SGDRegressor

X = 2*np.random.rand(100, 1)
y = 4 + 3*X + np.random.randn(100, 1)

sgd_reg = SGDRegressor(penalty='l1', max_iter=10000)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict([[1.5]]))
print(sgd_reg.intercept_)
print(sgd_reg.coef_)

更多推荐