基于Ubuntu16.04+Spark+Python的线性回归(linear regression)算法

参考:

spark+python+ubuntu环境配置:

https://blog.csdn.net/konglingshneg/article/details/82491157

Building A Linear Regression with PySpark and MLlib:

https://towardsdatascience.com/building-a-linear-regression-with-pyspark-and-mllib-d065c3ba246a

目录

1.Ubuntu16.04+Spark+Python环境配置

安装JDK1.8:

安装spark :

2.利用Linear Regression预测Boston房价


1.Ubuntu16.04+Spark+Python环境配置

Spark是一个可以应用于大规模数据处理的快速通用引擎。是当今大数据领域最热门的大数据计算平台。Spark开发应用程序时可以采用Scala、Python、Java和R语言。在虚拟机下的Ubuntu环境下安装测试Spark,即使出错也不会影响其他。

安装JDK1.8:

Spark的运行环境依赖JVM环境,

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载jdk-8u191-linux-x64.tar.gz

(1)在/usr/lib下新建一个文件夹 sudo mkdir /usr/lib/jdk

zhb@ubuntu:~$ sudo mkdir /usr/lib/jdk

(2)系统默认下载到download文件夹(找到copy一下地址),cd 到下载文件文件夹

zhb@ubuntu:~$ cd /home/zhb/Downloads/
zhb@ubuntu:~/Downloads$

(3)解压缩到我们新建的文件夹 sudo tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/lib/jdk

zhb@ubuntu:~/Downloads$ sudo tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/lib/jdk

(4)配置PATH路径,让jdk命令在任何路径下都能够直接执行, gedit、vi都可以。 sudo gedit /etc/profile

zhb@ubuntu:~$ gedit /etc/proflie

在配置文件末尾追加 

# java
export JAVA_HOME=/usr/lib/jdk/jdk1.8.0_191  
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH

(5)重新载入/etc/profile配置文件 source /etc/proflie

zhb@ubuntu:~$ source /etc/profile

(6)运行java -version查看java是否安装成功,出现如下结果说明安装成功 

zhb@ubuntu:~$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
zhb@ubuntu:~$

安装spark :

(1)官网下载地址 http://spark.apache.org/downloads.html 

          Download Spark: spark-2.4.0-bin-hadoop2.7.tgz

(2)为spark新建一个文件夹sudo mkdir /usr/lib/spark

zhb@ubuntu:~$ sudo mkdir /usr/lib/spark

(3)找到下载文件目录,并cd到该目录下

zhb@ubuntu:~$ cd /home/zhb/Downloads/
zhb@ubuntu:~/Downloads$

(4)将下载文件安装到新建文件夹下sudo tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz -C /usr/lib/spark

zhb@ubuntu:~/Downloads$ sudo tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz -C /usr/lib/spark

(5)配置spark

cd /usr/lib/spark/spark-2.4.0-bin-hadoop2.7/conf/ 

sudo cp spark-env.sh.template spark-env.sh 

sudo gedit spark-env.sh

zhb@ubuntu:~$ cd /usr/lib/spark/spark-2.4.0-bin-hadoop2.7/conf/
zhb@ubuntu:/usr/lib/spark/spark-2.4.0-bin-hadoop2.7/conf$ sudo cp spark-env.sh.template spark-env.sh
zhb@ubuntu:/usr/lib/spark/spark-2.4.0-bin-hadoop2.7/conf$ sudo gedit spark-env.sh

在spark-env.sh文件末尾追加:

JAVA_HOME=/usr/lib/jdk/jdk1.8.0_191  
SPARK_WORKER_MEMORY=3g

(6)然后我们需要配置PATH路径,让jdk命令在任何路径下都能够直接执行

sudo gedit /etc/profile
zhb@ubuntu:~$ sudo gedit /etc/profile

在配置文件后加上

#spark 
export SPARK_HOME=/usr/lib/spark/spark-2.4.0-bin-hadoop2.7
export PATH=${SPARK_HOME}/bin:$PATH

(7)重新载入/etc/profile配置文件

source /etc/profile
zhb@ubuntu:~$ source /etc/proflie

(8)运行 pyspark 查看spark是否安装成功,出现如下结果说明安装成功

 

2.利用Linear Regression预测Boston房价

(1)在jupyter notebook使用spark时,通过findspark来调用spark。

切换到自己的python环境下,执行:

pip install findspark

 使用anaconda打开jupyter notebook,在文档开头输入下列内容即可

