参考:
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环境配置
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()