机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

  • A+
所属分类:机器学习
摘要

本篇文章讲解线性回归的缩减方法,岭回归以及逐步线性回归,同时熟悉sklearn的岭回归使用方法,对乐高玩具套件的二手价格做出预测。

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

一、前言

本篇文章讲解线性回归的缩减方法,岭回归以及逐步线性回归,同时熟悉sklearn的岭回归使用方法,对乐高玩具套件的二手价格做出预测。

二、岭回归

如果数据的特征比样本点还多应该怎么办?很显然,此时我们不能再使用上文的方法进行计算了,因为矩阵X不是满秩矩阵,非满秩矩阵在求逆时会出现问题。为了解决这个问题,统计学家引入岭回归(ridge regression)的概念。

1、什么是岭回归?

岭回归即我们所说的L2正则线性回归,在一般的线性回归最小化均方误差的基础上增加了一个参数w的L2范数的罚项,从而最小化罚项残差平方和:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

简单说来,岭回归就是在普通线性回归的基础上引入单位矩阵。回归系数的计算公式变形如下:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

式中,矩阵I是一个mxm的单位矩阵,加上一个λI从而使得矩阵非奇异,进而能对矩阵求逆。

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

缩减方法可以去掉不重要的参数,因此能更好地裂解数据。此外,与简单的线性回归相比,缩减法能够取得更好的预测效果。

2、编写代码

为了使用岭回归和缩减技术,首先需要对特征做标准化处理。因为,我们需要使每个维度特征具有相同的重要性。本文使用的标准化处理比较简单,就是将所有特征都减去各自的均值并除以方差。

代码很简单,只需要稍做修改,其中,λ为模型的参数。我们先绘制一个回归系数与log(λ)的曲线图,看下它们的规律,编写代码如下:

运行结果如下:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

图绘制了回归系数与log(λ)的关系。在最左边,即λ最小时,可以得到所有系数的原始值(与线性回归一致);而在右边,系数全部缩减成0;在中间部分的某个位置,将会得到最好的预测结果。想要得到最佳的λ参数,可以使用交叉验证的方式获得,文章的后面会继续讲解。

三、前向逐步线性回归

前向逐步线性回归算法属于一种贪心算法,即每一步都尽可能减少误差。我们计算回归系数,不再是通过公式计算,而是通过每次微调各个回归系数,然后计算预测误差。那个使误差最小的一组回归系数,就是我们需要的最佳回归系数。

前向逐步线性回归实现也很简单。当然,还是先进行数据标准化,编写代码如下:

运行结果如下:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

还是,我们打印了迭代次数与回归系数的关系曲线。可以看到,有些系数从始至终都是约为0的,这说明它们不对目标造成任何影响,也就是说这些特征很可能是不需要的。逐步线性回归算法的优点在于它可以帮助人们理解有的模型并做出改进。当构建了一个模型后,可以运行该算法找出重要的特征,这样就有可能及时停止对那些不重要特征的收集。

总结一下:

缩减方法(逐步线性回归或岭回归),就是将一些系数缩减成很小的值或者直接缩减为0。这样做,就增大了模型的偏差(减少了一些特征的权重),通过把一些特征的回归系数缩减到0,同时也就减少了模型的复杂度。消除了多余的特征之后,模型更容易理解,同时也降低了预测误差。但是当缩减过于严厉的时候,就会出现过拟合的现象,即用训练集预测结果很好,用测试集预测就糟糕很多。

四、预测乐高玩具套件的价格

乐高(LEGO)公司生产拼装类玩具,由很多大小不同的塑料插块组成。它的样子如下图所示:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

一般来说,这些插块都是成套出售,它们可以拼装成很多不同的东西,如船、城堡、一些著名建筑等。乐高公司每个套装包含的部件数目从10件到5000件不等。

一种乐高套件基本上在几年后就会停产,但乐高的收藏者之间仍会在停产后彼此交易。本次实例,就是使用回归方法对收藏者之间的交易价格进行预测。

1、获取数据

书中使用的方法是通过Google提供的API进行获取数据,但是现在这个API已经关闭,我们无法通过api获取数据了。不过幸运的是,我在网上找到了书上用到的那些html文件。

原始数据下载地址:数据下载

我们通过解析html文件,来获取我们需要的信息,如果学过我的《Python3网络爬虫》,那么我想这部分的内容会非常简单,解析代码如下:

运行结果如下:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

我们对没有的商品做了处理。这些特征分别为:出品年份、部件数目、是否为全新、原价、售价(二手交易)。

html解析页面不会使用?那就学习一下爬虫知识吧~!如果对此不感兴趣,也可以跳过获取数据和解析数据,这个过程,当作已知数据,继续进行下一步。

2、建立模型

我们已经处理好了数据集,接下来就是训练模型。首先我们需要添加全为0的特征X0列。因为线性回归的第一列特征要求都是1.0。然后使用最简单的普通线性回归i,编写代码如下:

