Вопрос по python – Сохранить классификатор на диск в Scikit-Learn

149

Как мне спасти обученного Наивный байесовский классификатор в Диск и использовать его для Предсказать данные

У меня есть следующий пример программы с сайта scikit-learn:

from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()

Ваш Ответ

5   ответов
165

которые можно мариновать и сбрасывать, как и любые другие. Чтобы продолжить ваш пример:

import cPickle
# save the classifier
with open('my_dumped_classifier.pkl', 'wb') as fid:
    cPickle.dump(gnb, fid)    

# load it again
with open('my_dumped_classifier.pkl', 'rb') as fid:
    gnb_loaded = cPickle.load(fid)
Работает как шарм! Я пытался использовать np.savez и загружать его обратно, и это никогда не помогало. Большое спасибо Kartos
в python3, используйте модуль pickle, который работает точно так же. MCSH
76

Постоянство модели в склеарн словах и это задокументировавведени И в постоянство модели разделы.

Итак, вы инициализировали свой классификатор и долго его обучали с помощью

clf = some.classifier()
clf.fit(X, y)

После этого у вас есть два варианта:

1) Используя Pickle

import pickle
# now you can save it to a file
with open('filename.pkl', 'wb') as f:
    pickle.dump(clf, f)

# and later you can load it
with open('filename.pkl', 'rb') as f:
    clf = pickle.load(f)

2) Использование Joblib

from sklearn.externals import joblib
# now you can save it to a file
joblib.dump(clf, 'filename.pkl') 
# and later you can load it
clf = joblib.load('filename.pkl')

Еще раз полезно почитать вышеупомянутые ссылки

3

sklearn Оценщики реализуют методы, позволяющие вам легко сохранять соответствующие обученные свойства оценщика. Некоторые оценщики реализуют__getstate__ сами методы, но другие, какGMM просто используйтеbase реализация, который просто сохраняет объекты внутри словаря:

    try:
        state = super(BaseEstimator, self).__getstate__()
    except AttributeE,rror:
        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 и их зависимости

Оценка перекрестной проверки, полученная по данным обучения

Это особенно актуально для оценщиков ансамбля которые полагаются наtree.pyxодуль @, написанный на Cython (например,IsolationForest), поскольку он создает связь с реализацией, которая не гарантируется стабильной между версиями sklearn. Он видел назад несовместимые изменения в прошлом.

Если ваши модели становятся очень большими и загрузка становится неприятной, вы также можете использовать более эффективныеjoblib. Из документации:

В конкретном случае скикита может быть интереснее использовать замену Joblib наpickle (joblib.dump & joblib.load), который более эффективен для объектов, которые несут большие массивы внутри, как это часто бывает в случае встроенных оценок scikit-learn, но может работать только с диском, а не с строкой:

184

Joblib.dump а также Joblib.load, который намного более эффективен при обработке числовых массивов, чем стандартный Python Pickler.

Joblib включен в Scikit-Learn:

>>> from sklearn.externals import joblib
>>> from sklearn.datasets import load_digits
>>> from sklearn.linear_model import SGDClassifier

>>> digits = load_digits()
>>> clf = SGDClassifier().fit(digits.data, digits.target)
>>> clf.score(digits.data, digits.target)  # evaluate training error
0.9526989426822482

>>> filename = '/tmp/digits_classifier.joblib.pkl'
>>> _ = joblib.dump(clf, filename, compress=9)

>>> clf2 = joblib.load(filename)
>>> clf2
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
       fit_intercept=True, learning_rate='optimal', loss='hinge', n_iter=5,
       n_jobs=1, penalty='l2', power_t=0.5, rho=0.85, seed=0,
       shuffle=False, verbose=0, warm_start=False)
>>> clf2.score(digits.data, digits.target)
0.9526989426822482
Если вы используете IPython, не используйте--pylab флаг командной строки или символ%pylab magic как неявная перегрузка пространства имен, как известно, нарушает процесс травления. Используйте явный импорт и символ%matplotlib inline вместо магии. ogrisel
Можно ли переучить ранее сохраненную модель? Конкретно модели SVC? Uday Sawant
см. документацию по scikit-learn для справки: Scikit-learn.org / стабильный / учебник / основной / ... user1448319
Нет способа остановить и возобновить выполнениеfit метод, если это то, что вы ищете. Что, как говорится,joblib.load не должен вызывать исключение после успешногоjoblib.dump если вы вызываете его из Python с той же версией библиотеки scikit-learn. ogrisel
Но, насколько я понимаю, конвейерная работа работает, если она является частью единого рабочего процесса. Если я хочу построить модель, сохраните ее на диске и остановите выполнение. Потом я вернусь через неделю и попытаюсь загрузить модель с диска, она выдаст мне ошибку: venuktan
19

особенно с текстовой классификацией, недостаточно просто сохранить классификатор, но вам также необходимо сохранить векторизатор, чтобы в дальнейшем можно было векторизовать входные данные.

import pickle
with open('model.pkl', 'wb') as fout:
  pickle.dump((vectorizer, clf), fout)

будущее использование:

with open('model.pkl', 'rb') as fin:
  vectorizer, clf = pickle.load(fin)

X_new = vectorizer.transform(new_samples)
X_new_preds = clf.predict(X_new)

Перед тем как выгрузить векторизатор, можно удалить свойство векторизатора stop_words_:

vectorizer.stop_words_ = None

чтобы сделать демпинг более эффективным. Также, если параметры вашего классификатора редкие (как в большинстве примеров текстовой классификации), вы можете преобразовать параметры из плотного в разреженный, что будет иметь огромное значение с точки зрения потребления памяти, загрузки и выгрузки. Sparsify модель по:

clf.sparsify()

Который будет автоматически работать для SGDClassifier но если вы знаете, что ваша модель редкая (много нулей в clf.coef_), то вы можете вручную преобразовать clf.coef_ вcsr scipy разреженная матрица по

clf.coef_ = scipy.sparse.csr_matrix(clf.coef_)

и тогда ты сможешь хранить его более эффективно.

это было очень нужно, больше нигде не было. Благодарность Parvathy Sarat
Я хочу, чтобы это было добавлено в документацию! Особенно ваше первое предложение, так как это единственное место, где я когда-либо видел упоминание. deejbee

Похожие вопросы