程序员的自我修养
Home » Apache Spark, 机器学习 » Spark MLlib之线性回归

Spark MLlib之线性回归

14条评论41,831次浏览

本文不涉及线性回归具体算法和原理性的东西,纯新手向、介绍性的文章。

线性回归

线性回归,对于初学者而言(比方说我)比较难理解,其实换个叫法可能就能立马知道线性回归是做什么的了:线性拟合。所谓拟合,就简单多了,如下图所示:Linear_least_squares.svg

线性拟合,顾名思义拟合出来的预测函数是一条直线,数学表达如下:

\(h(x)=a_0+a_1x_1+a_2x_2+..+a_nx_n+J(\theta)\)

其中 \(h(x)\) 为预测函数, \(a_i(i=1,2,..,n)\) 为估计参数,模型训练的目的就是计算出这些参数的值。

而线性回归分析的整个过程可以简单描述为如下三个步骤:

  1. 寻找合适的预测函数,即上文中的 \(h(x)\) ,用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数,若是非线性的则无法用线性回归来得出高质量的结果。
  2. 构造一个Loss函数(损失函数),该函数表示预测的输出(h)与训练数据标签之间的偏差,可以是二者之间的差(h-y)或者是其他的形式(如平方差开方)。综合考虑所有训练数据的“损失”,将Loss求和或者求平均,记为 \(J(\theta)\) 函数,表示所有训练数据预测值与实际类别的偏差。
  3. 显然, \(J(\theta)\) 函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到 \(J(\theta)\) 函数的最小值。找函数的最小值有不同的方法,Spark中采用的是梯度下降法(stochastic gradient descent, SGD)。

关于正则化手段

线性回归同样可以采用正则化手段,其主要目的就是防止过拟合。

当采用L1正则化时,则变成了Lasso Regresion;当采用L2正则化时,则变成了Ridge Regression;线性回归未采用正则化手段。通常来说,在训练模型时是建议采用正则化手段的,特别是在训练数据的量特别少的时候,若不采用正则化手段,过拟合现象会非常严重。L2正则化相比L1而言会更容易收敛(迭代次数少),但L1可以解决训练数据量小于维度的问题(也就是n元一次方程只有不到n个表达式,这种情况下是多解或无穷解的)。

MLlib提供L1、L2和无正则化三种方法:

regularizer \(R(w)\) gradient or sub-gradient
zero (unregularized) 0 0
L2 \(\frac{1}{2}\|w\|_2^2\) \(w\)
L1 \(\|w\|_1\) \(\mathrm{sign}(w)\)

Spark线性回归实现

测试数据

附件下载:lpsa

数据格式:逗号之前为label;之后为8个特征值,以空格分隔。

代码实现

运行结果

可以看到由于采用了正则化手段,ridge和lasso相对于linear其误差要大一些。在实际测试过程中,将迭代次数变成25时,有如下输出:

可以看到此时linear还没有收敛到最终结果,而ridge却过拟合十分严重,此时lasso已经收敛等于最终结果。至于为什么产生这样的现象,我也不清楚,原理性的东西希望以后能有机会在写一篇文章。

参考文献

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
14条评论
  1. wanbo说道:

    你好,我是一个算法初学者,你的文章对我很有帮助。不过当前这篇我是真没太懂,比如我想用回归算法预测网站每天访问PV。我应该选取哪些数据,原始数据可能好多都是文本的,怎么转化成label和向量。最后怎么验证用哪种算法预测是最准的。因为其实是官方的demo没看懂,所以你的文章才更适合我这种初学者。So,方便的话可否另外在展开一篇实际例子的文章?非常不错的文章!支持下!

    • yurnom说道:

      额,关于维度的选取,可以阅读PCA主成分分析方面的文章(不知道你的问题是不是这个意思)。文本维度转化为label这个看你的业务怎么定义了,比如我们通常把性别中的男定义为0,女定义为1,然后进行预测,0.6就算是女,0.4则是男。不过很少这么处理文本维度,因为通常转化为数字后失去了其原本的意思。

  2. orange说道:

    请问博主,这段代码可以运行吗?
    看到其中有部分是Scala语句,和java混合到一起没有报错?
    我是个新手,因为要用java实现Logistics Regression,所以想找些例子参考一下,如果你有这方面的资料,请介绍一下,谢谢。

    • TTT说道:

      java8 支持lamda表达式 可以在java里加一些函数式 jre升到1.8可以运行的

      • Lola说道:

        Fucking hate the pefrmroing rights society they are fucking donkey raping pieces of shit. They should stop licking lawyers assholes and become proper human.FUCK YOU PRS!!!!!

    • Jayne说道:

      at my house growing up we always had dandelion sa,eolsdmatimes with dressings or sometimes my mother would heat some bacon fat that was left over and pour it over the greens.i did not know about store lettuce till i was in my teens.we always used the greens from the fields or yards.thanks

  3. 匿名说道:

    你好,我对你的文章很感兴趣,可以留一个邮箱或qq吗?

  4. 张是大说道:

    《深入浅出Spark机器学习实战(用户行为分析)》
    课程网盘下载:http://pan.baidu.com/s/1mixvUli 密码:1pfn

  5. 李雪璇说道:

    想要完整代码,可以帮忙发给我吗

发表评论给yurnom


profile
  • 文章总数:79篇
  • 评论总数:250条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1187天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • Anonymous: java.io.NotSerializableExcepti on: DStream checkpointing has been enabled but the DStreams with their...
  • wick: HI,请问一下,U,S,V得到后,怎么得到近似矩阵呢(用sp ark java),谢谢。
  • Michael Whitaker: Thank you for this blog, it was very helpful in troubleshooting my own issues. It seems that no...
  • Anonymous: :mad:
  • Anonymous: :???:
  • Anonymous: :mad: :mad: :mad:
  • 洋流: 哥们,我问个问题,你把testOnborrow去掉了。。如果 得到的jedis资源是个不可用的,服务从来都不出问题么?
  • 洋流: 哥们,我问个问题,你把testOnborrow去掉了。。如果 得到的jedis资源是个不可用的,服务从来都不出问题么?
  • Anonymous: :razz: :evil: :grin:
  • 张瑞昌: 有很多,比较常见的是Jacob迭代法,一次迭代O(n^3), 迭代次数不清楚。 如果是手动算的话按照定义求就可以了
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗 麻烦告诉下谢谢 qq1844554123
  • Anonymous: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮忙发给我吗
  • Anonymous: 请问一下,那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?怎么设置输出的分数的最 大值?
  • Anonymous: 那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?
  • Anonymous: stopGracefullyOnShutdown在yarn- client模式下我测试的无效,你的呢
  • Anonymous: 另外,import的lib包能否发个列表.
  • Anonymous: 部分程序已经无法使用, 另外 你的import代码 也应该放上来哈