运行结果如下图所示:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

可以看到,模型采用的公式如上图所示。虽然这个模型对于数据拟合得很好,但是看上不没有什么道理。套件里的部件数量越多,售价反而降低了,这是不合理的。

我们使用岭回归,通过交叉验证,找到使误差最小的λ对应的回归系数。编写代码如下:

运行结果如下图所示:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

这里随机选取样本,因为其随机性,所以每次运行的结果可能略有不同。不过整体如上图所示,可以看出,它与常规的最小二乘法,即普通的线性回归没有太大差异。我们本期望找到一个更易于理解的模型,显然没有达到预期效果。

现在,我们看一下在缩减过程中回归系数是如何变化的。编写代码如下:

运行结果如下图所示:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

看运行结果的第一行,可以看到最大的是第4项,第二大的是第2项。

因此,如果只选择一个特征来做预测的话,我们应该选择第4个特征,也就是原始加个。如果可以选择2个特征的话,应该选择第4个和第2个特征。

这种分析方法使得我们可以挖掘大量数据的内在规律。在仅有4个特征时,该方法的效果也许并不明显;但如果有100个以上的特征,该方法就会变得十分有效:它可以指出哪个特征是关键的,而哪些特征是不重要的。

五、使用Sklearn的linear_model

老规矩,最后让我们用sklearn实现下岭回归吧。

官方英文文档地址:点击查看

sklearn.linear_model提供了很多线性模型,包括岭回归、贝叶斯回归、Lasso等。本文主要讲解岭回归Ridge。

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

1、Ridge

让我们先看下Ridge这个函数,一共有8个参数:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

参数说明如下:

  • alpha:正则化系数,float类型,默认为1.0。正则化改善了问题的条件并减少了估计的方差。较大的值指定较强的正则化。
  • fit_intercept:是否需要截距,bool类型,默认为True。也就是是否求解b。
  • normalize:是否先进行归一化,bool类型,默认为False。如果为真,则回归X将在回归之前被归一化。 当fit_intercept设置为False时,将忽略此参数。 当回归量归一化时,注意到这使得超参数学习更加鲁棒,并且几乎不依赖于样本的数量。 相同的属性对标准化数据无效。然而,如果你想标准化,请在调用normalize = False训练估计器之前,使用preprocessing.StandardScaler处理数据。
  • copy_X:是否复制X数组,bool类型,默认为True,如果为True,将复制X数组; 否则,它覆盖原数组X。
  • max_iter:最大的迭代次数,int类型,默认为None,最大的迭代次数,对于sparse_cg和lsqr而言,默认次数取决于scipy.sparse.linalg,对于sag而言,则默认为1000次。
  • tol:精度,float类型,默认为0.001。就是解的精度。
  • solver:求解方法,str类型,默认为auto。可选参数为:auto、svd、cholesky、lsqr、sparse_cg、sag。
    • auto根据数据类型自动选择求解器。
    • svd使用X的奇异值分解来计算Ridge系数。对于奇异矩阵比cholesky更稳定。
    • cholesky使用标准的scipy.linalg.solve函数来获得闭合形式的解。
    • sparse_cg使用在scipy.sparse.linalg.cg中找到的共轭梯度求解器。作为迭代算法,这个求解器比大规模数据(设置tol和max_iter的可能性)的cholesky更合适。
    • lsqr使用专用的正则化最小二乘常数scipy.sparse.linalg.lsqr。它是最快的,但可能在旧的scipy版本不可用。它是使用迭代过程。
    • sag使用随机平均梯度下降。它也使用迭代过程,并且当n_samples和n_feature都很大时,通常比其他求解器更快。注意,sag快速收敛仅在具有近似相同尺度的特征上被保证。您可以使用sklearn.preprocessing的缩放器预处理数据。
  • random_state:sag的伪随机种子。

以上就是所有的初始化参数,当然,初始化后还可以通过set_params方法重新进行设定。

知道了这些,接下来就可以编写代码了:

运行结果如下图所示:

机器学习实战教程(十二):线性回归提高篇之乐高玩具套件二手价预测

我们不搞太复杂,正则化项系数设为0.5,其余参数使用默认即可。可以看到,获得的结果与上小结的结果类似。

六、总结

  • 与分类一样,回归也是预测目标值的过程。回归与分类的不同点在于,前者预测连续类型变量,而后者预测离散类型变量。
  • 岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。lasso难以求解,但可以使用计算简便的逐步线性回归方法求的近似解。
  • 缩减法还可以看做是对一个模型增加偏差的同时减少方法。
  • 下篇文章讲解树回归。

PS: 如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!

本文出现的所有代码和数据集,均可在我的github上下载,欢迎Follow、Star:点击查看

参考文献:

