机器学习经典算法详解及Python实现--线性回归(Linear Regression)算法

版权声明:本文为博主原创文章,未经博主允许不得转载--“http://blog.csdn.net/suipingsp”。 https://blog.csdn.net/suipingsp/article/details/42101139

(一)认识回归

回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。顾名思义,分类算法用于离散型分布预测,如前面讲过的KNN、决策树、朴素贝叶斯、adaboost、SVM、Logistic回归都是分类算法;回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。

回归的目的就是建立一个回归方程用来预测目标值,回归的求解就是求这个回归方程的回归系数。预测的方法当然十分简单,回归系数乘以输入值再全部相加就得到了预测值。

1,回归的定义

回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。

2,多元线性回归

假定预测值与样本特征间的函数关系是线性的,回归分析的任务,就在于根据样本X和Y的观察值,去估计函数h,寻求变量之间近似的函数关系。定义:


其中,n = 特征数目;

xj = 每个训练样本第j个特征的值,可以认为是特征向量中的第j个值。

为了方便,记x0= 1,则多变量线性回归可以记为:

 ,(θ、x都表示(n+1,1)维列向量)

Note:注意多元和多次是两个不同的概念,“多元”指方程有多个参数,“多次”指的是方程中参数的最高次幂。多元线性方程是假设预测值y与样本所有特征值符合一个多元一次线性方程。

3,广义线性回归

用广义的线性函数:

    

wj是系数,w就是这个系数组成的向量,它影响着不同维度的Φj(x)在回归函数中的影响度,Φ(x)是可以换成不同的函数,这样的模型我们认为是广义线性模型,Φ(x)=x时就是多元线性回归模型。

(二)线性回归的求解

说到回归,常常指的也就是线性回归,因此本文阐述的就是多元线性回归方程的求解。假设有连续型值标签(标签值分布为Y)的样本,有X={x1,x2,...,xn}个特征,回归就是求解回归系数θ=θ0, θ1,…,θn。那么,手里有一些X和对应的Y,怎样才能找到θ呢? 在回归方程里,求得特征对应的最佳回归系数的方法是最小化误差的平方和。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以采用平方误差(最小二乘法)。平方误差可以写做:


至于为何采用最小误差平方和来求解,其统计学原理可参考“对线性回归、逻辑回归、各种回归的概念学习”的“深入线性回归”一节。

在数学上,求解过程就转化为求一组θ值使求上式取到最小值,那么求解方法有梯度下降法、Normal Equation等等。梯度下降有如下特点:需要预先选定步长a、需要多次迭代、特征值需要Scaling(统一到同一个尺度范围)。因此比较复杂,还有一种不需要迭代的求解方式--Normal Equation,简单、方便、不需要Feature Scaling。Normal Equation方法中需要计算X的转置与逆矩阵,计算量很大,因此特征个数多时计算会很慢,只适用于特征个数小于100000时使用;当特征数量大于100000时使用梯度法。另外,当X不可逆时就有岭回归算法的用武之地了。

下面就概括一下常用的几种求解算法。

1,梯度下降法(Gradient Descent)

根据平方误差,定义该线性回归模型的损耗函数(Cost Function)为:   

,(系数是为了方便求导展示)

线性回归的损耗函数的值与回归系数θ的关系是碗状的,只有一个最小点。线性回归的求解过程如同Logistic回归,区别在于学习模型函数hθ(x)不同,梯度法具体求解过程参考“机器学习经典算法详解及Python实现---Logistic回归(LR)分类器”。

2,Normal Equation(也叫普通最小二乘法)

Normal Equation算法也叫做普通最小二乘法(ordinary least squares),其特点是:给定输人矩阵X,如果XTX的逆存在并可以求得的话,就可以直接采用该方法求解。其求解理论也十分简单:既然是是求最小误差平方和,另其导数为0即可得出回归系数。


矩阵X为(m,n+1)矩阵(m表示样本数、n表示一个样本的特征数),y为(m,1)列向量。 

上述公式中包含XTX, 也就是需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用。然而,矩阵的逆可能并不存在,后面“岭回归”会讨论处理方法。

3,局部加权线性回归

线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引人一些偏差,从而降低预测的均方误差。其中的一个方法是局部加权线性回归(LocallyWeightedLinearRegression, LWLR )。在该算法中,我们给待预测点附近的每个点赋予一定的权重.于是公式变为:

,W是(m,m)矩阵,m表示样本数。

LWLR使用 “核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

,k需要优化选择.

局部加权线性回归也存在一个问题,即增加了计算量,因为它对每个点做预测时都必须使用整个数据集,而不是计算出回归系数得到回归方程后代入计算即可。因此该算法不被推荐。

4,岭回归(ridge regression)和缩减方法

当数据的样本数比特征数还少时候,矩阵XTX的逆不能直接计算。即便当样本数比特征数多时,XTX 的逆仍有可能无法直接计算,这是因为特征有可能高度相关。这时可以考虑使用岭回归,因为当XTX 的逆不能计算时,它仍保证能求得回归参数。简单说来,岭回归就是对矩阵XTX进行适当的修正,变为(I是单位矩阵,对角线为1,其他为0)从而使得矩阵非奇异,进而能对式子求逆。在这种情况下,回归系数的计算公式将变成:

 