import findspark
findspark.init()

 (2)接下来采用Boston房价信息数据集(https://www.kaggle.com/c/boston-housing/data)利用线性回归预测Boston房价。

Boston房价信息:

crim:城镇人均犯罪率

zn:占地面积超过25,000平方英尺的住宅用地比例

indus:每个城镇非零售业务的比例

chas: Charles River虚拟变量

nox:氮氧化物浓度(每千万份)

rm:每间住宅的平均房间数

age: 1940年以前建造的自住单位比例

dis:到五个波士顿就业中心的距离的加权平均值

rad:径向高速公路的可达性指数

tax:每10,000美元的全额物业税率

ptratio:城镇的学生与教师比例

black:1000(Bk — 0.63)² 其中Bk是城镇黑人的比例

lstat:人口较低的地位(百分比)

medv:自住房屋的中位数价值1000美元,这是目标变量

(3)输入数据集包含有关各种房屋细节的数据。根据所提供的信息,目标是提出一个模型来预测该地区特定房屋的中值。

加载数据

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
sc= SparkContext()
sqlContext = SQLContext(sc)

house_df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('boston.csv')
house_df.take(1)

[Row(ID=1, crim=0.00632, zn=18.0, indus=2.31, chas=0, nox=0.538, rm=6.575, age=65.2, dis=4.09, rad=1, tax=296, ptratio=15.3, black=396.9, lstat=4.98, medv=24.0)]

(4)以树形模式打印数据

house_df.cache()
house_df.printSchema()

 

(5)执行描述性分析

house_df.describe().toPandas().transpose()

(6)散点矩阵可以粗略确定是否在多个自变量之间具有线性相关性

import pandas as pd
%matplotlib inline

numeric_features = [t[0] for t in house_df.dtypes if t[1] == 'int' or t[1] == 'double']
sampled_data = house_df.select(numeric_features).sample(False, 0.8).toPandas()
axs = pd.scatter_matrix(sampled_data, figsize=(10, 10))
n = len(sampled_data.columns)
for i in range(n):
    v = axs[i, 0]
    v.yaxis.label.set_rotation(0)
    v.yaxis.label.set_ha('right')
    v.set_yticks(())
    h = axs[n-1, i]
    h.xaxis.label.set_rotation(90)
h.set_xticks(())

(7)确定自变量和目标变量之间的相关性

import six
for i in house_df.columns:
    if not( isinstance(house_df.select(i).take(1)[0][0], six.string_types)):
        print( "Correlation to medv for ", i, house_df.stat.corr('medv',i))
 

相关系数的范围从-1到1。当它接近1时,意味着存在强正相关;例如,当房间数量增加时,中值往往会上升。当系数接近-1时,意味着存在强烈的负相关; 当人口较低地位的百分比上升时,中值往往会下降。最后,接近零的系数意味着没有线性相关。

(8)准备机器学习数据。(特征feautures和标签medv):

vhouse_df = vhouse_df.select(['features', 'medv'])
vhouse_df.show(3)

 (9)切分数据集,70%数据作为训练集,30%数据作为测试集。

splits = vhouse_df.randomSplit([0.7, 0.3])
train_df = splits[0]
test_df = splits[1]

(10)线性回归

from pyspark.ml.regression import LinearRegression

lr = LinearRegression(featuresCol = 'features', labelCol='medv', maxIter=10, regParam=0.3, elasticNetParam=0.8)
lr_model = lr.fit(train_df)
print("Coefficients: " + str(lr_model.coefficients))#
print("Intercept: " + str(lr_model.intercept))

(11)训练集上的评价指标:

trainingSummary = lr_model.summary
print("RMSE: %f" % trainingSummary.rootMeanSquaredError)
print("r2: %f" % trainingSummary.r2)

(12)RMSE通过模型和实际值测量预测值之间的差异。然而,在我们与实际的“medv”值(例如平均值,最小值和最大值)进行比较之前,仅RMSE是没有意义的。

train_df.describe().show()

(13)R平方为0.71表明在我们的模型中,使用该模型可以解释“medv”中大约71%的变异性。这与Scikit-Learn的结果一致。测试集上的表现与训练集上有一些差异。

lr_predictions = lr_model.transform(test_df)
lr_predictions.select("prediction","medv","features").show(5)

from pyspark.ml.evaluation import RegressionEvaluator
lr_evaluator = RegressionEvaluator(predictionCol="prediction", \
                 labelCol="medv",metricName="r2")
print("R Squared (R2) on test data = %g" % lr_evaluator.evaluate(lr_predictions))

test_result = lr_model.evaluate(test_df)
print("Root Mean Squared Error (RMSE) on test data = %g" % test_result.rootMeanSquaredError)
Root Mean Squared Error (RMSE) on test data = 5.42683

(15)使用线性回归模型做一些预测:

predictions = lr_model.transform(test_df)
predictions.select("prediction","medv","features").show()

猜你喜欢

转载自blog.csdn.net/u014470219/article/details/85028725