线性回归(六)—— LASSO

LASSO

介绍

在岭回归那一篇说到特征过多而样本过少会出现过拟合的问题,岭回归的解决策略是加一个惩罚函数,也就是正则化。

其实岭回归中的正则化只是L2正则化,如果换成是L1正则化,那么代价函数就会变为
J ( θ 0 , θ 1 , … , θ n ) = 1 2 m ( ∑ i = 1 m ( y i − h θ ( x i ) ) 2 + λ ∑ i = 1 m ∣ θ i ∣ ) J(\theta_0,\theta_1,…,\theta_n) = \frac{1}{2m}(\sum_{i=1}^{m}{(y^i-h_\theta(x^i))^2}+\lambda\sum_{i=1}^m|\theta_i|) J(θ0,θ1,,θn)=2m1(i=1m(yihθ(xi))2+λi=1mθi)
这就是LASSO的代价函数。

优势

为什么好端端的岭回归不用,要用这个LASSO呢?

因为岭回归缺乏解释力,最后就算把 λ \lambda λ调的非常大,特征参数也只是会趋向0,不会等于0。

明明是特征过多导致的问题,最后你怎么还能预测这么多特征呢?

LASSO就不一样了,随着 λ \lambda λ的增大,会将一个个特征参数逐步变成0,这些参数对应的特征就可以被认为是“多余”的。

下面给出解释

再来看一眼Ridge回归的代价函数
J ( θ 0 , θ 1 , … , θ n ) = 1 2 m ( ∑ i = 1 m ( y i − h θ ( x i ) ) 2 + λ ∑ i = 1 m θ i 2 ) J(\theta_0,\theta_1,…,\theta_n) = \frac{1}{2m}(\sum_{i=1}^{m}{(y^i-h_\theta(x^i))^2}+\lambda\sum_{i=1}^m\theta_i^2) J(θ0,θ1,,θn)=2m1(i=1m(yihθ(xi))2+λi=1mθi2)
如果把 λ \lambda λ看成是还未选定的参数,那么我们就是求以下这个函数的极小值
J ( θ 0 , θ 1 , … , θ n , λ ) = 1 2 m ( ∑ i = 1 m ( y i − h θ ( x i ) ) 2 + λ ∑ i = 1 m θ i 2 ) J(\theta_0,\theta_1,…,\theta_n,\lambda) = \frac{1}{2m}(\sum_{i=1}^{m}{(y^i-h_\theta(x^i))^2}+\lambda\sum_{i=1}^m\theta_i^2) J(θ0,θ1,,θn,λ)=2m1(i=1m(yihθ(xi))2+λi=1mθi2)
如果你学过高等数学下册的话,就很容易想到拉格朗日乘数法,也就是说,求上面这个函数的极小值和求以下这个函数的条件极值是一样的
J ( θ 0 , θ 1 , … , θ n ) = 1 2 m ∑ i = 1 m ( y i − h θ ( x i ) ) 2 J(\theta_0,\theta_1,…,\theta_n) = \frac{1}{2m}\sum_{i=1}^{m}{(y^i-h_\theta(x^i))^2} J(θ0,θ1,,θn)=2m1i=1m(yihθ(xi))2
条件是为: ∑ i = 1 m θ i 2 ≤ t \sum_{i=1}^m\theta_i^2\leq t i=1mθi2t

同理,LASSO和Ridge一样,只不过条件为: ∑ i = 1 m ∣ θ i ∣ ≤ t \sum_{i=1}^m|\theta_i|\leq t i=1mθit

以二元为例,我们看一下这张图

在这里插入图片描述

左边是LASSO,右边是Ridge。

残差平方和要取到最小,并且在条件的限制下(图中蓝色区域),那么最小值一定发生在相切处。

Ridge的条件是一个圆,刚好相切在 β 1 \beta_1 β1 β 2 \beta_2 β2取0时的概率很小,但LASSO是凸出来的角,就很容易在凸角处相切。就更容易使 β 1 \beta_1 β1 β 2 \beta_2 β2取到0。

因为是带绝对值的,所以有些地方是不可导的,那就不能用梯度下降或正规方程来解特征参数,我也还没搞明白到底是怎么求 θ \theta θ的,以后搞明白了再补一篇吧。

LASSO的python实现

# encoding:utf-8
import numpy as np
from sklearn import linear_model

# 读取数据
data = np.genfromtxt('../data/longley.csv',delimiter=',')
x_data = data[1:,2:]
y_data = data[1:,1]

# 创建模型 
model = linear_model.LassoCV()
model.fit(x_data,y_data)

# 打印lasso系数
print("LASSO系数为 :{0}".format(model.alpha_))
print("真实值为:")
print(y_data)
print("LASSO预测值为:")
print(model.predict(x_data))

LASSO

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值