线性回归原理与spark/sklearn实现

版权声明:本文为博主原创文章,转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/77160116

线性回归原理与spark/sklearn实现

@(SPARK)[spark, ML]

一、算法原理

1、线程回归与逻辑回归的区别

线性回归是一种很直观的数值拟合方式,它认为目标变量和属性值之间存在线性的关系。

image
逻辑回归是一种分类的方法,它给出一个拟合函数,将属性输入这个函数,大于某个值的属于一类,小于这个值的属于另一类。

image

二、spark实现

基于2.0.2版本

1、准备数据
0 1:0 2:0
2 1:1 2:1
4 1:2 2:2
8 1:4 2:4
16 1:8 2:8
6 1:3 2:3
10 1:5 2:5
12 1:6 2:6
14 1:7 2:7
200 1:100 2:100
400 1:200 2:200
1000 1:500 2:500
10000 1:5000 2:5000
100000 1:50000 2:50000
500 1:250 2:250
1000000 1:500000 2:500000

上面的数据期待的回归结果应该是y=x1+x2。
将上述文件put至hdfs。

2、导入数据

scala> val training = spark.read.format("libsvm").load("/tmp/ljhn1829/ml_data/linear_regression_data.txt")
training: org.apache.spark.sql.DataFrame = [label: double, features: vector]

3、设置算法参数

scala> val lr = new LinearRegression().setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
lr: org.apache.spark.ml.regression.LinearRegression = linReg_9b38a311b078

4、计算模型

scala> val lrModel = lr.fit(training)
lrModel: org.apache.spark.ml.regression.LinearRegressionModel = linReg_9b38a311b078

5、打印结果

scala> println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")
Coefficients: [0.9999988450975665,0.9999988450975665] Intercept: 0.08027813432272524

这里可以看到,回归结果是非常接近于1的2个系数,事实上,数据点越多,结果越接近于1。

6、模型评估

val trainingSummary = lrModel.summary println(s"numIterations: ${trainingSummary.totalIterations}") println(s"objectiveHistory: [${trainingSummary.objectiveHistory.mkString(",")}]") trainingSummary.residuals.show() println(s"RMSE: ${trainingSummary.rootMeanSquaredError}") println(s"r2: ${trainingSummary.r2}") 

三、python实现(scikit-learn)

(一)一元线性回归

1、准备数据

>>> from sklearn.linear_model import LinearRegression
>>> import numpy as np
>>> X = [[6], [8], [10], [14], [18]]
>>> y = [[7], [9], [13], [17.5], [18]]

2、准备算法

>>> model = LinearRegression()

3、计算模型

>>> model.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

4、使用模型进行预测

>>> print('预测一张12英寸匹萨价格:$%.2f' % model.predict(np.array([12]).reshape(-1, 1))[0])
预测一张12英寸匹萨价格:$13.68

(二)多元线性回归

>>> from sklearn.linear_model import LinearRegression
>>> X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]]
>>> y = [[7], [9], [13], [17.5], [18]]
>>> model = LinearRegression()
>>> model.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
>>> y_test = [[11], [8.5], [15], [18], [11]]
>>> predictions = model.predict(X_test)
>>> for i, prediction in enumerate(predictions):
...     print('Predicted: %s, Target: %s' % (prediction, y_test[i]))
...
【输出】
Predicted: [ 10.0625], Target: [11]
Predicted: [ 10.28125], Target: [8.5]
Predicted: [ 13.09375], Target: [15]
Predicted: [ 18.14583333], Target: [18]
Predicted: [ 13.3125], Target: [11]
>>> print('R-squared: %.2f' % model.score(X_test, y_test))
【输出】
R-squared: 0.77

猜你喜欢

转载自blog.csdn.net/jediael_lu/article/details/77160116