PySpark入门---机器学习实战:建立鸢尾属植物种的ML分类模型、建立ML回归模型并使用定义的特征预测电厂的发电量(使用ML库)

使用PySpark的机器学习

      • 1.创建特征
      • 2. 使用字符串索引
      • 3.分类算法
        • *1. 贝叶斯分类器*
        • *2. 多层感知器分类*
        • *3.决策树分类*
      • 4.回归模型
        • 1.线性模型
        • 2. 决策树回归
        • *3. 梯度增强决策树*

分类和回归ML库在Spark的帮助下,从UCI机器学习知识库开源数据集。

iris数据集(https://archive.ics.uci.edu/ml/machine-learning-databases/iris)

电厂数据(https://archive.ics.uci.edu/ml/machine-learning-databases/00294)

-A.分类:(建立了鸢尾属植物种的ML分类模型)

-贝耶斯

-多层感知器

-决策树

-B.回归:(建立ML回归模型,使用定义的特征预测电厂的发电量)

-线性回归

-决策树回归

-梯度增强树回归

#导入机器学习ML库
from pyspark.sql.functions import *
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.feature import StringIndexer

导入数据

iris_df = spark.read.csv("data/iris.csv", inferSchema=True, header=True)
iris_df.take(1) #查看第一行

image-20200527124410829
过程

*从源数据中提取特征指标数据,这是一个比较典型且通用的步骤,因为我们的原始数据集里,经常会包含一些非指标数据,如 ID,Description 等。为方便后续模型进行特征输入,需要部分列的数据转换为特征向量,并统一命名,VectorAssembler类完成这一任务。VectorAssembler是一个transformer,将多列数据转化为单列的向量列。

1.创建特征

vectorAssembler = VectorAssembler(inputCols=["sepal_length", "sepal_width", "petal_length", "petal_width"], outputCol="features")
viris_df = vectorAssembler.transform(iris_df)
viris_df.take(1)

image-20200526221925885

2. 使用字符串索引

  • 将标签名称转换为数值以进行定量分析
indexer = StringIndexer(inputCol="class", outputCol="label")
iviris_df = indexer.fit(viris_df).transform(viris_df)
iviris_df.show(1)

PySpark入门---机器学习实战:建立鸢尾属植物种的ML分类模型、建立ML回归模型并使用定义的特征预测电厂的发电量(使用ML库)_第1张图片

3.分类算法

1. 贝叶斯分类器

from pyspark.ml.classification import NaiveBayes
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

此时需要将数据框架分成训练和测试数据。分别对训练和测试数据进行6:4的分割

splits = iviris_df.randomSplit([0.6,0.4],1)
train_df = splits[0] #corresponding to the first dataframe in splits
test_df = splits[1] #corresponding to the second dataframe in splits
train_df.count() #counts the training instances (92 records)
test_df.count() #counts the test instances (58 records)
iviris_df.count() #total (150 records)

image-20200526222459861

#创建贝叶斯
nb = NaiveBayes(modelType="multinomial") #there are more than 2 different classes in our dataset
nbmodel =nb.fit(train_df) #fit the trainin data to our NB model
#确保特征使用了创建的模型(贝叶斯)
predictions_df = nbmodel.transform(test_df)
predictions_df.take(1)

实例的预测类是0,这是其中一个种类/类的索引值。接下来,模型进行更彻底的评估。

evaluator = MulticlassClassificationEvaluator(labelCol="label", predictionCol="prediction", metricName="accuracy")
nbaccuracy = evaluator.evaluate(predictions_df)
nbaccuracy

image-20200527124613887
准确率约为59%,不是很友好

2. 多层感知器分类

from pyspark.ml.classification import MultilayerPerceptronClassifier
layers = [4,5,5,3]
#第一个数字指的是输入(特征),最后一个数字指的是我们标签上的3类iris物种
mlp = MultilayerPerceptronClassifier(layers=layers,seed=1)
mlp_model = mlp.fit(train_df)
mlp_predictions = mlp_model.transform(test_df)
mlp_evaluator = MulticlassClassificationEvaluator(metricName="accuracy")
mlp_accuracy = mlp_evaluator.evaluate(mlp_predictions)
mlp_accuracy

image-20200527124651051
这个准确度比NB高的太多了!!!!!准确率约为95%。

3.决策树分类

from pyspark.ml.classification import DecisionTreeClassifier
dt = DecisionTreeClassifier(labelCol="label",featuresCol="features" )
dt_model = dt.fit(train_df)
dt_predictions = dt_model.transform(test_df)
dt_evaluator = MulticlassClassificationEvaluator(metricName="accuracy")
dt_accuracy = dt_evaluator.evaluate(dt_predictions)
dt_accuracy

image-20200527124736283
这个准确率也是相当的高!!

4.回归模型

数据集信息:

该数据集包含6年(2006-2011年)从联合循环发电厂收集的9568个数据点,当时发电厂已设置为满负荷运行。其功能包括每小时平均环境变量温度(T),环境压力(AP),相对湿度(RH)和排气真空(V),以预测工厂的每小时净电能输出(EP)。 联合循环发电厂(CCPP)由燃气轮机(GT),蒸汽轮机(ST)和热回收蒸汽发生器组成。在CCPP中,电力由燃气轮机和蒸汽轮机产生,它们在一个循环中组合在一起,并从一个涡轮机传递到另一个涡轮机。从蒸汽轮机收集真空并影响真空度的同时,其他三个环境变量也会影响GT性能。 为了与我们的基准研究具有可比性,并允许进行5x2倍的统计测试,我们将数据洗了5次。对于每一次改组,均进行2倍CV,将所得的10次测量用于统计测试。

属性信息:

功能包括每小时平均环境变量

-温度(T)在1.81°C和37.11°C之间;

-环境压力(AP)在992.89-1033.30 milibar之间;

-相对湿度(RH)在25.56%至100.16之间%

-排气真空(V)在25.36-81.56 cm Hg的范围内

-每小时净电能输出(EP)420.26-495.76 MW

这些平均值取自位于工厂周围的各种传感器,这些传感器每秒记录一次环境变量。给出的变量没有标准化。

https://archive.ics.uci.edu/ml/datasets/combined+cycle+power+plant 元数据地址

  • 用这些数据来预测一个平台可以根据定义的因素产生多少能量
from pyspark.ml.regression import LinearRegression
pp_df = spark.read.csv("data/power_plant.csv", header=True, inferSchema=True)
pp_df

image-20200526223518265

from pyspark.ml.feature import VectorAssembler
vectorAssembler = VectorAssembler(inputCols=["AT", "V", "AP", "RH"], outputCol="features")
#创建一个新的矢量化数据并将其称为vpp_df
vpp_df=vectorAssembler.transform(pp_df)
#看第一行
vpp_df.take(1)

image-20200527124821490

1.线性模型

lr=LinearRegression(featuresCol="features", labelCol="PE")
lr_model = lr.fit(vpp_df)
lr_model.coefficients

image-20200527124900572

lr_model.intercept

image-20200527124910572

lr_model.summary.rootMeanSquaredError

image-20200526223743977

误差还可以,不是很大,大约1%

lr_model.save("lr_model") #保存模型

2. 决策树回归

from pyspark.ml.regression import DecisionTreeRegressor
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.feature import VectorAssembler
pp_df = spark.read.csv("data/power_plant.csv", header=True, inferSchema=True)
vectorAssembler = VectorAssembler(inputCols=["AT", "V", "AP", "RH"], outputCol="features")
vpp_df=vectorAssembler.transform(pp_df)
vpp_df.take(1)

image-20200527125037688

#分割训练集和测试集
splits = vpp_df.randomSplit([0.75,0.25])
train_df = splits[0]
test_df = splits[1]
train_df.count() #7249 实际值
test_df.count() #2367 实际值
vpp_df.count() #9568 总数

image-20200526224011351
创建决策树

dt = DecisionTreeRegressor(featuresCol="features", labelCol="PE")
dt_model = dt.fit(train_df)
dt_predictions = dt_model.transform(test_df)
dt_evaluator = RegressionEvaluator(labelCol="PE", predictionCol="prediction", metricName="rmse")
rmse = dt_evaluator.evaluate(dt_predictions)
rmse

image-20200527125121134
误差还是比较小的大约1%,也算比较准确吧

3. 梯度增强决策树

from pyspark.ml.regression import GBTRegressor
gbt = GBTRegressor(featuresCol="features", labelCol="PE")
gbt_model = gbt.fit(train_df)
gbt_predictions = gbt_model.transform(test_df)
gbt_evaluator = RegressionEvaluator(labelCol="PE", predictionCol="prediction", metricName="rmse")
rmse = gbt_evaluator.evaluate(gbt_predictions)
rmse

image-20200526224159619
这个模型比其他模型好一些

你可能感兴趣的:(spark,决策树,机器学习,spark,ml,朴素贝叶斯算法)