• ,用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数,若是非线性的则无法用线性回归来得出高质量的结果。
  • 构造一个Loss函数(损失函数),该函数表示预测的输出(h)与训练数据标签之间的偏差,可以是二者之间的差(h-y)或者是其他的形式(如平方差开方)。综合考虑所有训练数据的“损失”,将Loss求和或者求平均,记为 J(θ)
  • 函数,表示所有训练数据预测值与实际类别的偏差。
  • 显然, J(θ)
  • 函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到 J(θ)
    1. 函数的最小值。找函数的最小值有不同的方法,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已经收敛等于最终结果。至于为什么产生这样的现象,我也不清楚,原理性的东西希望以后能有机会在写一篇文章。

    参考文献