PySpark MLIB库中的树方法介绍

机器学习领域,树算法是处理分类和回归问题的有效手段之一。存在多种方法可供选择,例如决策树、随机森林和梯度提升树。本文将使用Spark提供的官方数据集,这些数据集已经过完美清洗,可以直接使用,因此将更多地关注模型开发和评估过程,而不是数据预处理。

安装PySpark

在开始使用PySpark的方法、库和工具之前,需要先安装PySpark,这是一个非常简单的步骤,只需使用一个简单的命令即可。

pip install pyspark

注意:在Jupyter Notebook中使用时,命令前需要加上“!”符号,如果在命令行中使用,则不需要。

!pip install pyspark

导入所需的PySpark

首先,根据初始需求导入库,随着功能的增加,可能会导入更多的库。现在让从第一轮模块开始。

from pyspark.ml import Pipeline from pyspark.ml.classification import RandomForestClassifier from pyspark.ml.evaluation import MulticlassClassificationEvaluator

主要导入了三个库:Pipeline、RandomForestClassifier和MulticlassClassificationEvaluator。下面简要介绍这三个库。

RandomForestClassifier:正如其名,这是用于分类问题的随机森林算法。

Pipeline:该模块帮助维护机器学习过程的正确工作流程,并为每个步骤设置阶段,以便于无麻烦的负载均衡。

MulticlassClassificationEvaluator:这是模型评估指标,更具体地说,是用于多类分类的。

创建SparkSession对象

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方法在测试数据上进行预测。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485