哈喽,我是小白~
今儿和大家详细的聊聊回归算法中的Lasso回归~
之前总结了十大回归算法的内容,大家有空可以看看,这里跳转。
后面,会细化每一个回归算法的内容,大家可以关注起来~
如果需要本文PDF版本的同学,文末获取~
另外,文末有总结性的干货~
一起来看下具体细化内容~
Lasso回归 是什么?
首先聊聊回归算法
回归算法是一种预测数值型数据的机器学习算法。它可以帮助我们找到一组自变量(例如:年龄、工资、教育程度等)和目标变量(例如:房价、工资水平等)之间的关系。通过这个关系,我们可以利用已知的自变量值预测未知的目标变量值。
举个简单例子:假设我们想预测一个人的体重,已知他的身高。我们通过观测一些人的「身高」和「体重」数据,建立一个数学模型来找到「身高」和「体重」之间的关系。接下来,通过这个模型,我们就可以根据一个未知身高的人,预测他的体重了。
再聊聊什么是Lasso回归?
Lasso回归(Least Absolute Shrinkage and Selection Operator)是一种特殊的线性回归。它在建立模型时加入了「正则化」的概念,以避免模型过于复杂,导致预测不准确的问题。
简单来说,Lasso回归在目标函数中加入一个额外的约束项(惩罚项),这个惩罚项会鼓励模型将不重要的自变量系数缩小到0,从而得到一个更简单的模型。
它的作用主要有两个:
选择重要特征:会自动忽略不重要的特征,从而减少特征的数量。 防止过拟合:避免模型过于复杂导致对训练数据过度拟合,提升模型的泛化能力。
Lasso回归的目标函数如下:
其中, 是普通的线性回归目标项; 是Lasso回归的惩罚项,其中 是一个调整惩罚程度的参数。
一个简单案例
假设我们要预测某个地区的房价(以千元为单位),已知影响房价的几个因素是「房屋面积」、「房间数」、「房屋年份」。为了便于理解,假设我们的数据样本是这样的:
样本编号 | 面积(平方米) | 房间数 | 房屋年份 | 房价(千元) |
---|---|---|---|---|
1 | 120 | 3 | 10 | 300 |
2 | 80 | 2 | 15 | 180 |
3 | 150 | 4 | 8 | 350 |
4 | 200 | 5 | 6 | 500 |
5 | 50 | 1 | 20 | 100 |
我们想建立一个模型,用来预测房价。假设我们用Lasso回归来拟合数据。
步骤1:建立回归模型
设房价 的预测值为:
其中 是常数项,、、 分别是「面积」、「房间数」和「房屋年份」对应的系数。
步骤2:引入Lasso正则化
假设我们选择一个适当的惩罚系数 (例如0.1),加入正则化项的目标函数如下:
通过最小化这个目标函数,我们可以得到模型的最优系数。Lasso回归会将一些对房价影响较小的特征系数压缩为0。
步骤3:Lasso回归的特征选择
经过计算(假设我们完成了训练过程),得到的结果可能会是这样的:
(面积的影响显著) (房间数的影响较小,被压缩为0) (房屋年份有一定影响)
最终的模型就会是:
也就是说,Lasso回归发现「房间数」对预测房价的作用很小,所以就忽略了它,而只保留了「面积」和「房屋年份」作为主要因素,这样模型就更简单,也更容易解释了。
步骤4:预测
假设我们有一个新的房子数据,面积为100平方米,房间数为3,房屋年份为12年。我们可以用这个Lasso回归模型来预测它的房价:
总结来说,Lasso回归不仅能帮助我们建立预测模型,还能自动选择出对结果影响较大的变量,剔除影响较小的变量。这种方法在数据量很大、特征很多的时候尤其有用。
公式解析
1. Lasso回归的目标函数
假设我们有一个数据集,其中:
表示样本数量; 表示特征数量; 是特征矩阵,,其中每列为一个特征; 是目标变量向量; 是我们要估计的回归系数向量; 是正则化超参数,控制惩罚项的强度。
Lasso回归的目标是找到系数 ,使得以下目标函数最小化:
这个目标函数包含两部分:
最小化误差项: 。 L1惩罚项:,其中 是正则化系数,惩罚系数绝对值的和。
其中,
误差项:是传统的最小二乘项,用于最小化预测值和真实值之间的误差。 L1惩罚项:鼓励系数向零收缩,可以产生稀疏的解,从而选择重要特征,剔除不重要的特征(系数会被压缩为0)。
2. 目标函数的简化
为了简化推导,我们可以将常数项 去除(在中心化的数据中, 会自动成为 0),则目标函数变为:
其中,
是均方误差; 是L1范数。
3. 求解过程
Lasso回归的目标函数由于包含绝对值惩罚项,具有非光滑性,因此与普通最小二乘回归不同,不能直接通过导数为零来求解。我们可以使用坐标下降法来求解Lasso回归的最优解。
坐标下降法
基本思想:固定其他参数,逐个更新每个参数,以使目标函数下降。对于每个 ,都要单独最小化目标函数。
推导过程:
固定 ()时,目标函数关于 的部分可以表示为:
进一步展开和整理,可以得到以下与 相关的简化表达:
其中, 是去掉 项后的残差。
将上述式子对 求导,并设置导数为零:
通过整理可以得到:
其中, 是软阈值函数。该函数的作用是将系数向零缩小,即实现稀疏性。
4. Lasso回归的性质
Lasso回归通过正则化项控制模型复杂度,实现特征选择。主要性质包括:
当 较大时,更多的 会被压缩为零,模型变得更稀疏,仅保留关键特征。 当 较小时,Lasso回归接近于普通最小二乘回归,所有特征都保留。
总结起来就是,Lasso回归通过在损失函数中加入L1正则化,实现了两个目的:
限制了模型复杂度,避免过拟合; 自动进行特征选择,剔除无用特征,增强模型的可解释性。
这种方法对于高维数据和特征稀疏的情况尤为有效。
优缺点和适用场景
Lasso回归的优缺点
优点
特征选择:Lasso回归能够自动选择重要特征,将无关特征的系数缩小到零,从而简化模型。这在高维数据或特征冗余的数据集中尤为重要。 防止过拟合:通过惩罚项的限制,Lasso回归有效地防止了模型对训练数据的过拟合,提高了模型的泛化能力。 可解释性好:因为模型更稀疏,变量选择后更容易解读。只有关键变量被保留,可以直接解释其对目标变量的影响。 计算效率较高:相比于其他正则化方法(如Ridge回归),Lasso在高维稀疏数据中可以较快地收敛。
缺点
无法处理完全共线的特征:如果特征之间存在完全共线性(即特征完全相同),Lasso回归可能会随机选择一个特征,而舍弃另一个。 非线性关系限制:Lasso回归是一种线性模型,适合于特征和目标变量之间线性或近似线性的关系。如果关系复杂,模型的预测效果会降低。 不适合变量数量大于样本数的场景:当特征数量远大于样本数量时(例如基因数据中的数万特征),Lasso回归表现较差,容易导致过度惩罚,舍弃大部分特征。 系数估计偏差:Lasso会在某些情况下缩小一些有用特征的系数,导致估计结果存在偏差。
适用场景
高维数据特征选择:Lasso回归适用于特征数量多、但大部分特征对目标变量影响较小的场景,例如基因数据分析、文本特征提取等。 防止过拟合的线性模型:当数据特征与目标变量的关系是线性或近似线性的,同时数据量适中时,Lasso可以有效抑制模型的过拟合。 数据稀疏性处理:适合处理稀疏数据集(例如,大部分特征是零的情况下),Lasso能够忽略掉不重要的特征,保持模型的稀疏性。
完整案例
这里,基于「股票价格预测」的案例,利用Lasso回归对多个宏观经济特征(如行业增长率、GDP增速、通胀率等)进行特征选择,这里大家学习原理就好,股票预测本身受到太多因素的影响。
数据集:
生成模拟数据:包括股票价格和相关的经济特征数据。 使用Lasso回归进行特征选择。
完整代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
# 1. 生成模拟数据
np.random.seed(42)
n_samples = 1000
n_features = 10
# 模拟生成宏观经济特征
X = np.random.randn(n_samples, n_features) * 10
columns = [f'feature_{i+1}' for i in range(n_features)]
df = pd.DataFrame(X, columns=columns)
# 设置特征的权重 (真实情况会更复杂)
true_weights = np.array([2, -1.5, 3, 0, 0, 4, 0, 0, -2, 1])
y = df.values @ true_weights + np.random.randn(n_samples) * 5 # 加入噪声
df['Stock_Price'] = y
# 2. 数据标准化和特征选择 (使用Lasso)
X_train, X_test, y_train, y_test = train_test_split(df[columns], df['Stock_Price'], test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
lasso = Lasso(alpha=0.1) # 设置L1正则化系数
lasso.fit(X_train_scaled, y_train)
# 获得选择的特征
selected_features = [columns[i] for i in range(n_features) if lasso.coef_[i] != 0]
print(f"Selected features by Lasso: {selected_features}")
# 3. 绘制图形
# 图1: 各特征与股票价格的相关性热力图
plt.figure(figsize=(12, 8))
correlation = df.corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', center=0, fmt='.2f', annot_kws={"size": 8}, linewidths=0.5)
plt.title("Heatmap of Feature Correlations with Stock Price", fontsize=16)
plt.xticks(rotation=45)
plt.yticks(rotation=45)
plt.show()
# 图2: 预测值和真实股票价格的对比
y_pred = lasso.predict(X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
plt.figure(figsize=(14, 8))
plt.plot(y_test.values, label='True Stock Price', color='blue', linewidth=2)
plt.plot(y_pred, label='Predicted Stock Price by Lasso', color='red', linestyle='--', linewidth=2)
plt.fill_between(range(len(y_test)), y_test, y_pred, color='purple', alpha=0.3)
plt.title("True vs Predicted Stock Price (Lasso Regression)", fontsize=16)
plt.xlabel("Sample Index", fontsize=12)
plt.ylabel("Stock Price", fontsize=12)
plt.legend(loc='upper left', fontsize=12)
plt.show()
数据生成:模拟了10个经济特征,并为其中一些特征赋予特定权重,以模拟对股票价格的影响。 Lasso特征选择:用Lasso回归选择出对股票价格影响最大的特征。 图1 - 热力图:显示各特征与股票价格的相关性,通过Seaborn的 heatmap
实现,色彩映射为coolwarm
。图2 - 预测对比图:显示预测的股票价格与真实价格的对比,用填充区域表示误差区域,使图形更直观。
数据分析图:
帮助咱们快速识别特征间的相关性,判断特征是否冗余。
这里,可视化了模型预测与真实数据的差异,直观展示了Lasso回归的预测效果。
这样,我们不仅获得了Lasso的特征选择,还能通过图形全面分析其效果。
最后