因为现阶段的实验需要用到 PySpark ,所以安装了 PySpark 来搭建机器学习模型来进行训练。
还没有配置好 PySpark 环境的,请参考这篇博客进行配置 Windows下搭建PySpark环境
实验环境:
这是我用的是阿里天池的工业蒸汽量数据集,做的是一个回归预测,数据集和最终的代码我都放在了链接里。
链接:https://pan.baidu.com/s/1os9gK3T8wpDdF0sI_c31Kg
提取码:q73f
PySpark 的机器学习的知识这里我就不介绍了,想了解的自行查看参考文章第一个。
搭建一个简单的机器学习模型一共是六个步骤:
我们按照这六个步骤一步一步搭建起机器学习模型
Apache Spark 2.x 引入了 SparkSession,其为用户提供了一个统一的切入点来使用 Spark 的各项功能,并且允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写 Spark 程序。
from pyspark.sql import SparkSession
# 创建 Spark 实例
spark = SparkSession.builder.appName('RandomForestRegressor').master('local').getOrCreate()
# 1. 数据导入
data = spark.read.csv('zhengqi_train.csv', header=True, inferSchema=True, encoding='utf-8')
因为我搭建的是单机版的Spark,所以 master 随便指定就行,appName一般写的是模型的名字。
zhengqi_train.csv 放在代码的同级目录下,通过相对路径直接可以读取。如果你使用其他的 IDE,请记得转换路径。
蒸汽数据集一共有38个特征属性,分别是 V0—V37,分别对应各个训练属性,有一个 target 目标属性,是预测值。
拆分数据集之前,我们将所有的训练属性合并为一个向量,然后再进行划分,这样会比较方便。
from pyspark.ml.feature import VectorAssembler
# 特征处理
df_assember = VectorAssembler(inputCols=data.columns[:-1], outputCol='features')
df = df_assember.transform(data)
# 划分数据集
model_df = df.select(['features', 'target'])
train_df, test_df = model_df.randomSplit([0.75, 0.25], seed=10)
这里我们将 V0—V37合并为一个 features 向量。通过特征向量和目标属性进行数据集的划分,seed是随机种子。
pyspark.ml.regression.RandomForestRegressor(featuresCol=‘features’, labelCol=‘label’, predictionCol=‘prediction’, maxDepth=5, maxBins=32, minInstancesPerNode=1, minInfoGain=0.0, maxMemoryInMB=256, cacheNodeIds=False, checkpointInterval=10, impurity=‘variance’, subsamplingRate=1.0, seed=None, numTrees=20, featureSubsetStrategy=‘auto’)
from pyspark.ml.regression import RandomForestRegressor
# 构建模型
rf = RandomForestRegressor(featuresCol='features', labelCol='target')
featuresCol指定的是训练属性,我们刚才把它合并成向量的优势这里就体现出来了。labelCol指定的是目标属性。predictionCol指定的是预测属性,在之后的模型评估中我们会用到,如果不指定 predictionCol,之后就使用默认值“prediction”。
这里我没有进行参数设置,都是采用的默认参数。
# 训练
rf_model = rf.fit(train_df)
# 预测
rf_prediction = rf_model.transform(test_df)
fit方法用来训练和拟合数据,transform方法是转换为 spark的 dataframe,这里是进行模型预测。
from pyspark.ml.evaluation import
RegressionEvaluator
# 创建评估器
evaluator = RegressionEvaluator(labelCol='target', predictionCol='prediction')
# 用 MSE 和 R2 进行评估
mse = evaluator.evaluate(rf_prediction, {evaluator.metricName: 'mse'})
r2 = evaluator.evaluate(rf_prediction, {evaluator.metricName: 'r2'})
print("MSE为:", mse)
print("R2得分:", r2)
评估器的 predictionCol 要和 模型的 predictionCol 保持一致。
这样六个步骤下来,一个简单的机器学习回归模型就构建好了。
模型搭建好之后,我们可以绘制一个预测值与真实值之间的折线图来进行展示。
import matplotlib.pyplot as plt
import numpy as np
# 转换数据类型并排序
true_test = sorted(test_df.select('target').collect())
perdiction_test = sorted(rf_prediction.select('target').collect())
# 使用plt绘图
plt.figure()
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['savefig.dpi'] = 1080
plt.rcParams['figure.dpi'] = 1080
plt.title('RandomForestRegressor')
x_label = np.linspace(1, 2*len(true_test), len(true_test))
plt.plot(x_label, true_test)
plt.plot(x_label, perdiction_test, linestyle='--')
plt.legend(['真实值', '预测值'])
# 保存图片
plt.savefig('RandomForestRegressor.png')
plt.show()
在 spark 中处理的数据都是 sql.dataframe 类型的,无法直接使用 plt 进行绘图,我们需要使用 collect 方法进行类型转换。
pySpark 机器学习库ml入门
使用pyspark.ml.regression模块预测波士顿房价
pyspark与机器学习