03月02, 2017

利用回归模型预测数值型数据

回归

机器学习算法按照目标变量的类型,分为标称型数据和连续型数据。标称型数据类似于标签型的数据,而对于它的预测方法称为分类,连续型数据类似于预测的结果为一定范围内的连续值,对于它的预测方法称为回归。

含义

“回归”一词比较晦涩,下面说一下这个词的来源:

“回归”一词是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。 Galton在大量对象上应用了回归分析,甚至包括人的身高预测。他注意到,如果双亲的高高度比平均高度高,他们的子女也倾向于比平均高度高,但尚不及双亲(笔者感觉未必,Galton并未考虑物质条件的发展会带来整体身高的增加,至少笔者感觉80,90的人普遍比父母高)。孩子的高度向着平均高度“回归”。

类型

回归按照方法可分为线性回归和非线性回归。线性回归适用线性方程来拟合曲线进行预测。在非线性回归中,特征之间出现非线性操作的可能性(比如相乘或者相除)。非线性回归中有种特殊的类型--逻辑回归,和线性回归不同的是,它属于“分类”的问题,这是由于它适用曲线拟合的方式来解决分类问题,所以也被称为回归。

线性回归

原理简介

线性回归衡量的是两个变量之间的关系,最直接的办法就是求得一个回归方程(regression equation),将已知条件x代入方程得到预测结果y。

假设我们获取到一个地区过去一段时间内的房价走势情况,我们根据下面的公式进行评估:

alt

上面的式子可以看到房价和房屋面积、房子朝向呈线性的关系。而求该方程的过程称为回归方程,其中0.7和0.19称为回归系数,面积和房子的朝向称为特征

可以看到“回归”问题最重要的是如何获得回归方程,如果得到该方程后,所有的一切问题将迎刃而解。

假如我们用X(m×n)来表示特征的矩阵,回归系数θ(n×1)来表示,预测结果由Y=Xθ获得。在实际应用中,我们通常认为能带来最小平方误差的θ就是我们所要寻找的回归系数向量。平方误差指的是预测值与真实值的差的平方,这种方法就称为“最小二乘法”。所以回归问题转化为如何求最小平方误差,即目标函数为:

alt

求该函数的方法很多,在此介绍一种方法:

  • θ求导: 该矩阵还可以写成alt,如果对θ求导,就会得到 alt
  • 倒数为0,求出θ alt

注意,上述公式中包含alt,也就是需要对矩阵求逆。因此这个方程只在逆矩阵存在的情况下适用。

应用

上面讲解了线性回归的原理,那如何将上面的算法应用到现实的场景中呢?我们使用python语言将上述的算法实现了一遍:

def standRegres(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat
    # #判断是否存在逆矩阵
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws

得到回归系数后,还需要乘以特征值后得到预测值。

大家会说python不是以算法包的种类多而出名吗?有现成的算法库,我干嘛还要自己去实现算法呢。当然,python里面有sklearn包中有现成的linear_model的函数可以供大家使用,而且使用方法特别简单:

  • 导入算法包
from sklearn import datasets, linear_model
  • 训练模型
regr = linear_model.LinearRegression()
regr.fit(x, mydata)
  • 预测
predict_outcome = regr.predict(x)

模型评估

基本上所有的数据集都可以使用上述的方法建立模型,那么,如何来判断模型的好坏呢?如果比较一下下面两个图,如果在这两个数据集上做线性回归,那么效果肯定不相同。

alt

图1 具有相同回归系数的两组数据的对比

我们可以计算预测值和真实值之间的误差,也就是计算这两个序列的相关系数,来评价模型的好坏。

python中,Numpy库提供了相关系数的计算方法corrcoef(yEstimate,yActual)来计算预测值和真实值之间的相关性。可以看出具有相同回归系数的两组数据,上图的相关系数是0.58,而下图的相关系数是0.99,则可以说明该回归系数对下图使用的数据集效果要好。

局部加权线性回归

前一节我们用普通的线性回归在遇到图1的上图时候就会出现严重的欠拟合现象,这种现象在图1的下图也会反映出来。解决这种欠拟合的问题最直接的方法是牺牲普通线性回归的无偏估计方法,转为有偏估计,对预测点的周围节点赋予不同的权值。离预测点近的点赋予较高的权值,反之则赋予低的权值。这种通过改变权值的方法就叫做局部加权线性回归。

该算法解出来回归系数的形式为:

alt

可以看到,在普通的线性回归的基础上,多了一个矩阵W,W是一个n×m的矩阵。那如何做到不同的点被赋予不同的权值呢?局部加权线性回归适用“核函数”来赋予权值,最常用的高斯核,它的权重为:

alt

可以看到高斯核中涉及到一个参数k,如何选择合适的k成为了关键的问题。图2可以看到参数k和权重的关系:

alt

图2 每个点的权重值(假设我们预测的点为x=0.5)

在图2中,k越大,权重衰减的越慢,而k越小,权重衰减的越快,离预测点比较近的点才对预测值产生影响。

我们采用了三种k对图1下图中的样本进行预测,结果如图3、4和5所示。

alt

图3 k为1,和普通的线性回归一样,用来做对比

alt

图4 k为0.01

alt

图5 k为0.003

可以看到k为1时,由于是用一条直线进行拟合,所以反映不出来样本的规律,容易出现欠拟合的现象,而当k为0.003时,由于将个别样本的特例反映到整体趋势中,所以容易出现过拟合的现象。k为0.01时,效果最好。

除了容易出现过拟合的问题外,局部加权线性回归的计算量也相当大,因为它对每个待遇测点做预测时都必须遍历整个数据集才能得出回归系数向量,使用时要加以注意。

岭回归

线性回归能够求解回归系数的前提是alt是满秩矩阵,即矩阵有逆矩阵,而如果alt矩阵中有某些矩阵共线,也就是alt的行列式为0,则这种情况就不能求出回归系数。

岭回归中通过引入λI来使回归矩阵可解,则回归系数的矩阵变为:

alt

I为n*n的单位矩阵,该矩阵看起来就像一个“岭”,所以叫做岭回归,岭回归归根结底就是求λ。

岭回归的目标函数变为:

alt

可以看到岭回归在原来普通的线性回归的基础上加入了一个二范数惩罚项,其目的在于限制回归系数矩阵的取值,减少不必要的参数。

不同的λ将会得到不同的θ,反映不同的λ和θ的关系的图叫做岭迹图:

alt

在λ为很小的时候,θ基本上不怎么变化,而当λ很大时,θ趋于0,在中间时可以找到一个最好的回归系数,图中最好的效果是最上面的一条曲线。

总的来说,岭回归用来处理变量之间相关度比较高的情况,它在最小二乘法的基础上加入了一个系数后,能够解决共线的问题,因而具有比较高的应用价值。

本文链接:https://www.opsdev.cn/post/line_regression.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。