如何保存和恢复我的sklearn模型?

时间:2018-04-06 12:03:53

标签: python machine-learning scikit-learn pickle machine-learning-model

我正在使用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)

但获得相同的值错误。

1 个答案:

答案 0 :(得分:0)

问题不在于您的模型持久性和加载。问题是你正在对数据进行一些预处理,而你没有保存。

您有两种选择:

  1. 有一份文件说明模型接受什么,用户/客户会知道该模型的内容。
  2. 您完成了一些预处理,您可以使用Pipeline将模型与模型结合在一起。
  3. 以下是取自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,您也可以开发一些自定义转换并将它们添加到管道中。