美文网首页
ML06-LASSO回归

ML06-LASSO回归

作者: 杨强AT南京 | 来源:发表于2018-12-21 09:11 被阅读48次

本主题主要说明LASSO回归,LASSO回归与Ridge回归一样,都是属于广义线性回归的一种。LASSO回归与Ridge回归一样,从概率模型来讲都是属于后验概率模型。主要内容:

  1. LASSO回归模型
  2. LASSO实现(sklearn实现,其他实现在这儿暂时没有时间弄)
  3. Ridge回归与LASSO回归的比较

2. LASSO回归

  LASSO是由1996年Robert Tibshirani首次提出,全称Least absolute shrinkage and selection operator(最小绝对收缩和选择算子)。该方法是一种压缩估计。

2.1 LASSO回归模型
  1. 决策模型

  |- y=xW

  1. 损失函数模型

  |-J(W)=\dfrac{1}{2}( \sum \limits _{i=1}^{n} (y_i - x_iW)^2 + \lambda \sum \limits _{i=1}^{k} {|w_i|} )

  1. Bayes建模模型

  误差模型:
    |-y=xW + \epsilon
    |-\epsilon \sim N(0, \sigma ^ 2)分布,且w_i \sim Laplace(0,b)分布。
    
    |-f(x)=\dfrac{1}{2 b} exp{ (- \dfrac{|x-\mu|}{ b } )}

  最大似然函数模型:
    l(W)=log\prod\limits_{j=1}^{k}{\dfrac{1}{2b}exp(-\dfrac{|w_j|}{b})} \prod\limits_{i=1}^{m}{\dfrac{1}{\sqrt{2\pi}\sigma}exp(-\dfrac{(y^{(i)}-x^{(i)}W)^2}{2\sigma^2})}

    l(W)= k\ log\ \dfrac{1}{2 b}-\dfrac{1}{b}\ \dfrac{1}{2}\sum\limits_{j=1}^{k}|w_j| \ + \ m\ log\ \dfrac{1}{\sqrt{2\pi}\sigma}-\dfrac{1}{\sigma^2}\ \dfrac{1}{2}\sum\limits_{i=1}^{m}(y^{(i)}-x^{(i)}W)^2
    
    l(W)=-\dfrac{1}{\sigma^2}\ \dfrac{1}{2}\sum\limits_{i=1}^{m}(y^{(i)}-x^{(i)}W)^2 -\dfrac{1}{b}\ \dfrac{1}{2}\sum\limits_{j=1}^{k}|w_j| + k\ log\ \dfrac{1}{2 b} + m\ log\ \dfrac{1}{\sqrt{2\pi}\sigma}
    l(W)=-\dfrac{1}{\sigma^2}\ (\dfrac{1}{2}\sum\limits_{i=1}^{m}(y^{(i)}-x^{(i)}W)^2 +\dfrac{\sigma ^ 2}{b}\ \dfrac{1}{2}\sum\limits_{j=1}^{k}|w_j| ) + k\ log\ \dfrac{1}{2 b} + m\ log\ \dfrac{1}{\sqrt{2\pi}\sigma}

  如果记:\lambda=\dfrac{\sigma ^ 2}{b} ,则可以取损失函数为:
    |-J(W)=\dfrac{1}{2}( \sum \limits _{i=1}^{n} (y_i - x_iW)^2 + \lambda \sum \limits _{i=1}^{k} {|w_i|} )

  1. LASSO与Ridge回归的关系

  实际上Ridge回归与LASSO回归都是采用了后验建模,Ridge回归的权重系数服从正态分布,LASSO回归权重系数服从Laplace分布。
  Ridge回归中的\lambda实际上是正态分布方差的倒数\lambda=\dfrac{1}{\sigma ^2},在LASSO分布中的\lambda实际上由误差的正态分布方差与Laplace的方差共同决定\lambda=\dfrac{\sigma^ 2}{b},如果\sigma=1取标准正态的方差1,则\lambda=\dfrac{1}{b}

  1. 正态分布函数的方差变化
      f(x)=\dfrac{ 1 }{\sqrt{2 \pi } \sigma} exp ( - \dfrac{ ( x - \mu ) ^ 2 }{ 2 \sigma ^ 2 } )
% matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# u=0
n=lambda x,s:(np.exp(-x**2/(2.0*s**2)))

x=np.linspace(-3,3,201,dtype=np.float64)

sigma=1
y_1=n( x, sigma )

sigma=0.5
y_2=n( x, sigma )

