由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享。
本文不涉及线性回归具体算法和原理性的东西,纯新手向、介绍性的文章。
线性回归
线性回归,对于初学者而言(比方说我)比较难理解,其实换个叫法可能就能立马知道线性回归是做什么的了:线性拟合。所谓拟合,就简单多了,如下图所示:
线性拟合,顾名思义拟合出来的预测函数是一条直线,数学表达如下:
h(x)=a0+a1x1+a2x2+..+anxn+J(θ)
其中 h(x) 为预测函数, ai(i=1,2,..,n) 为估计参数,模型训练的目的就是计算出这些参数的值。
而线性回归分析的整个过程可以简单描述为如下三个步骤:
- 寻找合适的预测函数,即上文中的 h(x) ,用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数,若是非线性的则无法用线性回归来得出高质量的结果。
- 构造一个Loss函数(损失函数),该函数表示预测的输出(h)与训练数据标签之间的偏差,可以是二者之间的差(h-y)或者是其他的形式(如平方差开方)。综合考虑所有训练数据的“损失”,将Loss求和或者求平均,记为 J(θ) 函数,表示所有训练数据预测值与实际类别的偏差。
- 显然, 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 | 12∥w∥22 | w |
L1 | ∥w∥1 | sign(w) |
Spark线性回归实现
测试数据
附件下载:lpsa
数据格式:逗号之前为label;之后为8个特征值,以空格分隔。
代码实现
运行结果
可以看到由于采用了正则化手段,ridge和lasso相对于linear其误差要大一些。在实际测试过程中,将迭代次数变成25时,有如下输出:
可以看到此时linear还没有收敛到最终结果,而ridge却过拟合十分严重,此时lasso已经收敛等于最终结果。至于为什么产生这样的现象,我也不清楚,原理性的东西希望以后能有机会在写一篇文章。