第8章 预测数值型数据:回归

作者: 1597830b3381 | 来源:发表于2017-08-15 19:36 被阅读37次

    回归是监督方法的延续,而回归与分类不同,在于其目标变量是连续数值。

    8.1 用线性回归找到最佳拟合直线

    回归的目的是预测数值型的目标值,最直接的方法是依据输入写出一个目标值的计算公式。,这就是所谓的回归方程。求回归系数的过程就是回归。

    线性回归就是将输入项分别乘以一些常量,再将结果加起来输出。

    经过一系列数学变化,求系数向量w最终可以同对X和Y的矩阵计算得到。X是输入数据矩阵,Y是分类标签向量。通过调用NumPy库里(哇靠!库里!)的矩阵方法,仅使用几行代码就能实现功能,这种方法又叫做“普通最小二乘法”。

    对文件ex0.txt进行操作,得到如下图:

    ex0.txt的数据集和它的最佳拟合直线

    为了计算预测值yHat序列和真实值y序列的匹配程度,我们可以计算这两个序列的相关系数。NumPy库提供了相关系数的计算方法。通过一个命令就能计算出来。

    预测值与真实值相关系数是0.98

    该矩阵包含所有两两组合相关系数,对角线数据是1.0,即自己跟自己完美匹配。

    8.2 局部加权线性回归

    线性回归有一个问题:欠拟合。因为它求的是具有最小均方误差的无偏估计。所以有些方法就允许在估计中引入一些偏差,从而降低预测的均方误差。

    其中一个方法就是局部加权线性回归。原理:给每个待预测点附近的每一个点赋予一定的权重,然后再基于最小均方差来进行普通的回归。它会给每个待预测点附近的点给以对应的权重,这种权重的分配是:随着样本点与待预测点距离的递增,权重以指数级衰减。权重计算依据高斯核公式。得到只含对角元素的权重矩阵W就能将权重矩阵代入回归系数计算公式来计算回归系数。

    在计算高斯核的公式中,有一个参数k是我们可以设置的,它决定了对附近的点赋予多大的权重。下面是k取不同值时的结果。

    k=1.0 k=0.01 k=0.003

    可以看到,1图的权重很大,最佳拟合直线跟上一节线性回归一致,说明欠拟合。2图得到了很好的效果,揭示了数据的潜在规律。3图呢,过拟合了,纳入了太多了噪声点,使拟合的直线和数据点过于贴切。

    8.3 示例:预测鲍鱼的年龄

    鲍鱼年龄是根据鲍鱼壳的层数推算出来的(涨姿势 。。。)

    k越小,预测误差就越小

    可以看到,使用较小的核可以得到较低的误差。但是使用最小的核会导致过拟合,对新数据不一定能达到最好的预测效果。

    所以,看看它们在新数据上的表现:

    最小的核在测试数据上却有最大的误差

    接下来,再来和简单的线性回归作比较:

    通过线性回归得到的预测误差

    简单线性回归达到了与局部加权线性回归类似的效果。

    这也表明,必须在未知数据上比较结果才能选取最佳模型。而局部加权线性回归的问题在于:为了作出预测,需要保存所有训练数据。下面介绍提高预测精度的方法。

    8.4 缩减系数来“理解”数据

    如果特征比样本点还多,那么输入数据矩阵就不是满秩矩阵了,也就无法计算逆矩阵,无法求得回归系数。为解决这个问题,本宝宝提出了三个办法:岭回归,lasso法,前向逐步回归。

    8.4.1 岭回归

    岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。引入lambda限制所有w之和,通过引入惩罚项,能够减少不重要的参数,这个技术就叫做缩减。缩减去掉了不重要的参数,所以能更好地理解数据。

    PS:代码里出现了几个“有趣”的操作:1、一个n*1矩阵可以减去一个1*1的矩阵,并且这个结果是列矩阵所有元素都减去那个唯一的元素。2、一个n*m的矩阵A可以减去或者除以一个1*m的矩阵,结果是n*m矩阵每行都减去或者除以1*m矩阵的对应元素。

    我表示很服,不禁感叹:python大法好啊~各种神操作,这要是java。。。

    下图是30个不同lambda所对应是回归系数:

    回归系数与log(lambda)的关系

    注:

    书上:图中最左边,lambda最小时,可以得到所有系数的原始值(与线性回归一致),到最右边,系数全部缩减成0。中间部分的某值可以取得最好的预测效果。为了定量地找到最佳参数值,还需要交叉验证。此外,要判断哪些变量对结果预测最具有影响力,在图中观察它们对应的系数大小即可。

    我:图中八条线段,其实代表天龙八部八个特征,八个特征的回归系数在不同lambda下的变化。画图用的是回归系数的数组,数组每行是用不同lambda算出的回归系数,一共30行8列。也就意味着同一行数据是同一个lambda下8个不同特征的值,代表图某一竖线经过的8个点。同一列数据是一个特征在30个不同lambda下的变化,也就是图上8条线段之一。lambda不断变大,最终所有回归系数都缩减到0。而要想知道那个特征对预测结果的影响最大,可以观察图中回归系数的大小,系数越大,其对应的特征对预测结果影响越大。(疑惑:这就是所谓的“理解数据”??这到底怎么体现对数据的理解的?书中说缩减可以去掉不重要的参数以理解数据。这个参数是对预测结果影响小的特征呢还是某条数据呢?暂且认为是特征吧~)

    8.4.2 lasso

    尴尬~公式打不上来~

    看书吧,区别啥的都在书上,不敲了~

    但是,这边是有疑惑的,岭回归中是lambda非常大时,回归系数缩减为0,这个根据求回归系数的矩阵公式大概能明白为什么。而lasso的约束条件表达了当lambda足够小时,回归系数缩减为0,这个看约束条件也能明白。可是为什么两个趋势相反呢???奇了怪了,难道都用lambda但是其实是两个意思相反的参数值?黑人问号脸。。。

    8.4.3 前向逐步回归

    能取得和lasso差不多效果,但更简单,而且还是个贪心算法(从代码可以体会),代码主要就是每次只改某一个特征的一个值,加或减一个很小的步长然后算和真实分类的误差,误差变小就将回归系数记录下来,多次迭代,不断优化。

    下图是使用0.005的步长经过1000次迭代的结果:

    鲍鱼数据集上执行逐步线性回归法得到的系数与迭代次数的关系

    这个算法的优点在于帮助人们理解现有模型并改进。这个理解就是:你可以看到哪个特征对结果影响最大或最小,这样人们就可以及时停止对不重要特征信息的采集。比如图中红线代表的特征在0处徘徊,那就可以减少对它的信息采集,减少工作量。

    此外,我们应用缩减方法(岭回归或逐步线性回归)时,模型中就增加了偏差,与此同时也减少了方差。下一节就揭示它们的关系并分析它们对结果的影响。

    PS:又发现一个神奇的操作,书P151将逐步线性回归的预测结果与最小二乘法的预测结果进行比较时,调用普通线性回归的函数来计算回归系数,这也没啥,然而这个实参是居然是矩阵,形参居然是数组,也就是说可以直接把矩阵赋给了数组,惊呆了我的小伙伴,这要是在java里。。。

    8.5  权衡偏差和方差

    本不能理解这两个为什么会有相关性,看到网上一些博客才恍然大悟。原来志华的西瓜书里已经介绍过,当时看时没有体会,此时代入一个具体的算法再来比较这两者的区别和联系才明白其中真正的含义。除西瓜书P44页外,再给出一些资料:

    机器学习中的偏差和方差


    线性回归中偏差,方差权衡


    简单总结:

    (1)西瓜书总结

    偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。

    方差度量了同样大小的训练集的变动所产生的学习性能的变化,即刻画了数据扰动所造成的影响。

    噪声表达了当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

    而泛化性能是由学习算法的能力,数据的充分性以及学习任务本身的难度共同决定的。给定一个学习任务,想要获得较好的泛化性能,则需要偏差较小,方差较小。偏差小意味着能够充分拟合数据,方差小意味着数据扰动产生的影响小。

    一般而言,偏差与方差有冲突,即偏差-方差窘境:给定一个学习任务,训练程度不足时,学习器拟合能力不强,训练数据的扰动不足以使学习器产生明显变化,此时偏差主导了泛化错误率。而随着训练强度加大,学习器拟合能力不断增强,训练数据发生的扰动就能渐渐被学习器学到,此时方差主导了泛化错误率。在训练程度充足之后,学习器拟合能力极强,训练数据的轻微扰动都会使学习器发生显著变化,当训练数据自身的、非全局性的特性被学习器学到,那就是过拟合了。

    (2)机器学习实战总结

    方差和偏差概念强调:方差是模型之间的差异,比如说,从鲍鱼数据集中随机取100个数据用线性模型拟合得到了一组回归系数W1,再随机取100个数据用线性模型拟合得到了一组回归系数W2。模型方差的大小就是W1和W2之间的差异大小。而偏差是模型产生的预测值与真实值的差异大小。

    前面提到降低核的大小,就是在局部加权线性回归中,k越来越小时,就是提高模型复杂度,这样学习器拟合程度渐渐提高,导致方差变大,偏差变小。降低核在下图里就是黑线从左到右的过程。

    而前面提到的缩减法相反,因为它将一些系数缩减成很小的值或是0,就减少了模型复杂度,增大了模型偏差。通过缩减可以去掉某些不重要的特征,使模型容易理解,同时降低预测误差。缩减法在下图里就是黑线从右到左的过程。图中左侧是参数缩减过于严厉,右侧是无缩减。

    (3)丫的,还想对上面两个博客来一个总结,仔细看看也没啥好写,知识点差不多写完了。so~that  is  all~

    偏差,方差,预测误差

    8.6  示例:预测乐高玩具套装价格

    完犊子。。。

    要访问Google API控制台返回产品信息然后做操作。。。

    老子在中国啊。。。万里长城啊。。。

    代码简记:交叉验证测试岭回归,验证10次,每次随机选90%作训练集,10%作测试集,用训练得来的回归系数对测试集算预测误差,因为是岭回归,所以可以得到30个不同lambda下预测误差。再求30个不同lambda下10次验证的均值,找到最小误差对应的lambda,也就是说这个lambda缩减效果最好,然后找到这个lambda对应的回归系数,这就是要求的回归系数了。最后将数据还原呈现出来即可。(好吧,我承认说的很乱,大概流程我能明白就行,这也不太好说啊~)

     8.7  本章小结

    在回归方程里,求得特征对应的最佳回归系数的方法是最小化误差的平方和。

    输入数据集x,如果(x的转置)*x的逆存在,那么回归法都可以用,这就是线性回归。

    因为线性回归欠拟合,所以使用“核”来对待预测点附近的点赋予更高的权重,这就是局部加权线性回归。它在估计中引入了偏差,从而降低了预测的均方误差。核越小,拟合越好,核太小会导致过拟合,偏差很小方差很大。

    当数据样本数少于特征数时,(x的转置)*x的逆无法计算,或者虽然数据样本数多于特征数,但是特征之间高度相关,这时就要用到岭回归算法,它是缩减法的一种,对回归系数的大小施加了限制,

    另一种缩减法是lasso,但它难以求解,我们就用计算简便的逐步线性回归方法来求得近似结果。缩减法可以看做是对一个模型增加偏差的同时减少方差。

    PS:这是我记笔记最多的一章。。。。我也是醉了,越看越多越写越多~感悟不少,很充实,但是~真的好多啊~除了这些文字代码也注释了很多~~常看常新吧~东西多了容易忘哦~

    相关文章

      网友评论

        本文标题:第8章 预测数值型数据:回归

        本文链接:https://www.haomeiwen.com/subject/crivrxtx.html