一、普通线性回归
1、原理
分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。
应当怎样从一大堆数据里求出回归方程呢?
假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=X*W
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。
平方误差可以写做:
对W求导,当导数为零时,平方误差最小,此时W等于:
二、岭回归
1、原理
缩减系数来“理解”数据
如果数据的特征比样本点还多应该怎么办?是否还可以使用线性回归和之前的方法来做预测?
答案是否定的,即不能再使用前面介绍的方法。这是因为输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。
为了解决这个问题,统计学家引入了岭回归(ridge regression)的概念
缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。
岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
总结
1.岭回归可以解决特征数量比样本量多的问题
2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果
3.缩减算法可以看作是对一个模型增加偏差的同时减少方差
岭回归用于处理下面两类问题:
1.数据点少于变量个数
2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)
三、lasso回归
1、原理
【拉格朗日乘数法】
对于参数w增加一个限定条件,能到达和岭回归一样的效果:
在lambda足够小的时候,一些系数会因此被迫缩减到0
四、普通线性回归、岭回归与lasso回归比较
下面举个小例子来说明下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression,Ridge,Lasso
n_sample=50
n_feature=200
x_train=np.random.randn(n_sample,n_feature)
#创建y_train目标
#200 coef
coef=np.random.randn(n_feature)
# y_train=np.dot(x_train,coef)
inds=np.arange(0,200)
#随机打乱顺序
np.random.shuffle(inds)
coef[inds[:190]]=0
y_train=np.dot(x_train,coef)
#分别使用线性回归,岭回归,Lasso回归进行数据预测
lrg=LinearRegression()
ridge=Ridge()
lasso=Lasso()
lrg.fit(x_train,y_train)
ridge.fit(x_train,y_train)
lasso.fit(x_train,y_train)
#数据视图,此处获取各个算法的训练数据的coef_:系数,coef_可以理解为系数
plt.figure(figsize=(12,9))
axes=plt.subplot(221)
axes.plot(coef)
axes.set_title('True_coef')
#线性回归 得到的coef
axes=plt.subplot(222)
axes.plot(lrg.coef_)
axes.set_title('lrg_coef')
#l岭回归 得到的coef
axes=plt.subplot(223)
axes.plot(ridge.coef_)
axes.set_title('ridge_coef')
#lasso回归 得到的coef
axes=plt.subplot(224)
axes.plot(lasso.coef_)
axes.set_title('lasso_coef')