sklearn
Оцінювачі реалізують методи, щоб полегшити вам збереження відповідних навчених властивостей оцінювача. Деякі оцінювачі реалізують __getstate__
методи самостійно, але інші, як-от GMM
просто використання базової реалізації, що просто зберігає внутрішній словник об'єктів:
def __getstate__(self):
try:
state = super(BaseEstimator, self).__getstate__()
except AttributeError:
state = self.__dict__.copy()
if type(self).__module__.startswith('sklearn.'):
return dict(state.items(), _sklearn_version=__version__)
else:
return state
Рекомендованим способом збереження вашої моделі на диску є використання pickle
модуля:
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:100, :2]
y = iris.target[:100]
model = SVC()
model.fit(X,y)
import pickle
with open('mymodel','wb') as f:
pickle.dump(model,f)
Однак вам слід зберегти додаткові дані, щоб ви могли в подальшому перевчити свою модель або зазнати тяжких наслідків (наприклад, заблокувати стару версію sklearn) .
З документації :
Для відновлення подібної моделі з майбутніми версіями scikit-learn слід зберегти додаткові метадані уздовж маринованої моделі:
Дані про тренінг, наприклад, посилання на незмінний знімок
Вихідний код python, який використовується для створення моделі
Версії scikit-learn та його залежності
Оцінка крос-валідації, отримана на даних тренінгу
Особливо це стосується оцінок Ensemble, які покладаються на tree.pyx
модуль, написаний на Cython (такий як IsolationForest
), оскільки він створює зв'язок із реалізацією, яка не гарантує стабільності між версіями sklearn. У минулому спостерігалися несумісні зміни.
Якщо ваші моделі стають дуже великими і завантаження стає неприємністю, ви також можете використовувати більш ефективні joblib
. З документації:
У конкретному випадку scikit може бути цікавіше використовувати заміну joblib на pickle
( joblib.dump
& joblib.load
), яка є більш ефективною для об'єктів, що містять великі нумерові масиви всередині, як це часто буває для пристосованих оцінювачів, які навчаються наукам, але можуть лише маринувати на диск, а не на рядок: