Как сохранить и восстановить мою модель sklearn?

Я использую 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 ответ

Проблема не в постоянстве и загрузке вашей модели. Проблема в том, что вы выполняете некоторую предварительную обработку данных, которую вы не сохраняете.

У вас есть два варианта:

  1. Иметь документацию с указанием того, что принимает модель, и пользователь / клиент будет знать, что дать модели.
  2. Вы сделали некоторую предварительную обработку, которую вы можете объединить с вашей моделью, используя Pipeline,

Вот пример конвейера, взятого из документации:

>>> 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.

Другие вопросы по тегам