diff --git a/python/pyspark/ml/tests/test_tuning.py b/python/pyspark/ml/tests/test_tuning.py index b250740f8c4f1..b1acaf695245d 100644 --- a/python/pyspark/ml/tests/test_tuning.py +++ b/python/pyspark/ml/tests/test_tuning.py @@ -101,7 +101,6 @@ def test_copy(self): lambda x: x.getEstimator().uid, # SPARK-32092: CrossValidator.copy() needs to copy all existing params lambda x: x.getNumFolds(), - lambda x: x.getFoldCol(), lambda x: x.getCollectSubModels(), lambda x: x.getParallelism(), lambda x: x.getSeed() @@ -116,7 +115,6 @@ def test_copy(self): # SPARK-32092: CrossValidatorModel.copy() needs to copy all existing params for param in [ lambda x: x.getNumFolds(), - lambda x: x.getFoldCol(), lambda x: x.getSeed() ]: self.assertEqual(param(cvModel), param(cvModelCopied)) @@ -127,9 +125,9 @@ def test_copy(self): 'foo', "Changing the original avgMetrics should not affect the copied model" ) - cvModel.subModels[0] = 'foo' + cvModel.subModels[0][0].getInducedError = lambda: 'foo' self.assertNotEqual( - cvModelCopied.subModels[0], + cvModelCopied.subModels[0][0].getInducedError(), 'foo', "Changing the original subModels should not affect the copied model" ) @@ -224,7 +222,6 @@ def test_save_load_trained_model(self): loadedCvModel = CrossValidatorModel.load(cvModelPath) for param in [ lambda x: x.getNumFolds(), - lambda x: x.getFoldCol(), lambda x: x.getSeed(), lambda x: len(x.subModels) ]: @@ -780,9 +777,9 @@ def test_copy(self): 'foo', "Changing the original validationMetrics should not affect the copied model" ) - tvsModel.subModels[0] = 'foo' + tvsModel.subModels[0].getInducedError = lambda: 'foo' self.assertNotEqual( - tvsModelCopied.subModels[0], + tvsModelCopied.subModels[0].getInducedError(), 'foo', "Changing the original subModels should not affect the copied model" ) diff --git a/python/pyspark/ml/tuning.py b/python/pyspark/ml/tuning.py index 91f34ef24d021..6283c8bfd3df9 100644 --- a/python/pyspark/ml/tuning.py +++ b/python/pyspark/ml/tuning.py @@ -480,7 +480,10 @@ def copy(self, extra=None): extra = dict() bestModel = self.bestModel.copy(extra) avgMetrics = list(self.avgMetrics) - subModels = [model.copy() for model in self.subModels] + subModels = [ + [sub_model.copy() for sub_model in fold_sub_models] + for fold_sub_models in self.subModels + ] return self._copyValues(CrossValidatorModel(bestModel, avgMetrics, subModels), extra=extra) @since("2.3.0") @@ -511,7 +514,6 @@ def _from_java(cls, java_stage): "estimator": estimator, "estimatorParamMaps": epms, "numFolds": java_stage.getNumFolds(), - "foldCol": java_stage.getFoldCol(), "seed": java_stage.getSeed(), } for param_name, param_val in params.items(): @@ -544,7 +546,6 @@ def _to_java(self): "estimator": estimator, "estimatorParamMaps": epms, "numFolds": self.getNumFolds(), - "foldCol": self.getFoldCol(), "seed": self.getSeed(), } for param_name, param_val in params.items():