最强总结,十大回归算法 - Lasso回归!!

文摘   2024-10-31 11:27   北京  

哈喽,我是小白~

今儿和大家详细的聊聊回归算法中的Lasso回归~

之前总结了十大回归算法的内容,大家有空可以看看,这里跳转

后面,会细化每一个回归算法的内容,大家可以关注起来~

如果需要本文PDF版本的同学,文末获取~

另外,文末有总结性的干货~

一起来看下具体细化内容~

Lasso回归 是什么?

首先聊聊回归算法

回归算法是一种预测数值型数据的机器学习算法。它可以帮助我们找到一组自变量(例如:年龄、工资、教育程度等)和目标变量(例如:房价、工资水平等)之间的关系。通过这个关系,我们可以利用已知的自变量值预测未知的目标变量值。

举个简单例子:假设我们想预测一个人的体重,已知他的身高。我们通过观测一些人的「身高」和「体重」数据,建立一个数学模型来找到「身高」和「体重」之间的关系。接下来,通过这个模型,我们就可以根据一个未知身高的人,预测他的体重了。

再聊聊什么是Lasso回归?

Lasso回归(Least Absolute Shrinkage and Selection Operator)是一种特殊的线性回归。它在建立模型时加入了「正则化」的概念,以避免模型过于复杂,导致预测不准确的问题。

简单来说,Lasso回归在目标函数中加入一个额外的约束项(惩罚项),这个惩罚项会鼓励模型将不重要的自变量系数缩小到0,从而得到一个更简单的模型。

它的作用主要有两个:

  • 选择重要特征:会自动忽略不重要的特征,从而减少特征的数量。
  • 防止过拟合:避免模型过于复杂导致对训练数据过度拟合,提升模型的泛化能力。

Lasso回归的目标函数如下:

  • 其中, 是普通的线性回归目标项;
  •  是Lasso回归的惩罚项,其中  是一个调整惩罚程度的参数。

一个简单案例

假设我们要预测某个地区的房价(以千元为单位),已知影响房价的几个因素是「房屋面积」、「房间数」、「房屋年份」。为了便于理解,假设我们的数据样本是这样的:

样本编号面积(平方米)房间数房屋年份房价(千元)
1120310300
280215180
315048350
420056500
550120100

我们想建立一个模型,用来预测房价。假设我们用Lasso回归来拟合数据。

步骤1:建立回归模型

设房价  的预测值为:

其中  是常数项, 分别是「面积」、「房间数」和「房屋年份」对应的系数。

步骤2:引入Lasso正则化

假设我们选择一个适当的惩罚系数 (例如0.1),加入正则化项的目标函数如下:

通过最小化这个目标函数,我们可以得到模型的最优系数。Lasso回归会将一些对房价影响较小的特征系数压缩为0。

步骤3:Lasso回归的特征选择

经过计算(假设我们完成了训练过程),得到的结果可能会是这样的:

  • (面积的影响显著)
  • (房间数的影响较小,被压缩为0)
  • (房屋年份有一定影响)

最终的模型就会是:

也就是说,Lasso回归发现「房间数」对预测房价的作用很小,所以就忽略了它,而只保留了「面积」和「房屋年份」作为主要因素,这样模型就更简单,也更容易解释了。

步骤4:预测

假设我们有一个新的房子数据,面积为100平方米,房间数为3,房屋年份为12年。我们可以用这个Lasso回归模型来预测它的房价:

总结来说,Lasso回归不仅能帮助我们建立预测模型,还能自动选择出对结果影响较大的变量,剔除影响较小的变量。这种方法在数据量很大、特征很多的时候尤其有用。

公式解析

1. Lasso回归的目标函数

假设我们有一个数据集,其中:

  •  表示样本数量;
  •  表示特征数量;
  •  是特征矩阵,,其中每列为一个特征;
  •  是目标变量向量;
  •  是我们要估计的回归系数向量;
  •  是正则化超参数,控制惩罚项的强度。

Lasso回归的目标是找到系数 ,使得以下目标函数最小化:

这个目标函数包含两部分:

  1. 最小化误差项: 
  2. L1惩罚项,其中  是正则化系数,惩罚系数绝对值的和。

其中,

  • 误差项:是传统的最小二乘项,用于最小化预测值和真实值之间的误差。
  • L1惩罚项:鼓励系数向零收缩,可以产生稀疏的解,从而选择重要特征,剔除不重要的特征(系数会被压缩为0)。

