孙其功陪你学之——Spark MLlib之线性回归

转自 程序员的自我修养 – SelfUp.cn

由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享。

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

线性回归

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

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

h(x)=a0+a1x1+a2x2+..+anxn+J(θ)

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

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

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

Spark线性回归实现

测试数据

附件下载:lpsa

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

代码实现

运行结果

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

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

参考文献

  • MLlib - Linear Methods
  • Linear regression
  • 【机器学习笔记1】Logistic回归总结

你可能感兴趣的:(spark,spark,mllib,线性回归)