按照sklearn的教程,我尝试保存通过sklearn创建但未成功的对象。看来问题出在交叉验证对象上,因为我可以保存实际(最终)模型。
假设:
rf_model = RandomForestRegressor(n_estimators=1000, n_jobs=4, compute_importances = False)
cvgridsrch = GridSearchCV(estimator=rf_model, param_grid=parameters,n_jobs=4)
cvgridsrch.fit(X,y)
这将成功:
joblib.dump(cvgridsrch.best_estimator_, 'C:\\Users\\Desktop\\DMA\\cvgridsrch.pkl', compress=9)
这将失败:
joblib.dump(cvgridsrch, 'C:\\Users\\Desktop\\DMA\\cvgridsrch.pkl', compress=9)
有错误:
PicklingError: Can't pickle <type 'instancemethod'>: it's not found as __builtin__.instancemethod
如何保存完整的对象?
答案 0 :(得分:1)
如果您使用的是Python 2, 尝试:
import dill
这样可以腌制lambda函数....
答案 1 :(得分:0)
一个可能的原因可能是多线程问题,您可以参考this stackoverflow答案。
另外,你是否有可能不是通过joblib转储你的对象,而是像pickle这样更基本的方法(甚至cPickle也没有限制)?
答案 2 :(得分:0)
我知道这是一个老问题,但对于来这里遇到相同或类似问题的人来说可能会有用。
我不确定具体的错误消息,但我设法通过使用pickle成功地将整个GridSearchCV对象保存在我自己的项目中:
import pickle
gs = GridSearchCV(some parameters) #create the gridsearch object
gs.fit(X, y) # fit the model
with open('file_name', 'wb') as f:
pickle.dump(gs, f) # save the object to a file
然后你可以使用
with open('file_name', 'rb') as f:
gs = pickle.load(f)
读取文件,因此可以再次使用该对象。