2. 目标函数的简化

为了简化推导,我们可以将常数项 去除(在中心化的数据中, 会自动成为 0),则目标函数变为:

其中,

  •  是均方误差;
  •  是L1范数。

3. 求解过程

Lasso回归的目标函数由于包含绝对值惩罚项,具有非光滑性,因此与普通最小二乘回归不同,不能直接通过导数为零来求解。我们可以使用坐标下降法来求解Lasso回归的最优解。

坐标下降法

基本思想:固定其他参数,逐个更新每个参数,以使目标函数下降。对于每个 ,都要单独最小化目标函数。

推导过程

固定 )时,目标函数关于  的部分可以表示为:

进一步展开和整理,可以得到以下与  相关的简化表达:

其中, 是去掉  项后的残差。

将上述式子对  求导,并设置导数为零:

通过整理可以得到:

其中, 是软阈值函数。该函数的作用是将系数向零缩小,即实现稀疏性。

4. Lasso回归的性质

Lasso回归通过正则化项控制模型复杂度,实现特征选择。主要性质包括:

  • 当  较大时,更多的  会被压缩为零,模型变得更稀疏,仅保留关键特征。
  • 当  较小时,Lasso回归接近于普通最小二乘回归,所有特征都保留。

总结起来就是,Lasso回归通过在损失函数中加入L1正则化,实现了两个目的:

  • 限制了模型复杂度,避免过拟合;
  • 自动进行特征选择,剔除无用特征,增强模型的可解释性。

这种方法对于高维数据和特征稀疏的情况尤为有效。

优缺点和适用场景

Lasso回归的优缺点

优点

  1. 特征选择:Lasso回归能够自动选择重要特征,将无关特征的系数缩小到零,从而简化模型。这在高维数据或特征冗余的数据集中尤为重要。
  2. 防止过拟合:通过惩罚项的限制,Lasso回归有效地防止了模型对训练数据的过拟合,提高了模型的泛化能力。
  3. 可解释性好:因为模型更稀疏,变量选择后更容易解读。只有关键变量被保留,可以直接解释其对目标变量的影响。
  4. 计算效率较高:相比于其他正则化方法(如Ridge回归),Lasso在高维稀疏数据中可以较快地收敛。

缺点

  1. 无法处理完全共线的特征:如果特征之间存在完全共线性(即特征完全相同),Lasso回归可能会随机选择一个特征,而舍弃另一个。
  2. 非线性关系限制:Lasso回归是一种线性模型,适合于特征和目标变量之间线性或近似线性的关系。如果关系复杂,模型的预测效果会降低。
  3. 不适合变量数量大于样本数的场景:当特征数量远大于样本数量时(例如基因数据中的数万特征),Lasso回归表现较差,容易导致过度惩罚,舍弃大部分特征。
  4. 系数估计偏差:Lasso会在某些情况下缩小一些有用特征的系数,导致估计结果存在偏差。

适用场景

  1. 高维数据特征选择:Lasso回归适用于特征数量多、但大部分特征对目标变量影响较小的场景,例如基因数据分析、文本特征提取等。
  2. 防止过拟合的线性模型:当数据特征与目标变量的关系是线性或近似线性的,同时数据量适中时,Lasso可以有效抑制模型的过拟合。
  3. 数据稀疏性处理:适合处理稀疏数据集(例如,大部分特征是零的情况下),Lasso能够忽略掉不重要的特征,保持模型的稀疏性。

完整案例

这里,基于「股票价格预测」的案例,利用Lasso回归对多个宏观经济特征(如行业增长率、GDP增速、通胀率等)进行特征选择,这里大家学习原理就好,股票预测本身受到太多因素的影响。

数据集:

  1. 生成模拟数据:包括股票价格和相关的经济特征数据。
  2. 使用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.5300400-21])
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=(128))
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=(148))
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的特征选择,还能通过图形全面分析其效果。

最后

以上就是今天所有的内容了。
获取本文PDF,点击名片回复「基础算法模型」即可~
 
另外, 我们整理了机器学习算法册子,总共16大块的内容,124个问题的总结点击领取!
如果对你来说比较有用,记得点赞、转发,收藏起来慢慢学习~
下期会有更多干货等着你!~

Python和机器学习初学者
Python和机器学习分享,只写干货,一起学习~
 最新文章