使用PySpark搭建机器学习模型
使用PySpark搭建機器學(xué)習(xí)模型
文章目錄
- 使用PySpark搭建機器學(xué)習(xí)模型
- 前言
- 搭建回歸模型
- 1.加載數(shù)據(jù)集
- 2.拆分數(shù)據(jù)集
- 3.創(chuàng)建模型
- 4&5 模型訓(xùn)練與預(yù)測
- 6.模型評估
- 繪制折線圖
- 參考文章
前言
因為現(xiàn)階段的實驗需要用到 PySpark ,所以安裝了 PySpark 來搭建機器學(xué)習(xí)模型來進行訓(xùn)練。
還沒有配置好 PySpark 環(huán)境的,請參考這篇博客進行配置 Windows下搭建PySpark環(huán)境
實驗環(huán)境:
- PyCharm 2019
- Python 3.6
- Spark 2.3.4
這是我用的是阿里天池的工業(yè)蒸汽量數(shù)據(jù)集,做的是一個回歸預(yù)測,數(shù)據(jù)集和最終的代碼我都放在了鏈接里。
鏈接:https://pan.baidu.com/s/1os9gK3T8wpDdF0sI_c31Kg
提取碼:q73f
PySpark 的機器學(xué)習(xí)的知識這里我就不介紹了,想了解的自行查看參考文章第一個。
搭建回歸模型
搭建一個簡單的機器學(xué)習(xí)模型一共是六個步驟:
我們按照這六個步驟一步一步搭建起機器學(xué)習(xí)模型
1.加載數(shù)據(jù)集
Apache Spark 2.x 引入了 SparkSession,其為用戶提供了一個統(tǒng)一的切入點來使用 Spark 的各項功能,并且允許用戶通過它調(diào)用 DataFrame 和 Dataset 相關(guān) API 來編寫 Spark 程序。
from pyspark.sql import SparkSession # 創(chuàng)建 Spark 實例 spark = SparkSession.builder.appName('RandomForestRegressor').master('local').getOrCreate()# 1. 數(shù)據(jù)導(dǎo)入 data = spark.read.csv('zhengqi_train.csv', header=True, inferSchema=True, encoding='utf-8')因為我搭建的是單機版的Spark,所以 master 隨便指定就行,appName一般寫的是模型的名字。
zhengqi_train.csv 放在代碼的同級目錄下,通過相對路徑直接可以讀取。如果你使用其他的 IDE,請記得轉(zhuǎn)換路徑。
2.拆分數(shù)據(jù)集
蒸汽數(shù)據(jù)集一共有38個特征屬性,分別是 V0—V37,分別對應(yīng)各個訓(xùn)練屬性,有一個 target 目標屬性,是預(yù)測值。
拆分數(shù)據(jù)集之前,我們將所有的訓(xùn)練屬性合并為一個向量,然后再進行劃分,這樣會比較方便。
from pyspark.ml.feature import VectorAssembler# 特征處理 df_assember = VectorAssembler(inputCols=data.columns[:-1], outputCol='features') df = df_assember.transform(data)# 劃分數(shù)據(jù)集 model_df = df.select(['features', 'target']) train_df, test_df = model_df.randomSplit([0.75, 0.25], seed=10)這里我們將 V0—V37合并為一個 features 向量。通過特征向量和目標屬性進行數(shù)據(jù)集的劃分,seed是隨機種子。
3.創(chuàng)建模型
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=‘a(chǎn)uto’)
from pyspark.ml.regression import RandomForestRegressor# 構(gòu)建模型 rf = RandomForestRegressor(featuresCol='features', labelCol='target')featuresCol指定的是訓(xùn)練屬性,我們剛才把它合并成向量的優(yōu)勢這里就體現(xiàn)出來了。labelCol指定的是目標屬性。predictionCol指定的是預(yù)測屬性,在之后的模型評估中我們會用到,如果不指定 predictionCol,之后就使用默認值“prediction”。
這里我沒有進行參數(shù)設(shè)置,都是采用的默認參數(shù)。
4&5 模型訓(xùn)練與預(yù)測
# 訓(xùn)練 rf_model = rf.fit(train_df) # 預(yù)測 rf_prediction = rf_model.transform(test_df)fit方法用來訓(xùn)練和擬合數(shù)據(jù),transform方法是轉(zhuǎn)換為 spark的 dataframe,這里是進行模型預(yù)測。
6.模型評估
from pyspark.ml.evaluation import RegressionEvaluator# 創(chuàng)建評估器 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 保持一致。
這樣六個步驟下來,一個簡單的機器學(xué)習(xí)回歸模型就構(gòu)建好了。
繪制折線圖
模型搭建好之后,我們可以繪制一個預(yù)測值與真實值之間的折線圖來進行展示。
import matplotlib.pyplot as plt import numpy as np# 轉(zhuǎn)換數(shù)據(jù)類型并排序 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(['真實值', '預(yù)測值']) # 保存圖片 plt.savefig('RandomForestRegressor.png') plt.show()在 spark 中處理的數(shù)據(jù)都是 sql.dataframe 類型的,無法直接使用 plt 進行繪圖,我們需要使用 collect 方法進行類型轉(zhuǎn)換。
參考文章
pySpark 機器學(xué)習(xí)庫ml入門
使用pyspark.ml.regression模塊預(yù)測波士頓房價
pyspark與機器學(xué)習(xí)
總結(jié)
以上是生活随笔為你收集整理的使用PySpark搭建机器学习模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下搭建PySpark环境
- 下一篇: 数据结构综述