我正在使用pickle
来存储我的机器学习模型:
import pickle
with open('mymodel','wb') as f:
pickle.dump(gbc,f)
现在,在另一台计算机上,我想测试这个模型。所以我正在恢复我的模型并传递这样的数据:
with open('mymodel', 'rb') as fin:
clf = pickle.load(fin)
X_new_preds = clf.predict(dataset)
但是我收到了这个错误:
ValueError: Number of features of the model must match the input. Model
n_features is 20 and input n_features is 19
从上面我可以理解,虽然训练我做了很多预处理,比如数据我有分类功能,然后我删除了多线性列和所有。所以在我的最后DataFrame
我有20个功能(记住,这是经过大量的预处理后)。
所以,我想知道,如何使用pickle
存储这些信息。或者我如何恢复我的模型并可以在新数据中使用。
编辑:
我也尝试了这个
#Using Joblib
from sklearn.externals import joblib
filename = 'finalized_model.sav'
joblib.dump(gbc, filename)
loaded_model = joblib.load(filename)
X_new_preds = clf.predict(dataset)
但获得相同的值错误。
答案 0 :(得分:0)
问题不在于您的模型持久性和加载。问题是你正在对数据进行一些预处理,而你没有保存。
您有两种选择:
Pipeline
将模型与模型结合在一起。以下是取自docs:
的管道示例>>> from sklearn import svm
>>> from sklearn.datasets import samples_generator
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_regression
>>> from sklearn.pipeline import Pipeline
>>> # generate some data to play with
>>> X, y = samples_generator.make_classification(
... n_informative=5, n_redundant=0, random_state=42)
>>> # ANOVA SVM-C
>>> anova_filter = SelectKBest(f_regression, k=5)
>>> clf = svm.SVC(kernel='linear')
>>> anova_svm = Pipeline([('anova', anova_filter), ('svc', clf)])
>>> # You can set the parameters using the names issued
>>> # For instance, fit using a k of 10 in the SelectKBest
>>> # and a parameter 'C' of the svm
>>> anova_svm.set_params(anova__k=10, svc__C=.1).fit(X, y)
...
Pipeline(memory=None,
steps=[('anova', SelectKBest(...)),
('svc', SVC(...))])
>>> prediction = anova_svm.predict(X)
>>> anova_svm.score(X, y)
0.829...
>>> # getting the selected features chosen by anova_filter
>>> anova_svm.named_steps['anova'].get_support()
...
array([False, False, True, True, False, False, True, True, False,
True, False, True, True, False, True, False, True, True,
False, False], dtype=bool)
>>> # Another way to get selected features chosen by anova_filter
>>> anova_svm.named_steps.anova.get_support()
...
array([False, False, True, True, False, False, True, True, False,
True, False, True, True, False, True, False, True, True,
False, False], dtype=bool)
一旦你坚持整个管道,你可以要求客户给出模型(管道)原始形式的数据。只要您遵循所需的API,您也可以开发一些自定义转换并将它们添加到管道中。