为了使用岭回归和缩减技术,首先需要对特征做标准化处理,使各特征值的取值尺度范围相同,从而保证各特征值的影响力是相同的。

如何设置 λ 的值?通过选取不同的λ 来重复上述测试过程,最终得到一个使预测误差最小的λ 。可通过交叉验证获取最优值--在测试数据上,使误差平方和最小。

岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加人偏差,从而得到更好的估计。事实上,上述公式是在最小平方误差和公式里引入了每个特征的惩罚因子得到,为的是防止过度拟合(过于复杂的模型),在损失函数里增加一个每个特征的惩罚因子,这就是线性回归的正则化(参考“Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”)。


Note:θ0是一个常数,x0=1是固定的,那么θ0不需要惩罚因子,岭回归公式中的I的第一个元素要为0。

这里通过引入λ来限制了所有误差平方之和,通过引人该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减(shrinkage )。缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果,缩减法还可以看做是对一个数据模型的拟合采取了偏差(预测值与真实值差距)、方差(不同预测模型间的差距)折中方案,增加偏差的同时减少方差。偏差方差折中是一个重要的概念,可以帮助我们理解现有模型并做出改进,从而得到更好的模型。岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。lasso难以求解,但可以使用计算简便的逐步线性回归方法来求得近似结果。还有一些其他缩减方法,如lasso、LAR、PCA回归以及子集选择等。与岭回归一样,这些方法不仅可以提高预测精确率,而且可以解释回归系数。

5,回归模型性能度量

数据集上计算出的回归方程并不一定意味着它是最佳的,可以便用预测值yHat和原始值y的相关性来度量回归方程的好坏。相关性取值范围0~1,值越高说明回归模型性能越好。

线性回归是假设值标签与特征值之间的关系是线性的,但有些时候数据间的关系可能会更加复杂,使用线性的模型就难以拟合,就需要引入多项式曲线回归(多元多次拟合)或者其他回归模型,如回归树。

(三)线性回归的Python实现

本线性回归的学习包中实现了普通最小二乘和岭回归算法,因梯度法和Logistic Regression几乎相同,也没有特征数>10000的样本测试运算速度,所以没有实现。为了支持多种求解方法、也便于扩展其他解法,linearRegress对象采用Dict来存储相关参数(求解方法为key,回归系数和其他相关参数的List为value)。例如岭回归算法在LRDict中的key=‘ridge’,value=[ws, lamba,xmean,var, ymean]。因为岭回归模型训练和预测中需要对样本进行feature scaling,所以才需要存储xmean,var, ymean。linearRegress对象的属性如其__init__函数所示:

Source Code:Copy
  1. class linearRegress(object):   
  2.     def __init__(self,LRDict = None,  **args):   
  3.         '''currently support OLS, ridge, LWLR            
  4.         '''  
  5.         obj_list = inspect.stack()[1][-2]   
  6.         self.__name__ = obj_list[0].split('=')[0].strip()   
  7.         if not LRDict:   
  8.             self.LRDict = {}   
  9.         else:   
  10.             self.LRDict = LRDict   
  11.             #to Numpy matraix  
  12.             if 'OLS' in self.LRDict:   
  13.                 self.LRDict['OLS'] = mat(self.LRDict['OLS'])   
  14.             if 'ridge' in self.LRDict:   
  15.                 self.LRDict['ridge'][0] = mat(self.LRDict['ridge'][0])   
  16.                 self.LRDict['ridge'][2] = mat(self.LRDict['ridge'][2])   
  17.                 self.LRDict['ridge'][3] = mat(self.LRDict['ridge'][3])   
  18.                 self.LRDict['ridge'][4] = mat(self.LRDict['ridge'][4])  

线性回归模型Python学习包下载地址为:

Machine Learning Linear Regression-线性回归

(四)应用和模型调优

 对于需要根据一些特征的组合来预测一个值(如预测房价、菜价等)且预测值和特征组合间的关系是线性时既可以采用线性回归建立预测模型。通过机器学习算法建立起一个模型之后就需要在使用中不断的调优和修正,对于线性回归来说,最佳模型就是取得预测偏差和模型方差之间的平衡(高偏差就是欠拟合,高方差就是过拟合)。线性回归模型中模型调优和修正的方法包括:

- 获取更多的训练样本 - 解决高方差

- 尝试使用更少的特征的集合 - 解决高方差

- 尝试获得其他特征 - 解决高偏差

- 尝试添加多项组合特征 - 解决高偏差

- 尝试减小 λ - 解决高偏差

- 尝试增加 λ -解决高方差

详细的阐述可以参考“斯坦福大学机器学习第十课“应用机器学习的建议

参考:

线性回归和逻辑回归

机器学习入门:线性回归及梯度下降

对线性回归、逻辑回归、各种回归的概念学习

Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)

特征选择常用算法综述

本文作者Adan,来源于:机器学习经典算法详解及Python实现--线性回归(Linear Regression)算法。转载请注明出处。

阅读更多
换一批

没有更多推荐了,返回首页