微信登录

回归算法 - Lasso 回归 - 带约束的回归算法

回归算法 - Lasso 回归 - 带约束的回归算法

一、引言

在机器学习的回归问题中,我们常常需要找到一个合适的模型来拟合数据,并且希望这个模型具有良好的泛化能力。普通最小二乘法(OLS)是一种常用的线性回归方法,但它有时会出现过拟合的问题,特别是当特征数量较多时。为了解决这个问题,正则化方法应运而生,Lasso 回归就是其中一种非常有效的带约束的回归算法。

二、Lasso 回归的原理

2.1 普通线性回归

普通线性回归的目标是最小化残差平方和(RSS),其数学表达式为:
[RSS(\beta)=\sum{i = 1}^{n}(y_i-\beta_0-\sum{j = 1}^{p}\betajx{ij})^2]
其中,(n) 是样本数量,(p) 是特征数量,(yi) 是第 (i) 个样本的真实值,(\beta_j) 是第 (j) 个特征的系数,(x{ij}) 是第 (i) 个样本的第 (j) 个特征值。

2.2 Lasso 回归

Lasso 回归在普通线性回归的基础上加入了 (L1) 正则化项,其目标函数为:
[L(\beta)=\sum{i = 1}^{n}(y_i-\beta_0-\sum{j = 1}^{p}\betajx{ij})^2+\lambda\sum_{j = 1}^{p}|\beta_j|]
其中,(\lambda) 是正则化参数,用于控制正则化的强度。(L1) 正则化项的作用是使得一些特征的系数变为 0,从而实现特征选择的目的。

2.3 特征选择原理

与 (L2) 正则化(如 Ridge 回归)不同,(L1) 正则化具有使某些系数严格为 0 的特性。这是因为 (L1) 正则化的约束区域是一个菱形,在求解最优解时,最优解更容易落在坐标轴上,从而使得对应的特征系数为 0。

三、Lasso 回归的优缺点

3.1 优点

  • 特征选择:可以自动选择重要的特征,减少模型的复杂度,提高模型的可解释性。
  • 处理高维数据:在特征数量远大于样本数量的情况下,Lasso 回归仍然可以表现良好。

3.2 缺点

  • 选择合适的 (\lambda) 困难:正则化参数 (\lambda) 的选择对模型的性能影响较大,需要通过交叉验证等方法进行调优。
  • 不能处理多重共线性:当特征之间存在高度的多重共线性时,Lasso 回归可能会随机选择其中一个特征,而忽略其他相关特征。

四、演示代码

下面我们使用 Python 的 scikit-learn 库来演示 Lasso 回归的使用。

  1. import numpy as np
  2. from sklearn.datasets import make_regression
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.linear_model import Lasso
  5. from sklearn.metrics import mean_squared_error
  6. # 生成数据集
  7. X, y = make_regression(n_samples=100, n_features=10, noise=0.5, random_state=42)
  8. # 划分训练集和测试集
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  10. # 创建 Lasso 回归模型
  11. lasso = Lasso(alpha=0.1) # alpha 相当于正则化参数 lambda
  12. # 训练模型
  13. lasso.fit(X_train, y_train)
  14. # 预测
  15. y_pred = lasso.predict(X_test)
  16. # 计算均方误差
  17. mse = mean_squared_error(y_test, y_pred)
  18. print(f"均方误差: {mse}")
  19. # 查看系数
  20. print("模型系数:", lasso.coef_)

五、参数调优

正则化参数 (\lambda)(在 scikit-learn 中用 alpha 表示)的选择对 Lasso 回归的性能至关重要。我们可以使用交叉验证来选择最优的 (\lambda) 值。

  1. from sklearn.linear_model import LassoCV
  2. # 创建 LassoCV 模型,使用 5 折交叉验证
  3. lasso_cv = LassoCV(alphas=np.logspace(-4, 4, 100), cv=5)
  4. # 训练模型
  5. lasso_cv.fit(X_train, y_train)
  6. # 输出最优的 alpha 值
  7. print("最优的 alpha 值:", lasso_cv.alpha_)
  8. # 预测
  9. y_pred_cv = lasso_cv.predict(X_test)
  10. # 计算均方误差
  11. mse_cv = mean_squared_error(y_test, y_pred_cv)
  12. print(f"交叉验证后的均方误差: {mse_cv}")

六、总结

算法 目标函数 特征选择 处理多重共线性 参数调优
普通线性回归 最小化残差平方和
Lasso 回归 残差平方和 + (L1) 正则化项 需要选择合适的 (\lambda)

Lasso 回归是一种非常实用的回归算法,它通过加入 (L1) 正则化项,实现了特征选择的目的,提高了模型的可解释性和泛化能力。在实际应用中,我们需要根据具体问题选择合适的正则化参数 (\lambda),以获得最优的模型性能。