如何从 Spark RandomForestRegressionModel 获取 maxDepth
How to get the maxDepth from a Spark RandomForestRegressionModel
在 Spark (2.1.0) 中,我使用 CrossValidator
来训练 RandomForestRegressor
,对 maxDepth
和 numTrees
使用 ParamGridBuilder
:
paramGrid = ParamGridBuilder() \
.addGrid(rf.maxDepth, [2, 4, 6, 8, 10]) \
.addGrid(rf.numTrees, [10, 20, 40, 50]) \
.build()
经过训练,我可以得到最好的树数:
regressor = cvModel.bestModel.stages[len(cvModel.bestModel.stages) - 1]
print(regressor.getNumTrees)
但我不知道如何获得最佳的最大深度。我已经阅读了 documentation,但我没有看到我遗漏了什么。
我会注意到我可以遍历所有树并找到每棵树的深度,例如
regressor.trees[0].depth
不过我好像漏掉了什么。
不幸的是,PySpark RandomForestRegressionModel
在 Spark 2.3 之前,不像它的 Scala 对应物,不存储上游 Estimator
Params
,但你应该能够直接从 JVM 对象中检索它.使用简单的猴子补丁:
from pyspark.ml.regression import RandomForestRegressionModel
RandomForestRegressionModel.getMaxDepth = (
lambda self: self._java_obj.getMaxDepth()
)
您可以:
cvModel.bestModel.stages[-1].getMaxDepth()
更简单,直接调用
cvModel.bestModel.stages[-1]._java_obj.getMaxDepth()
正如@user6910411 所解释的那样,您获得了 bestModel,调用该模型的 JVM 对象并使用 getMaxDepth() 从 JVM 对象中提取您的参数。
其他参数的类似工作。
在 Spark (2.1.0) 中,我使用 CrossValidator
来训练 RandomForestRegressor
,对 maxDepth
和 numTrees
使用 ParamGridBuilder
:
paramGrid = ParamGridBuilder() \
.addGrid(rf.maxDepth, [2, 4, 6, 8, 10]) \
.addGrid(rf.numTrees, [10, 20, 40, 50]) \
.build()
经过训练,我可以得到最好的树数:
regressor = cvModel.bestModel.stages[len(cvModel.bestModel.stages) - 1]
print(regressor.getNumTrees)
但我不知道如何获得最佳的最大深度。我已经阅读了 documentation,但我没有看到我遗漏了什么。
我会注意到我可以遍历所有树并找到每棵树的深度,例如
regressor.trees[0].depth
不过我好像漏掉了什么。
不幸的是,PySpark RandomForestRegressionModel
在 Spark 2.3 之前,不像它的 Scala 对应物,不存储上游 Estimator
Params
,但你应该能够直接从 JVM 对象中检索它.使用简单的猴子补丁:
from pyspark.ml.regression import RandomForestRegressionModel
RandomForestRegressionModel.getMaxDepth = (
lambda self: self._java_obj.getMaxDepth()
)
您可以:
cvModel.bestModel.stages[-1].getMaxDepth()
更简单,直接调用
cvModel.bestModel.stages[-1]._java_obj.getMaxDepth()
正如@user6910411 所解释的那样,您获得了 bestModel,调用该模型的 JVM 对象并使用 getMaxDepth() 从 JVM 对象中提取您的参数。 其他参数的类似工作。