【发布时间】:2016-09-16 13:27:04
【问题描述】:
在运行 Spark 的 RandomForest 算法时,即使使用相同的种子,我似乎也会在不同的运行中得到不同的树分裂。如果我做错了什么(可能),或者实现是错误的(我认为这不太可能),有人可以解释一下吗?这是我的跑步计划:
//read data into rdd
//convert string rdd to LabeledPoint rdd
// train_LP_RDD is RDD of LabeledPoint
// call random forest
val seed = 123417
val numTrees = 10
val numClasses = 2
val categoricalFeaturesInfo: Map[Int, Int] = Map()
val featureSubsetStrategy = "auto"
val impurity = "gini"
val maxDepth = 8
val maxBins = 10
val rfmodel = RandomForest.trainClassifier(train_LP_RDD, numClasses, categoricalFeaturesInfo,
numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins,seed)
println(rfmodel.toDebugString)
在两次不同的运行中,这个 sn-p 的输出是不同的。例如,两个结果的差异显示如下:
sdiff -bBWs run1.debug run2.debug
If (feature 2 <= 15.96) | If (feature 2 <= 16.0)
Else (feature 2 > 15.96) | Else (feature 2 > 16.0)
If (feature 2 <= 15.96) | If (feature 2 <= 16.0)
Else (feature 2 > 15.96) | Else (feature 2 > 16.0)
If (feature 2 <= 33.68) | If (feature 2 <= 34.66)
Else (feature 2 > 33.68) | Else (feature 2 > 34.66)
If (feature 1 <= 17.0) | If (feature 1 <= 16.0)
Else (feature 1 > 17.0) | Else (feature 1 > 16.0)
【问题讨论】:
-
你想明白了吗?如果是这样,如何?否则,您是否有一些示例数据可以共享以完成一个可重复性最低的示例?
-
我尝试在最新版本的 Spark 3.0 中复制它。无法复制。可能这是一个旧版本问题
-
这可能是由于使用 featureSubsetStrategy 作为“自动”引起的。这将导致对用于模型生成的特征数量进行一些概率估计。您能否尝试使用数值或“全部”。在这里找到一篇关于 Randomforest featureSubsetStrategy 的好文章 - dzone.com/articles/…。这可能会有所帮助。
-
这也可能是相关的:stats.stackexchange.com/questions/402391/…。输入数据的顺序。
-
我看了下特征选择的源码,RandomForest.selectNodesToSplit负责。它使用具有种子的随机生成器,您可以查看here。这至少从 2.0 版开始。所以特征选择似乎不是问题@AbdulRahman
标签: scala apache-spark machine-learning random-forest