Jack Cui

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:19   其中:访客  11   博主  8

    • avatar naomi 来自天朝的朋友 谷歌浏览器 Windows 7 吉林大学前卫南区 计算机楼 0

      currentRow = soup.find_all(‘table’, r=”%d” % i)请问这句话里的r=1是干什么的?

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省沈阳市 东北大学四舍(女生)

          @naomi beautifulsoup的使用方法,匹配特定属性的标签,看我之前的文章吧。http://blog.csdn.net/c406495762/article/details/71158264

        • avatar biancheng 来自天朝的朋友 火狐浏览器 Windows 7 广东省深圳市 电信 2

          问题一:进行乐高项目之前的总结一下里面有这么一句话:“但是当缩减过于严厉的时候,就会出现过拟合的现象,即用训练集预测结果很好,用测试集预测就糟糕很多”。当缩减过于严厉,那最终所选用的特征就少,那不是应该出现欠拟合吗?
          问题二:乐高项目中的岭回归交叉验证那一块,测试的数据在进行标准化的时候,为什么要用训练集的标准?是因为测试集的样本少,而训练集的样本多,约等于总样本的平均值和方差,所以才用吗?那这样的话,在筛选训练集和样本集之前先标准化是不是更好?
          问题三:乐高项目中的岭回归交叉验证那一块,yEst = matTestX * np.mat(wMat[k,:]).T + np.mean(trainY),这里为什么要加上trainY的均值?标准化的缘故?

            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

              @biancheng 问题一:缩减过于严格,就是那个系数很小,即拟合效果非常好,但是仅在训练集上表现好。
              问题二:训练的时候最好不要使用测试集的数据,如果用了测试集可能导致模型的普适性不好。
              问题三:这个是公式。需要加上均值。

              • avatar 天天搞科研 来自天朝的朋友 谷歌浏览器 Windows 10 广东省广州市 电信 3

                @biancheng 問題三:之前訓練集的標簽有減去均值,所以預測時不需要加上,現在標簽沒有減去均值,所以在預測時要加上均值。我是這樣理解的。

              • avatar 蜗牛 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 东北大学二舍东 3

                华哥 matTestX = (matTestX – meanTrain) / varTrain #测试集标准化 这个标准话的时候 为啥是测试集减去的训练集的均值然后除以训练集的方差?

                  • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省沈阳市 东北大学四舍(女生)

                    @蜗牛 文中原话:“为了使用岭回归和缩减技术,首先需要对特征做标准化处理。因为,我们需要使每个维度特征具有相同的重要性。本文使用的标准化处理比较简单,就是将所有特征都减去各自的均值并除以方差。”
                    这个例子就是这么处理的。

                      • avatar 蜗牛 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 东北大学二舍东 3

                        @Jack Cui 好的华哥,只是觉得怪怪的 觉得正常是matTestX = (matTestX – meanTest) / varTest

                          • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

                            @蜗牛 哦哦,你说的这个啊,计算的时候是不能用测试集的数据,交叉验证的时候用的测试集进行预测,用的均值数据也应该是训练集的。

                              • avatar 蜗牛 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 东北大学二舍东 3

                                @Jack Cui 这样那,好的 谢啦华哥

                        • avatar 天天搞科研 来自天朝的朋友 谷歌浏览器 Windows 10 广东省广州市 电信 3

                          我想問下,在用嶺回歸做交叉驗證的時候,爲什麽原始數據集的第一列特徵不是一列全1的向量,這樣求出來的unreg衹有4列,爲什麽之前的程序裏面又要添加一列全1的特徵?謝謝。

                            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省沈阳市 东北大学四舍(女生)

                              @天天搞科研 因为w0为1呀,看下前面的文章,逻辑回归那里记得有提到。

                                • avatar 天天搞科研 来自天朝的朋友 谷歌浏览器 Windows 10 广东省广州市 电信 3

                                  @Jack Cui 爲什麽前面輸入數據集包括一列全1的向量,後面的數據集卻沒有包括?謝謝。

                                    • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 江苏省 移动

                                      @天天搞科研 这个就是为了方便计算的,具体的因为好久了,记不太清了。我记得是,数据集不加1,可以在程序中,添加。

                                • avatar daohes 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省长沙市 电信 1

                                  为什么在对数据标准化的时候,不用对y除以方差。

                                    • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

                                      @daohes 这个是公式哈~上文有介绍

                                        • avatar daohes 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省长沙市 电信 1

                                          @Jack Cui 额,请问是那一篇哦。

                                            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

                                              @daohes 本文提到,为了使用岭回归和缩减技术,首先需要对特征做标准化处理。因为,我们需要使每个维度特征具有相同的重要性。本文使用的标准化处理比较简单,就是将所有特征都减去各自的均值并除以方差。

                                                • avatar daohes 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省长沙市 电信 1

                                                  @Jack Cui 那为什么对y要做处理,y不是特征啊。而且要做处理的话,为什么只求yMat-yMean,而不用进行像xMat那样标准化。