如何用Python将模型存储至HDFS?遇AttributeError问题求助
解决将训练好的Scikit-learn模型存储到HDFS的问题
我来帮你搞定这个问题,咱们先拆解下你遇到的错误原因,再给出可行的解决方案:
错误原因分析
你写的代码里,from_path是prediction_model.fit(...)的返回值——而Scikit-learn的fit()方法返回的是训练好的模型对象(这里是LogisticRegression实例),并不是本地文件的路径字符串。但hdfs.put()方法的第一个参数要求传入的是本地文件的路径,它会尝试调用路径字符串的startswith()方法来判断路径类型,模型对象自然没有这个属性,所以就抛出了AttributeError: 'LogisticRegression' object has no attribute 'startswith'。
正确解决方案
要把模型存到HDFS,核心是先把模型序列化(用pickle),再把序列化后的内容传到HDFS。这里有两种常用方式:
方式一:先序列化到本地文件,再上传到HDFS
这种方式适合需要保留本地模型备份的场景:
import pickle import pydoop.hdfs as hdfs # 先训练模型(注意:fit方法会直接修改prediction_model对象,不需要接收返回值) prediction_model.fit(orginal_telecom_80p_train[features], orginal_telecom_80p_train["Churn"]) # 1. 将模型序列化到本地文件 local_model_path = "./churn_model_local.sav" with open(local_model_path, "wb") as local_file: pickle.dump(prediction_model, local_file) # 2. 上传本地文件到HDFS目标路径 hdfs_target_path = 'hdfs://192.168.1.101:8020/user/volumata/python_models/churn_model.sav' hdfs.put(local_model_path, hdfs_target_path)
方式二:直接将序列化内容写入HDFS(无需本地文件)
这种方式更高效,避免占用本地磁盘空间,适合直接在集群环境中操作:
import pickle import pydoop.hdfs as hdfs # 训练模型 prediction_model.fit(orginal_telecom_80p_train[features], orginal_telecom_80p_train["Churn"]) # 直接通过pydoop的HDFS文件对象写入序列化后的模型 hdfs_target_path = 'hdfs://192.168.1.101:8020/user/volumata/python_models/churn_model.sav' with hdfs.open(hdfs_target_path, "wb") as hdfs_file: pickle.dump(prediction_model, hdfs_file)
额外注意事项
- 如果HDFS的目标父目录不存在,可能会报错,你可以提前创建目录:
hdfs.mkdir('hdfs://192.168.1.101:8020/user/volumata/python_models') - 后续加载模型时,对应地用
pickle.load读取:如果是方式一上传的,可以先下载到本地再加载;如果是方式二,直接通过hdfs.open打开文件对象后用pickle.load读取即可。
内容的提问来源于stack exchange,提问作者SARANYA
相关产品推荐
相关产品推荐

