在机器学习领域,树算法是处理分类和回归问题的有效手段之一。存在多种方法可供选择,例如决策树、随机森林和梯度提升树。本文将使用Spark提供的官方数据集,这些数据集已经过完美清洗,可以直接使用,因此将更多地关注模型开发和评估过程,而不是数据预处理。
在开始使用PySpark的方法、库和工具之前,需要先安装PySpark,这是一个非常简单的步骤,只需使用一个简单的命令即可。
pip install pyspark
注意:在Jupyter Notebook中使用时,命令前需要加上“!”符号,如果在命令行中使用,则不需要。
!pip install pyspark
首先,根据初始需求导入库,随着功能的增加,可能会导入更多的库。现在让从第一轮模块开始。
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
主要导入了三个库:Pipeline、RandomForestClassifier和MulticlassClassificationEvaluator。下面简要介绍这三个库。
RandomForestClassifier:正如其名,这是用于分类问题的随机森林算法。
Pipeline:该模块帮助维护机器学习过程的正确工作流程,并为每个步骤设置阶段,以便于无麻烦的负载均衡。
MulticlassClassificationEvaluator:这是模型评估指标,更具体地说,是用于多类分类的。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('random_forest_intro').getOrCreate()
导入了SparkSession模块,并创建了Spark对象,这是访问和利用所有PySpark方法、库和模块的“必须做”的步骤。
data_tree = spark.read.format("libsvm").load("sample_libsvm_data.txt")
data_tree.show()
现在从Spark的GitHub仓库中加载官方数据集。需要注意的是,这个数据集不是传统的CSV格式,而是lib-SVM格式,因此将以这种方式加载它。
通过查看数据集的预览,可以了解到将要应用树算法的数据集已经过预处理和清洗,完全符合PySpark的要求,甚至不需要使用VectorAssembler对象,因为这项任务也已经完成了。
data_tree.printSchema()
data_tree.head(5)
讨论过,由于数据已经过预处理,因此有一个特征列(向量类型)和一个标签列(目标列)。
head()方法不仅会返回列的名称和类型,还会返回每列的值。
(trainingSet, testSet) = data_tree.randomSplit([0.7, 0.3])
机器学习周期的这个阶段也被称为数据集分割阶段,将数据集分解为训练集和测试集,以便在训练集上训练模型,并在测试集上测试模型。
RandomSplit()方法是负责将数据集分割为训练集和测试集的,从参数值可以看出,有70%的训练数据和30%的测试数据。
random_forest = RandomForestClassifier(labelCol="label", featuresCol="features", numTrees=20)
model_rf = random_forest.fit(trainingSet)
在创建随机森林分类器时,传递了标签列(目标)和特征列(所有特征),并且由于它是一个随机森林分类器,所以需要指定总共的树的数量为20。
现在,为了训练模型,使用fit()方法,将训练数据集作为参数传递给该函数,并不要忘记使用随机森林对象来调用它。
predictions = model_rf.transform(testSet)
predictions.printSchema()
predictions.select("prediction", "label", "features").show(5)
在这个阶段,将使用MLIB库的评估方法进行预测,并确保在测试数据上评估模型,只有这样使用它的目的才能实现。
让看看预测DataFrame包含什么。从上面的输出中,可以看到有5列:标签(目标列)、特征(所有特征/依赖列以向量形式)、rawPrediction(这个列在GBT分类器的情况下非常有用)、概率(它包含预测正确的可能性)和预测(模型在评估期间预测的值)。
evaluator = MulticlassClassificationEvaluator(labelCol="label", predictionCol="prediction", metricName="accuracy")
accuracy = evaluator.evaluate(predictions)
print("Test Error = %g" % (1.0 - accuracy))
在这里,处于模型评估阶段,为此使用多类分类评估器。二元和多类评估器之间有一个关键区别,二元评估器只能返回AUC曲线,而多类评估器可以返回准确度、精确度和召回率指标。
梯度提升树(GBTs)是另一种可以用于分类和回归问题的树方法。GBTs基于使用多个决策树的集成方法构建。尽管不必担心这个算法背后的数学原理,因为Spark处理得更好。
from pyspark.ml.classification import GBTClassifier
data_gbt = spark.read.format("libsvm").load("sample_libsvm_data.txt")
(trainingSet, testSet) = data_gbt.randomSplit([0.7, 0.3])
gbt_mdl = GBTClassifier(labelCol="label", featuresCol="features", maxIter=10)
model = gbt_mdl.fit(trainingSet)
predictions = model.transform(testSet)
predictions.select("prediction", "label", "features").show(5)
这是只是为了演示,否则如果已经学会了随机森林部分,那么在GBT的实现方面将会很容易理解。首先导入GBT模型,以相同的方式读取数据集。使用随机分割方法将数据集分割为训练集和测试集。使用对象创建和fit方法训练GBT模型。使用transform方法在测试数据上进行预测。