Spark ML:如何将所有参数从模型复制到另一个模型

时间:2018-12-26 02:20:39

标签: scala apache-spark apache-spark-ml

在Spark中,我使用设置器设置了Estimator的所有参数。现在,我想将所有这些值复制到另一个Estimator,该Estimator是另一个类中的现有val。我可以在第二个实例中一个接一个地使用二传手,但是我想一次复制所有参数,就像copyValues()一样-但copyValues是私有的:-(

我尝试调用mymodel.extractParamMap(),然后遍历它,调用othermodel.set(param, value),但不做任何修改,但是原始的Params已经设置了父对象,因此当Spark意识到新模型是不是这些参数的所有者(父母)。

我不能(至少不容易)创建新的Param实例(更新了新的父级),因为每个原始Param都属于我在遍历param贴图时无法检索的Params的某些子类(例如DoubleParam等)。我为此使用反射。

我不能只创建一个具有相同origina值的新ParamPair,而无需先指定有关参数的基础类型的东西。我可以对每种可能的类型(例如IntParamDoubleParam等)进行某种模式匹配,以在每种情况下都创建合适的(父更新的)Param类型(我尝试过并且可行) ),但这很丑陋而且一点也不优雅。

难道没有一种更简单的方法可以将所有参数值一次从一个模型(估计器)传输到另一个现有模型吗?类似于copyValues,但对于公众来说:-)

1 个答案:

答案 0 :(得分:0)

如果有帮助,我可以用Python展示给我看,我想它在Scala中也很相似。例如,如果我们有:

rf = RandomForestRegressor(featuresCol = 'features', labelCol = 'TARGET', predictionCol='prediccion',
                       numTrees = 46)

您可以通过以下方式获取字典参数:

params = {param[0].name: param[1] for param in rf.extractParamMap().items()}

并创建一个新模型:

new_rf = RandomForestRegressor(**params)