目录
岭回归
原理
缩减系数来“理解”数据
优点
缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果
岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有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应该选绿色的部分,比较平缓的降低。特征比较多,样本量少的时候,用岭回归。