分类和回归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) #查看第一行
*从源数据中提取特征指标数据,这是一个比较典型且通用的步骤,因为我们的原始数据集里,经常会包含一些非指标数据,如 ID,Description 等。为方便后续模型进行特征输入,需要部分列的数据转换为特征向量,并统一命名,VectorAssembler类完成这一任务。VectorAssembler是一个transformer,将多列数据转化为单列的向量列。
vectorAssembler = VectorAssembler(inputCols=["sepal_length", "sepal_width", "petal_length", "petal_width"], outputCol="features")
viris_df = vectorAssembler.transform(iris_df)
viris_df.take(1)
indexer = StringIndexer(inputCol="class", outputCol="label")
iviris_df = indexer.fit(viris_df).transform(viris_df)
iviris_df.show(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)
#创建贝叶斯
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
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
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
数据集信息:
该数据集包含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
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)
lr=LinearRegression(featuresCol="features", labelCol="PE")
lr_model = lr.fit(vpp_df)
lr_model.coefficients
lr_model.intercept
lr_model.summary.rootMeanSquaredError
误差还可以,不是很大,大约1%
lr_model.save("lr_model") #保存模型
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)
#分割训练集和测试集
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 总数
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
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