Spark MLlib 源码学习---线性回归模型(LinearRegression)
Posted wangongxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark MLlib 源码学习---线性回归模型(LinearRegression)相关的知识,希望对你有一定的参考价值。
线性回归是机器学习中最常见的一种回归模型,也是入门机器学习的一种经典模型。线性回归假设因变量与自变量之间呈线性关系,当只有单一自变量的时候,称之为一元线性回归。当有多个自变量的时候,则为多元线性回归。线性回归模型的训练过程是通过训练数据集来确定每个自变量/特征的系数的过程。常用的训练算法有最小二乘法(Least Squares)以及基于最优化理论的梯度下降法(Gradient Descent)、牛顿法(Newton’s method)、拟牛顿法(Quasi-Newton Methods)等。这里我们主要分析的梯度下降以及拟牛顿法中的L-BFGS算法。如果在线性回归的损失函数中添加L1或L2正则化,则可以得到Lasso回归和Ridge回归。当然也可以同时考虑L1和L2正则化,也就是ElasticNet回归。Spark ML/MLlib中均实现了线性回归与添加了正则化项的各种变体。下面来具体看下Spark中线性回归的实现。
0. 线性回归基本原理
模型:
y
=
w
T
x
+
b
y=w^Tx+b
y=wTx+b
其中,
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
)
,
x
∈
R
n
x=(x_{1},x_{2},x_{3},...,x_{n}), x \\in R^{n}
x=(x1,x2,x3,...,xn),x∈Rn表示
n
n
n维特征向量。
w
=
(
w
1
,
w
2
,
w
3
,
.
.
.
,
w
n
)
,
w
∈
R
n
w=(w_{1},w_{2},w_{3},...,w_{n}),w \\in R^{n}
w=(w1,w2,w3,...,wn),w∈Rn对应上面每一个特征的权重,也称回归系数。
b
∈
R
b \\in R
b∈R表示偏置项。可以很清晰得看出,线性回归模型的预测结果是通过特征与其对应权重的内积再加上偏置项得到的,也就是特征之间的线性组合的结果。特征权重可以表征每一个特征的重要性,具有较好的解释性,因此很多回归的工程问题都可以用线性回归模型做为baseline。
损失函数:
L
o
s
s
(
w
,
b
)
=
1
2
N
∑
i
=
1
N
(
y
i
−
y
^
i
)
2
=
1
2
N
∑
i
=
1
N
(
y
i
−
∑
j
=
1
M
w
j
x
j
−
b
)
2
Loss(w,b)=\\frac{1}{2N}\\sum_{i=1}^N(y_{i}-\\hat y_{i})^2 =\\frac{1}{2N}\\sum_{i=1}^N(y_{i}-\\sum_{j=1}^Mw_{j}x_{j}-b)^2
Loss(w,b)=2N1∑i=1N(yi−y^i)2=2N1∑i=1N(yi−∑j=1Mwjxj−b)2
对于线性回归模型,常用上面的均方误差(Square Error)作为模型的损失函数,训练模型就是确定
w
w
w和
b
b
b这两个超参数,一旦确定了这两个超参,那么模型就被确定下来,可以用于实际的预测工作。想要确定超参,首先我们需要定义损失函数,比较直观的,可以用均方误差作为线性回归的损失函数,这也非常符合常识,即预测结果越接近真实值,那么函数拟合得越好,使用中预测得也就越准确。从上述解析式中可以看到,
L
o
s
s
Loss
Loss的物理含义是所有训练数据的预测值与真实值的误差的平方和的均值(严格来说去掉常数1/2,为了方便后续计算保留)。我们的目标其实是最小化该误差,即求取
min
L
o
s
s
(
w
,
b
)
\\min Loss(w,b)
minLoss(w,b)。
算法: 凸优化问题,使用梯度下降法或者牛顿法。以梯度下降法为例
w
n
+
1
=
w
n
−
η
∗
∂
L
o
s
s
(
w
n
,
b
)
∂
w
n
w_{n+1}=w_{n}-\\eta*\\frac{\\partial Loss(w_{n},b)}{\\partial w_{n}}
wn+1=wn−η∗∂wn∂Loss(wn,b)
=
w
n
−
η
∗
1
N
∗
∑
i
=
1
N
(
−
x
i
)
∗
(
y
l
a
b
e
l
i
−
w
n
T
x
i
−
b
)
w_{n}-\\eta*\\frac{1}{N}*\\sum_{i=1}^N(-x_{i})*(y_{label_{i}}-w_{n}^Tx_{i}-b)
wn−η∗N1∗∑i=1N(−xi)∗(ylabeli−wnTxi−b)
b
n
+
1
=
b
n
−
η
∗
∂
L
o
s
s
(
w
,
b
)
∂
b
b_{n+1}=b_{n}-\\eta*\\frac{\\partial Loss(w,b)}{\\partial b}
bn+1=bn−η∗∂b∂Loss(w,b)
=
b
n
−
η
∗
1
N
∗
(
−
1
)
∗
∑
i
=
1
N
(
y
l
a
b
e
l
i
−
w
n
T
x
i
−
b
)
b_{n}-\\eta*\\frac{1}{N}*(-1)*\\sum_{i=1}^N(y_{label_{i}}-w_{n}^Tx_{i}-b)
bn−η∗N1∗(−1)∗∑i=1N(ylabeli−wnTxi−b)
我们使用迭代的方法求解超参数
w
w
w和
b
b
b。对于梯度下降法,迭代关系为
w
k
+
1
=
w
k
−
η
∗
∂
L
∂
w
k
w_{k+1}=w_{k}-\\eta*\\frac{\\partial L}{\\partial w_{k}}
wk+1=w以上是关于Spark MLlib 源码学习---线性回归模型(LinearRegression)的主要内容,如果未能解决你的问题,请参考以下文章
Spark MLlib 源码学习---线性回归模型(LinearRegression)
Spark MLlib 源码学习---线性回归模型(LinearRegression)
spark.mllib源码阅读-回归算法1-LinearRegression