机器学习算法笔记:岭回归、Lasso回归、ElasticNet回归
在解决较复杂数据的回归问题时,普通线性回归算法通常预测精度不足。如果模型中的特征之间存在相关性,就会增加模型的复杂度。如果数据集中的特征之间存在很强的线性相关性,即特征之间存在严重的多重共线性时,采用普通最小二乘法来估计模型参数,参数估计的方差往往太大大的。最棒的。在这种情况下,解 模型非常不稳定。具体数值与真实值相差很大,有时还存在与真实含义不符的正负号。
在线性回归中,如果参数太大,特征太多,很容易造成过拟合,如下图:
![]()
正则化
Ridge回归和Lasso回归的发生解决了线性回归中的过拟合以及用正规方程的方法求解过程中出现的
不可逆问题。两种类型的回归都通过在损失函数中引入正则化项来实现其目标。
在日常机器学习任务中,如果数据集的特征多于样本点, 就会出错。岭回归最初用于处理特征数量超过样本数量的情况,现在也用于为估计添加偏差,从而获得更好的估计。在这里,所有
的总和受到
的引入的限制。通过引入惩罚的概念,可以减少不重要的参数。这种技术在统计学中也称为收缩。与岭回归类似,进一步简化的LASSO也添加了正则表达式来约束回归系数。
为了避免过拟合(太大),在目标函数
\theta
后面添加复杂度惩罚因子,或者正则表达式,以避免过载。通用术语可以使用L1标准(Lasso)、L2标准(Ridge)或L1标准和L2标准(Elastic Net)的组合。 ? 简单易懂的正则化:
- 正则化的目的:防止过拟合
- 正则化的要点:限制(约束)要优化的参数
关于第1点,过拟合是指数据量,这堆数据包含噪声。使用模型来拟合这堆数据也可以拟合噪声数据。这是非常致命的。一方面,它使模型变得复杂。另一方面,模型的泛化性能会受到影响。太糟糕了。当你遇到新的数据来测试时,得到的叠加模型的精度将会非常低。
对于第2点,最初解空间是整个区域,但是调节增加了一定的限制,这减少了解空间,即使使用单独的正则化方法,解也会变得稀疏。说到这里我不得不提一下这张照片。相信大家都经常看到这样的画面,但似乎并没有特别明确的解释。我将在这里尝试解释一下。图片如下:
![]()
上图中,左边是Lasso的回访,右边是里奇的回访。红色椭圆和蓝色区域的接触点就是目标函数的最优解。我们看到,如果是一个圆,裁剪到圆周上的任意一点很容易,但是裁剪到坐标轴上就很难了,所以不存在稀疏性。 ;但如果它是菱形或多边形,很容易将其裁剪到坐标轴,因此很容易创建稀疏结果。这也解释了为什么L1范式是稀疏的。这就解释了为什么lasso可以进行特征选择。梳状回归虽然无法进行特征筛选,但它对模型进行了约束,使其值会更小,从而大大缓解了过拟合问题。
这里是模型和
的所有参数。待优化的目标参数。蓝色区域实际上是解空间。如上所述,此时解空间已经“缩小”了。在这个缩小的空间中,你只能找到最小化目的函数的
、
。再看红圈,再次提醒大家,这个坐标轴与函数(数据)无关。它完全是一个参数坐标系。每个圆上可以有无数个
、
,这些
、
有一个共同的性质,用它们计算出的目标函数的值是相同的。红圈的中心是真正的最优参数,但由于我们限制了解空间,所以最优解只能在“缩减”的解空间中生成。
以两个变量为例解释岭回归的几何意义:
1。当没有限制的时候。模型参数、
已标准化。残差平方和RSS可以表示为二次函数
、
,在数学上可以表示为抛物面。
![]()
2。当梳子返回时。限制项是,对应投影到平面
上的圆,
,也就是下图中的圆柱体。
![]()
可以看出,梳状回归解与原始最小二乘解存在一定的距离。
使用 Scikit-Learn 进行岭回归、Lasso 回归和 ElasticNet 回归
岭回归
岭回归在普通最小二乘法的损失函数中添加了一个额外的惩罚项,以限制 L2 数项。
在这种情况下,X 是一个矩阵,所有样本都是列向量,w 代表权重向量。系数表示正则化的强度。
![]()
| 123456789101112131415161718 | from sklearn.linear_model import Ridgefrom sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitboston = load_boston()X = boston.datay = boston.target# 将数据拆分为一组训练数据和测试数据(数据的 20%)将用作测试数据集) X_train, (X_train, y_train) #模型在训练样本上的准确率 test_score = model.score(X_test, y_test) #模型在测试集上的准确率 print(train_score)print(test_score) |
alpha值是梳状系数,scikit-learn提供了一个RidgeCV类,可以自动搜索网格找到最佳值:
| 123456789101112131415 | from sklearn.linear_model import RidgeCV from sklearn.datasets import load_boston from sklearn。 model_selection import train_test_splitboston = load_boston()X = boston.datay = boston.target# 将数据拆分为训练数据集和测试数据集(20%的数据将用作测试数据集) X_train, X_test, y_train, y_test = train_test_split(X, y , test_size=0.2, random_state=3)模型 = RidgeCV (alpha=[1.0, 0.5, 0.1, 0.05, 0.01, 0.005, 0.001, 0.0005, 0.0001], normalize=True)model.fit(X_train, y_train)print(model.alpha_) |
Lasso 回归
Lasso 回归添加了 L1 范数 w 作为惩罚项来确定系数的数量 很多不必要items(零值):
![]()
具体代码与Ridge回归类似,这里不再赘述
ElasticNet回归
ElasticNet将Lasso和Ridge结合成一个模型,两个因子一与L1成正比另一个范数与 L2 范数成正比。使用这种方法得到的模型比纯 Lasso 回归稀疏,但具有与梳状回归提供的相同的正则化功能。其损失函数为:
由上式可知,使用ElasticNet时,我们需要提供两个参数和
。
中的参数名称为l1_ratio:
| 1234567891011121314 | from sklearn.datasets import load_bostonfrom sklearn.linear_model import LassoCV, ElasticNetCVboston = load_boston()# 找到回归的最佳alpha值C0V1vpha = Lasso. , 0.01, 0.001, 0.005, 0.0025, 0.001, 0.00025), normalize=True)lscv.fit(boston.data, boston.target)print('Lasso的最优 alpha: %.3f' % lscv.alpha_) alpha 和 l1_ratio elastic Netencv = ElasticNetCV(alphas=(0.1, 0.01, 0.005, 0.0025, 0.001), l1_ratio=(0.1, 0.25, 0.5, 0.75, bostonizeston= 0.8c) .target)print('ElasticNet 最优 alpha: %.3f 和 L1比例:%.4f' % (encv.alpha_, encv.l1_ratio_)) |
参考链接:
- https://esl.hohoweiya. xyz/03-Linear-Methods-for-Regression/3.4-Shrinkage-Methods/index.html
- http://python.jobbole.com/88799/
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网