sigma=0.01
y_3=n( x, sigma )

# 可视化
figure=plt.figure('正态函数',figsize=(10,4))
ax=figure.add_axes([0.1,0.1,0.8,0.8],xlabel='X',ylabel='Y')
ax.plot(x,y_1,color= ( 1, 0, 0, 1 ),label='$\sigma=1$')
ax.plot(x,y_2,color= ( 0, 1, 0, 1 ), label='$\sigma=0.5$')
ax.plot(x,y_3,color= ( 0, 0, 1, 1 ), label='$\sigma=0.01$')
plt.legend()
plt.grid(True)
plt.show()
正态分布方差参数的影响对比
  1. Laplace分布函数的方差变化
      f(x)= \dfrac{1}{2 \lambda } exp (- \dfrac{ | x- \mu | }{ \lambda } )
% matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# u=0
n=lambda x,s:np.exp(-np.abs(x)/s)

x=np.linspace(-3,3,201,dtype=np.float64)

sigma=1
y_1=n( x, sigma )

sigma=0.5
y_2=n( x, sigma )

sigma=0.01
y_3=n( x, sigma )

# 可视化
figure=plt.figure('正态函数',figsize=(10,4))
ax=figure.add_axes([0.1,0.1,0.8,0.8],xlabel='X',ylabel='Y')
ax.plot(x,y_1,color= ( 1, 0, 0, 1 ),label='$\sigma=1$')
ax.plot(x,y_2,color= ( 0, 1, 0, 1 ), label='$\sigma=0.5$')
ax.plot(x,y_3,color= ( 0, 0, 1, 1 ), label='$\sigma=0.01$')
plt.legend()
plt.grid(True)
plt.show()
拉普拉斯分布的参数影响对比
  1. 正态分布函数与Laplace分布函数的比较
% matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# u=0
n=lambda x,s:(np.exp(-x**2/(2.0*s**2)))
l=lambda x,s:np.exp(-np.abs(x)/s)

x=np.linspace(-3,3,201,dtype=np.float64)

sigma=0.5
y_1=n( x, sigma )
y_2=l( x, sigma)

# 可视化
figure=plt.figure('正态函数',figsize=(10,4))
ax=figure.add_axes([0.1,0.1,0.8,0.8],xlabel='X',ylabel='Y')
ax.plot(x,y_1,color= ( 1, 0, 0, 1 ),label='正态分布')
ax.plot(x,y_2,color= ( 0, 0, 1, 1 ), label='$\sigma=0.5$')

plt.legend()
plt.grid(True)
plt.show()
正态分布与拉普拉斯分布在参数为0.5的对比

  可以看得出来,拉普拉斯分布,在相同的参数下,取值为0更加不容易。

2.2 LASSO实现
  1. sklearn实现
% matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import datasets
from sklearn import preprocessing

#  数据集
data=np.loadtxt('ex0.txt')
X_DATA=data[:,1]
Y_DATA=data[:,2]
# 数据格式化
X_DATA=X_DATA.reshape(X_DATA.shape[0],1)
Y_DATA=Y_DATA.reshape(X_DATA.shape[0],1)


#x=preprocessing.scale(x)
#y=preprocessing.scale(y)

alpha=0.001
regression =linear_model.Lasso(alpha=alpha, fit_intercept=True)

regression.fit(X_DATA,Y_DATA)

pre=regression.predict(X_DATA)

pre=pre.reshape(pre.shape[0],1)
#cor=np.corrcoef(Y_DATA.T,pre.T)
#print('相关性:',cor)
# 测试
print('评估:',regression.score(X_DATA, Y_DATA))
# 斜率
print('斜率:',regression.coef_)
# 截距
print('截距:',regression.intercept_ )

figure=plt.figure('数据集可视化',figsize=(6,4))
ax=figure.add_axes([0.1,0.1,0.8,0.8],xlabel='X',ylabel='Y')

ax.scatter(X_DATA,Y_DATA,color=(0,0,1,1),marker='.')

ax.plot(X_DATA,pre,color=(1,0,0,1))

# 有网格线,更加容易观察
plt.grid(True)
plt.show()
评估: 0.9730836494329972
斜率: [1.68361119]
截距: [3.01346217]
LASSO回归直线

3. Ridge回归与LASSO回归的比较

% matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import datasets
from sklearn import preprocessing

#  鸢尾花数据集
data,target=datasets.load_iris(return_X_y=True)
x=data[:]       #改变样本个数,观察效果非常明显
y=target[:] 

