Spark.ml - -随机森林RandomForest

点点圈 提交于 2020-01-19 19:17:54

前言

       随机森林是决策树的集成算法。随机森林包含多个决策树来降低过拟合的风险。随机森林同样具有易解释性、可处理类别特征、易扩展到多分类问题、不需特征缩放等性质。同单一的决策树分类不同的是,随机森林通过多个决策树投票结果进行分类,算法不容易出现过度拟合问题。

      随机森林分别训练一系列的决策树,所以训练过程是并行的。因算法中加入随机过程,所以每个决策树又有少量区别。通过合并每个树的预测结果来减少预测的方差,提高在测试集上的性能表现。

      Spark.ml支持二分类、多分类以及回归的随机森林算法,适用于连续特征以及类别特征。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多颗树预测值的均值决定最终预测结果

 

特点

   缺点

  • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大
  • 随机森林中还有许多不好解释的地方,有点算是黑盒模型
  • 在某些噪音比较大的样本集上,RF的模型容易陷入过拟合

 

原理

      由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数据,列方向上采用无放回随机抽样得到特征子集,并据此得到其最优切分点,这便是随机森林算法的基本原理。

      其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

     推荐博主[cg896406166] 原文:用通俗易懂的方式剖析随机森林

 

pySpark API

      class pyspark.ml.classification.RandomForestClassifier(featuresCol='features', labelCol='label', predictionCol='prediction', probabilityCol='probability', rawPredictionCol='rawPrediction', maxDepth=5, maxBins=32, minInstancesPerNode=1, minInfoGain=0.0, maxMemoryInMB=256, cacheNodeIds=False, checkpointInterval=10, impurity='gini', numTrees=20, featureSubsetStrategy='auto', seed=None, subsamplingRate=1.0)

  • maxDepth:树的最大深度(>= 0)。例如,深度0表示1个叶节点;深度1表示1个内部节点 + 2个叶节点。
  • maxBins:连续特征离散化的最大箱数,必须>=2且>=任何类别特征的类别数。比如变量有100个值,分成10段去做统计
  • minInstancesPerNode:拆分后每个子节点必须具有的最小实例数。如果拆分导致左子节点或右子节点数少于minInstancesPerNode,则该拆分将作为无效丢弃。应该是>= 1。
  • minInfoGain:在树节点上考虑分裂的最小信息增益
  • maxMemoryInMB:分配给直方图聚合的最大内存。如果太小,那么每个迭代将分割一个节点,其聚合可能超过这个大小。
  • cacheNodeIds:如果为False,则算法将把树传递给执行器,以匹配具有节点的实例。如果为True,则算法将缓存每个实例的节点id。缓存可以加快更深层次树的训练。可以通过设置checkpointInterval来设置应该多久检查一次缓存,或者禁用它。
  • checkpointInterval:设置检查点间隔(>= 1)或禁用检查点(-1)。例:10意味着缓存将每10次迭代得到检查点。
  • impurity:用于信息增益计算的准则(大小写不敏感)。支持的选项 ['entropy'(熵) , 'gini'(基尼系数) ]
  • numTrees:需要训练的树的数量(>= 1)。
  • featureSubsetStrategy:可选 ['auto', 'all', 'onethird', 'sqrt', 'log2']
  • seed:随机种子
  • subsamplingRate:用于学习每个决策树的训练数据的分数,范围为(0,1]

 

案例

''' 
内容:pyspark实现随机森林
版本:spark 2.4.4
数据:垃圾邮件数据
数据源:http://archive.ics.uci.edu/ml/datasets/Spambase
'''

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql import functions
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.evaluation import BinaryClassificationEvaluator,MulticlassClassificationEvaluator
from pyspark.ml import Pipeline
from pyspark.ml.tuning import ParamGridBuilder,CrossValidator

spark = SparkSession.builder.master("local").appName("RandomForest").getOrCreate()

data = spark.read.format("csv").option("header","true").load(u"D:\Data\Spam-Dataset\spambase.csv")

for i in data.columns:
    data = data.withColumn(i,col(i).cast("Double"))
    if i == "spam":
        data = data.withColumnRenamed(i, "label") # 更改列名

trainData, testData = data.randomSplit([0.8, 0.2])

featuresArray = data.columns[:-1]

assembler = VectorAssembler().setInputCols(featuresArray).setOutputCol("features")

# 创建随机森林
RF = RandomForestClassifier().setLabelCol("label").setFeaturesCol("features")

# 流水线
Pipeline = Pipeline().setStages([assembler,RF])

# 训练逻辑回归模型
model = Pipeline.fit(trainData)

# 预测逻辑回归的值
prediction = model.transform(testData)

# 模型评估--准确率 
evaluator1 = MulticlassClassificationEvaluator().setMetricName("accuracy")
ACC = evaluator1.evaluate(prediction)
print("Accuracy:",ACC)

# 模型评估--AUC
evaluator2 = BinaryClassificationEvaluator().setMetricName("areaUnderROC").setRawPredictionCol("rawPrediction").setLabelCol("label")
AUC = evaluator2.evaluate(prediction)
print("Area Under ROC:",AUC)

 

参考

  vatermutter 原文:Spark.ml 随机森林分类参数解释

  看穿数据之美 原文:Spark MLlib中的随机森林(Random Forest)算法原理及实例

  Poll 原文:[Machine Learning & Algorithm] 随机森林(Random Forest)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!