前言
随机森林是决策树的集成算法。随机森林包含多个决策树来降低过拟合的风险。随机森林同样具有易解释性、可处理类别特征、易扩展到多分类问题、不需特征缩放等性质。同单一的决策树分类不同的是,随机森林通过多个决策树投票结果进行分类,算法不容易出现过度拟合问题。
随机森林分别训练一系列的决策树,所以训练过程是并行的。因算法中加入随机过程,所以每个决策树又有少量区别。通过合并每个树的预测结果来减少预测的方差,提高在测试集上的性能表现。
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)算法原理及实例
来源:CSDN
作者:Yolkwwww
链接:https://blog.csdn.net/sinat_36226553/article/details/104011632