Как сохранить и восстановить мою модель 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 ответ
Проблема не в постоянстве и загрузке вашей модели. Проблема в том, что вы выполняете некоторую предварительную обработку данных, которую вы не сохраняете.
У вас есть два варианта:
- Иметь документацию с указанием того, что принимает модель, и пользователь / клиент будет знать, что дать модели.
- Вы сделали некоторую предварительную обработку, которую вы можете объединить с вашей моделью, используя
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.