使用PySpark搭建机器学习模型

使用PySpark搭建机器学习模型

文章目录

  • 使用PySpark搭建机器学习模型
    • 前言
    • 搭建回归模型
      • 1.加载数据集
      • 2.拆分数据集
      • 3.创建模型
      • 4&5 模型训练与预测
      • 6.模型评估
    • 绘制折线图
    • 参考文章

前言

因为现阶段的实验需要用到 PySpark ,所以安装了 PySpark 来搭建机器学习模型来进行训练。

还没有配置好 PySpark 环境的,请参考这篇博客进行配置 Windows下搭建PySpark环境

实验环境:

  • PyCharm 2019
  • Python 3.6
  • Spark 2.3.4

这是我用的是阿里天池的工业蒸汽量数据集,做的是一个回归预测,数据集和最终的代码我都放在了链接里。

链接:https://pan.baidu.com/s/1os9gK3T8wpDdF0sI_c31Kg
提取码:q73f

PySpark 的机器学习的知识这里我就不介绍了,想了解的自行查看参考文章第一个。

搭建回归模型

搭建一个简单的机器学习模型一共是六个步骤:

  1. 加载数据集
  2. 拆分数据集
  3. 创建模型
  4. 训练模型
  5. 模型预测
  6. 模型评估

我们按照这六个步骤一步一步搭建起机器学习模型

1.加载数据集

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,请记得转换路径。

2.拆分数据集

蒸汽数据集一共有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是随机种子。

3.创建模型

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”。

这里我没有进行参数设置,都是采用的默认参数。

4&5 模型训练与预测

# 训练
rf_model = rf.fit(train_df)
# 预测
rf_prediction = rf_model.transform(test_df)

fit方法用来训练和拟合数据,transform方法是转换为 spark的 dataframe,这里是进行模型预测。

6.模型评估

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与机器学习

你可能感兴趣的:(#,机器学习实验)