线性回归,岭回归,套索回归等等

6 篇文章 1 订阅
2 篇文章 0 订阅

目录

 

岭回归

原理

缩减系数来“理解”数据

优点

总结

小结

应用场景

代码实现

导包

样本小于特征,无数个解

打乱索引

矩阵乘法

比较三种算法

计算斜率

岭回归alpha最优化

导包

设X矩阵

设y

岭回归拟合

画图表示 alpha和coefs的关系


岭回归

原理

缩减系数来“理解”数据

优点

缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果

岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。

为了得到一致假设而使假设变得过度严格称为过拟合,bias:指的是模型在样本上的输出与真实值的误差;variance:指的是每个模型的输出结果与所有模型平均值(期望)之间的误差。

总结

小结

1.岭回归可以解决特征数量比样本量多的问题,2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果,3.缩减算法可以看作是对一个模型增加偏差的同时减少方差。

应用场景

1.数据点少于变量个数,2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大),3.应用场景就是处理高度相关的数据。

代码实现

导包

# LinearRegression,Ridge,Lasso

import numpy as np

from sklearn.linear_model import LinearRegression,Ridge,Lasso,RidgeCV,LassoCV

import matplotlib.pyplot as plt
%matplotlib inline

样本小于特征,无数个解

# 50样本,200特征
# 无解:无数个解
X = np.random.randn(50,200)

w = np.random.randn(200)#系数
w

打乱索引


index = np.arange(0,200)
np.random.shuffle(index)#顺序打乱
index

将其中的190个置为0

w[index[:190]] = 0
w

矩阵乘法

y = X.dot(w)
y#50个

比较三种算法

#不计算截距
linear = LinearRegression(fit_intercept=False)

ridge = RidgeCV(alphas = [0.001,0.01,0.1,1,2,5,10,20,50,100],cv = 5,fit_intercept=False)#交叉验证找最佳的系数alpha

lasso = LassoCV(alphas=[0.001,0.01,0.1,1,2,5,10],cv = 3,fit_intercept=False)#交叉验证找最佳的系数alpha



linear.fit(X,y)

ridge.fit(X,y)

lasso.fit(X,y)

计算斜率

linear_w = linear.coef_

ridge_w = ridge.coef_

lasso_w = lasso.coef_
plt.figure(figsize=(12,9))
axes = plt.subplot(2,2,1)
axes.plot(w)

axes = plt.subplot(2,2,2)
axes.plot(linear_w)
axes.set_title('Linear')

axes = plt.subplot(2,2,3)
axes.plot(ridge_w)
axes.set_title('Ridge')

axes = plt.subplot(2,2,4)
axes.plot(lasso_w)
axes.set_title('Lasso')

岭回归可以让模型更简单。套索回归擅长样本少于属性,解稀松。

岭回归alpha最优化

导包

import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.linear_model import Ridge

设X矩阵

X = 1/(np.arange(1,11) + np.arange(0,10).reshape(-1,1))
X

 

设y

y = np.ones(10)
y

岭回归拟合

ridge = Ridge(fit_intercept=False)#让截距等于0

alphas = np.logspace(start = -10,stop = -2,num = 200)#logspace等比数列,比linespace划分的更加细腻

coefs = []#斜率

for a in alphas:
    ridge.set_params(alpha = a)
    
    ridge.fit(X,y)
    
    coefs.append(ridge.coef_)

coefs
    

画图表示 alpha和coefs的关系

# 结论:找图中平滑的区域作为alpha值(参考)
_ = plt.plot(alphas,coefs) 
plt.xscale('log')#缩放 log形式
plt.ylabel('coef',fontsize = 25,color = 'red',rotation = 0)
plt.xlabel('alpha',fontsize = 25)

 

alpha越大,就越起收缩的作用。

选alpha应该选绿色的部分,比较平缓的降低。特征比较多,样本量少的时候,用岭回归。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值