apache-spark - PySpark 加载不合适的模型对象时出现问题
问题描述
我在玩模型的save
和load
功能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'
解决方案
这不是你应该如何使用load
方法。它是一个classmethod
并且应该在类对象而不是实例上调用以返回一个新对象:
rf2 = RandomForestClassifier.load('rf_test')
rf2.getImpurity()
从技术上讲,在实例上调用它也可以,但它不会修改调用者,而是返回一个新的独立对象:
rf2 = RandomForestClassifier().load('rf_test')
但在实践中,应该避免这种结构。
推荐阅读
- java - 展开字符串分解成重复的嵌套组件
- laravel - 如何在 laravel + socket.io 中将一页的实时事件流式传输到另一页?
- angular - 用于单元格渲染器的 Angular ag-grid 库父子通信
- amazon-web-services - 需要审批工作流系统
- android - 华为自动语音识别限制 - PICKUP UI上的服务不可用错误
- amazon-web-services - Elastic Beanstalk 的配置部署工作流程?
- php - 从 php 文件中分离 html 表单
- android - 从库中过滤掉特定的 LogCat 消息
- java - 线程“主”java.lang.NoClassDefFoundError 中的异常:net/dv8tion/jda/api/JDABuilder
- outlook - Outlook 加载项 - 如何声明我们的加载项不支持使用 IE11 的 Outlook 版本