分享

Linear regression 线性回归【pyspark】

regan 发表于 2018-4-20 13:56:00 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 16519
本帖最后由 regan 于 2018-4-20 14:12 编辑

1.回归算法和分类算法的不同点是回归算法的输出值是连续的值,分类算法的输出值为离散的类别值,回归是对真实分布的逼近预测,而分类是给事物对上一个标签。下面这张图是从scikit-learn官方网站上拷贝的。
1.png
2.回归算法中最常见的就是Linear regression线性回归了。
例如在贷款额度评测中,根据工资和年龄去判断可以贷多少款。
2.png
能贷多少款是一个连续的值,可以使用工资和年龄作为作为线性方程的两个变量,通过大量的历史数据拟合出一条线性的模型,并通过这个模型在只有工资和年龄的数据计算预测能贷多少款。
那上面的线性方程使用向量的表达方式可以写成如下形式:
3.png
其中
4.png
是独立并且具有相同分布的服从均值为0,方差为西格玛平方的偏置项。
5.png
由西格玛服从标准的高斯分布的假设,因此有
6.png
也是服从标准的高斯分布的,可得到如下的等式:
7.png
8.jpg
整个训练集中,所有样本都服从正态分布。注意上面的式子不就是最大似然估计吗?最大似然估计原理是:最合理的参数估计量应该使得从模型中抽取该n组样本观测值的概率最大。我们想让这个模型在整个数据集上预测最准,因此得到下面损失函数:
9.png
上式即为假设整体偏置项服从标准正态分布的目标函数,现在需要使得这个函数的值最大,并且为了求解,在等式的两边取对数,将乘积操作转换为求和操作。这就把问题转换成了求最大对数似然了。
10.png
要使上式最大,需要使得
11.png
最小,因此最终的目标函数为J(0)求最小值:
12.png
现在对上面的目标函数用向量来表示:
13.png
怎么求最小值呢?因为上式为一个凸函数,求最小值一个很有用的方式就是导数等于0,用损失函数对西塔求偏导。
14.png
最终求得线性方程的权重参数为:
15.png
那上面的公式呢?有个什么问题呢,就是X的转置乘X再求逆,不是所有的矩阵都有逆的,需要是满秩矩阵才能求矩阵的逆,而且现实中大多数的数据的矩阵都不是满秩矩阵,因此上面推导的这种求线性方程的方法不是很常用。另外一种比较常用的方式是通过梯度下降的方式来求解。

2.梯度下降法求解线性方程系数。
     在选定线性回归模型后,只需要确参数 θ。然而 θ 需要在 J(θ)最小的情况下才能确定。因此问题归结为 求极小值问题,使用梯度下降法。  梯度下降法最大的问题是求得有可能是局部极小值,这与初始点选取关。
梯度下降法是按下面的流程进行:
1)首先对 θ 赋值,这个可以是随机的,也可以让 θ 是一个全零的向量。
2)改变 θ 的值,使得 J(θ) 按梯度下降的方向进行减少。
目标函数如下:
16.png
梯度方向由 J(θ) 对 θ 的偏导数确定 ,由于求的是极小值,因此梯度方向偏导数反。
17.png
迭代更新的方式有两种,一是批梯度下降也就对全部训练数据求得误差后再对θ 进行更新,另外一种是增量梯度下降每扫描步都要对 θ 进行更新。 前一种方法能够不断收敛,后一种方法的结果可能不断在收敛处徘徊。


接下来就来看下pyspark中线性回归的使用
加载房价数据数据,使用Price,SqFt,Bedrooms,Bathrooms,Offers这几个字段。
18.png
from pyspark.ml.regression import LinearRegression
df= spark.read.csv('/datas/house-prices.csv',header=True)
datas= df.select(df.Price.cast('double'),df.SqFt.cast('double'),df.Bedrooms.cast('double'),df.Bathrooms.cast('double'),df.Offers.cast('double'))
datas.show()
19.png
使用Sqrt房屋面积,Bedrooms卧式个数,Bathrooms浴室个数和Offers作为特征向量。
from pyspark.ml.linalg import Vectorsfrom pyspark.ml.feature import VectorAssemblers
sembler = VectorAssembler(    inputCols=["SqFt", "Bedrooms",'Bathrooms','Offers'],    outputCol="features")
output = assembler.transform(datas)
label_features = output.select("features", "Price").toDF('features','label')
label_features.show(truncate=False)
20.png
接下来使用label_features数据训练模型
lr = LinearRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
lrModel = lr.fit(label_features)
print("Coefficients: %s" % str(lrModel.coefficients))
print("Intercept: %s" % str(lrModel.intercept))
trainingSummary = lrModel.summaryprint("numIterations: %d" % trainingSummary.totalIterations)
print("objectiveHistory: %s" % str(trainingSummary.objectiveHistory))
trainingSummary.residuals.show()
print("RMSE: %f" % trainingSummary.rootMeanSquaredError)
print("r2: %f" % trainingSummary.r2)

21.png

        上面的r2是拟合优度指标,越接近于1表示拟合得越好,可以看到r2指标约为0.7,那r2指标能够达到0.6、0.7以上,就说明拟合得还算挺好的。如果要进一步增加拟合优度除了调整模型参数外,最重要的就是特征选择及特征工程了。
下面是r2指标计算的一些说明,来自百度百科!
当R2越接近1时,表示相关的方程式参考价值越高;相反,越接近0时,表示参考价值越低。
这是在一元回归分析中的情况。但从本质上说决定系数和回归系数没有关系,
就像标准差和标准误差在本质上没有关系一样。
在多元回归分析中,决定系数是通径系数的平方。
表达式:R2=SSR/SST=1-SSE/SST
其中:SST=SSR+SSE,
SST (total sum of squares)为总平方和,
SSR (regression sum of squares)为回归平方和,
SSE (error sum of squares) 为残差平方和。
注:(不同书命名不同)
回归平方和:SSR(Sum of Squares for regression) = ESS (explained sum of squares)
残差平方和:SSE(Sum of Squares for Error) = RSS (residual sum of squares)
总离差平方和:SST(Sum of Squares for total) = TSS(total sum of squares)
SSE+SSR=SST RSS+ESS=TSS
意义:拟合优度越大,自变量对因变量的解释程度越高,自变量引起的变动占总变动的百分比高。
观察点在回归直线附近越密集。






已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条