x=x.astype(np.float64)
y=y.astype(np.float64)

x=preprocessing.scale(x)
y=preprocessing.scale(y)

# lambda变化200次,从10**-2到10**-10
n_alphas = 50
alphas = np.logspace(-10,4,n_alphas)
lasso =linear_model.Lasso(fit_intercept=True)

# 加权系数
coefs_lasso = []
for a in alphas:
    lasso.set_params(alpha = a)
    lasso.fit(x,y)
    coefs_lasso.append(lasso.coef_)
    
#------------------------------------
ridge =linear_model.Ridge(fit_intercept=True)

# 加权系数
coefs_ridge = []
for a in alphas:
    ridge.set_params(alpha = a)
    ridge.fit(x,y)
    coefs_ridge.append(ridge.coef_)
    

figure=plt.figure('数据集可视化',figsize=(10,4))
ax_lasso=figure.add_axes([0.1,0.1,0.4,0.8],xlabel='X',ylabel='Y')
# plot自动遍历每列,按照不同的颜色绘制曲线
ax_lasso.plot(alphas,coefs_lasso)
ax_lasso.set_xscale('log')    # 不按照等分模式计算x轴刻度,按照对数的指数来计算刻度
ax_lasso.set_xlim(ax_lasso.get_xlim()[::-1])    #坐标轴换一个方向
ax_lasso.grid(True)

ax_ridge=figure.add_axes([0.6,0.1,0.4,0.8],xlabel='X',ylabel='Y')
# plot自动遍历每列,按照不同的颜色绘制曲线
ax_ridge.plot(alphas,coefs_ridge)
ax_ridge.set_xscale('log')    # 不按照等分模式计算x轴刻度,按照对数的指数来计算刻度
ax_ridge.set_xlim(ax_ridge.get_xlim()[::-1])    #坐标轴换一个方向



# 有网格线,更加容易观察
plt.grid(True)
plt.show()

鸢尾花数据下,参数的变化对权重系数影响的比较,LASSO分布更容易产生权重系数为0的情况(前一个LASSO回归,后一个Ridge回归)

  Ridge回归与LASSO回归的权重系数的变化,主要后验概率分布受条件概率的影响。Ridge的条件概率是正态分布,LASSO的条件概率是Laplace分布。两个曲线的特征明显可以感知他们的方差参数对权重系数的影响(正如我们最后一张图所示的一样)。


  本主题缺LASSO分布的Numpy原生实现,有时间的时候我迟早会补上。

相关文章

  • ML06-LASSO回归

    本主题主要说明LASSO回归,LASSO回归与Ridge回归一样,都是属于广义线性回归的一种。LASSO回归与Ri...

  • ElasticNet回归的python实现及与岭回归、lasso

    ElasticNet回归与岭回归、Lasso回归ElasticNet回归也叫弹性网络回归,是岭回归和Lasso回归...

  • 宁静致远

    回归自然回归宁静回归身体回归爱回归初心回归灵魂。2019.2.8(初四)西院跑步

  • 👼

    回归宁静 回归(初)爱 回归初心 回归良知 回归光明 回归希望 回归发展 积极保持乐观无限回到最初(小时候)自己 ...

  • 机器学习实战-04-Logistic回归

    一、Logistic回归介绍   回归算法有很多,比如:线性回归、Logistic回归、多项式回归、逐步回归、岭回...

  • 与世界对话与自己对话的过程-自信坚信慷慨勇敢-坚信我🐼

    “放弃” 并回归自己回归自然回归爱回归初心回归大道 如果没有生存与发展那么就回归初心回归爱 接受改变(超越)离开(...

  • 机器学习day7-逻辑回归问题

    逻辑回归 逻辑回归,是最常见最基础的模型。 逻辑回归与线性回归 逻辑回归处理的是分类问题,线性回归处理回归问题。两...

  • 赵培山:古圣冢林与古圣园林

    打造海岱岱蒙大文化圈 回归大济宁,回归皋陶,回归伯益,回归少皞,回归太昊,回归舜帝的父母,回归始祖文化,回归有文献...

  • 机器学习算法总结

    回归算法 线性回归算法: 支持向量机&向前逐步回归&惩罚线性回归(岭回归/套索回归/ElasticNet/最小角度...

  • 回归日

    回归自己,回归本真,回归于爱。

网友评论

      本文标题:ML06-LASSO回归

      本文链接:https://www.haomeiwen.com/subject/lfwpkqtx.html