本文紧接上文的决策树分类器模型,实践的同样是分类算法模型,随机森林模型可以简单理解为集成的决策树模型,实质上随机森林模型的设计思想也的确如此,它采用了一种投票的思想来完成了模型最终的决策,将多个弱分类器模型进行集成,来达到提升基分类器模型性能的效果。
同样,下面贴一下自己学习pyspark以来的记录笔记,具体如下:
pyspark顾名思义就是由python和spark组合使用的。Spark提供了一个Python_Shell,即pyspark,从而可以以交互的方式使用Python编写Spark程序。有关Spark的基本架构以及pyspark环境配置相关的内容本篇博客就不再多加阐述了,网络上也有很多不错的讲解。
pyspark里最核心的模块是SparkContext(简称sc),最重要的数据载体是RDD。RDD就像一个NumPy array或者一个Pandas Series,可以视作一个有序的item集合。只不过这些item并不存在driver端的内存里,而是被分割成很多个partitions,每个partition的数据存在集群的executor的内存中。parkSession是Spark 2.0引入的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。 在spark的早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的context。例如,对于Streming,我们需要使用StreamingContext;对于sql,使用sqlContext;对于hive,使用hiveContext。但是随着DataSet和DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。所以在spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点。SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的。
任何Spark应用程序都会分离主节点上的单个驱动进程(包含若干个作业 ),然后将执行进程(包含若干个任务)分配给多个工作节点。驱动进程会确定任务进程的数量和组成,然后任务进程根据DAG(有向无环图)调度器的依赖关系将任务分配给执行节点。RDD(弹性分布式数据集,Resilient Distributed Datasets)是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,其本质是不可变Java虚拟机(JVM)对象的分布式集合。在PySpark中,Python数据就是存储在这些JVM对象中的。
接下来回归正题,基于pyspark的随机森林分类器模型实现如下:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能: pyspark 机器学习实践之【随机森林分类器模型】
'''
import findspark
findspark.init()
import pyspark
from pyspark import SparkConf
from pyspark.ml import Pipeline
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml.feature import StringIndexer, VectorIndexer,IndexToString
conf=SparkConf().setAppName('MLDemo')
sc = SparkContext('local')
spark = SparkSession(sc)
def randomForestClassifier(data="mllib/sample_libsvm_data.txt"):
'''
随机森林分类器
'''
#加载LIBSVM格式的数据集
data = spark.read.format("libsvm").load(data)
labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(data)
#自动识别类别特征并构建索引,指定maxCategories,因此具有> 4个不同值的特征被视为连续的
featureIndexer=VectorIndexer(inputCol="features", outputCol="indexedFeatures", maxCategories=4).fit(data)
#训练集、测试集划分
(trainingData, testData) = data.randomSplit([0.7, 0.3])
rf = RandomForestClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", numTrees=10)
#将标签索引转换为原始的标签
labelConverter = IndexToString(inputCol="prediction", outputCol="predictedLabel",
labels=labelIndexer.labels)
pipeline = Pipeline(stages=[labelIndexer, featureIndexer, rf, labelConverter])
model = pipeline.fit(trainingData)
predictions = model.transform(testData)
#展示前5行数据
predictions.select("predictedLabel", "label", "features").show(5)
#展示预测标签与真实标签,计算测试误差
evaluator = MulticlassClassificationEvaluator(
labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy")
accuracy = evaluator.evaluate(predictions)
print("Test Error = %g" % (1.0 - accuracy))
rfModel = model.stages[2]
print('rfModelSummary: ',rfModel) #模型摘要
if __name__=='__main__':
randomForestClassifier(data="mllib/sample_libsvm_data.txt")
结果输出如下:
从测试结果错误率来看效果是非常好的了,上述的代码使用的是pyspark自带的数据集,感兴趣的可以替换成自己的数据集来评估实验。