Spark ML交叉验证调参保存模型报错:发现无关Param
问题分析与解决方案
你的理解方向是对的——自定义MyModel继承HasRegParam后确实包含regParam参数,但触发异常的核心原因是你构建参数网格时引用了错误的参数实例。
为什么会报错?
从报错信息里的logreg_2fb5fdbe5012__regParam可以看出,这个参数属于一个LogisticRegression实例,而非你的MyModel实例。Spark ML的每个Param都绑定到特定的ML实例(称为owner),即使参数名称相同,不同实例的Param是完全独立的对象。
CrossValidator在保存时的校验逻辑(ValidatorParams.scala中的代码)会严格检查:estimatorParamMaps里的所有参数必须属于CrossValidator本身、它的Estimator(你的MyModel)或者Evaluator。如果参数的owner是其他无关实例(比如这里的LogisticRegression),就会被判定为“额外参数”,抛出IllegalArgumentException。
怎么解决?
修正你的ParamGridBuilder代码,确保引用的是你的MyModel实例(也就是代码里的estimator)的regParam,而非其他模型(比如某个LogisticRegression实例)的参数:
// 确保这里使用estimator(你的MyModel实例)的regParam val paramGrid = new ParamGridBuilder() .addGrid(estimator.regParam, Array(0.1, 0.01)) .build() val validator = new CrossValidator() .setEstimator(estimator) .setEvaluator(evaluator) .setEstimatorParamMaps(paramGrid) .setNumFolds(3)
额外注意点
- 检查你的代码中是否不小心混用了
LogisticRegression实例(比如变量名lr)和MyModel实例(estimator),这是这类错误的常见诱因。 - 后续保存模型时,确保所有关联参数的归属都和当前的Estimator/Validator匹配,避免出现类似的参数归属不匹配问题。
内容的提问来源于stack exchange,提问作者KSeeker
相关产品推荐
相关产品推荐

