首页 > 解决方案 > PySpark 加载不合适的模型对象时出现问题

问题描述

我在玩模型的saveload功能pyspark.ml.classification。我创建了一个 a 的实例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'

标签: apache-sparkpysparkapache-spark-ml

解决方案


这不是你应该如何使用load方法。它是一个classmethod并且应该在类对象而不是实例上调用以返回一个新对象:

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

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

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

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


推荐阅读