加载不合适模型对象的 PySpark 问题

PySpark issues with loading unfit model object

我正在研究 pyspark.ml.classification 模型的 saveload 函数。我创建了一个 RandomForestClassifier 的实例,将值设置为几个参数并调用了分类器的 save 方法。它保存成功。没有问题。

from pyspark.ml.classification import RandomForestClassifier
# save
rf = RandomForestClassifier()
rf.setImpurity('entropy')
rf.setPredictionCol('predme')
rf.write().overwrite().save('rf_test')

然后我尝试加载它,但我注意到它的参数没有我在保存之前设置的值。下面是我正在尝试的代码

# load
rf2 = RandomForestClassifier()
rf2.load('rf_test')
print(rf2.getImpurity()) # returns gini
print(rf2.getPredictionCol())  # returns prediction

我想我对这段代码应该如何工作以及它实际如何工作的理解有所不同。

我应该怎么做才能恢复我保存时的对象?

编辑

我试过这里提到的方法。但这没有用。这是我试过的

from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier()
rf.setImpurity('entropy')
rf.setPredictionCol('predme')
rf.write().overwrite().save('rf_test')
rf2 = RandomForestClassifier
rf2.load('rf_test')
print(rf2.getImpurity())

返回了以下

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: getImpurity() missing 1 required positional argument: 'self'

这不是您应该使用 load 方法的方式。它是一个 classmethod 并且应该在 class 对象而不是实例上调用到 return 一个新对象:

rf2 = RandomForestClassifier.load('rf_test')
rf2.getImpurity()

从技术上讲,在实例上调用它也可以,但它不会修改调用者,而是 return 一个新的独立对象:

rf2 = RandomForestClassifier().load('rf_test')

但在实践中,应该避免这种结构。