Экспортировать классификатор sklearn для ссылки на него в других скриптах - PullRequest
0 голосов
/ 18 марта 2020

У меня есть случайный классификатор леса, хранящийся в объекте clf. В действительно упрощенных терминах я сделал следующее:

# Import libraries
import pandas as pd
from import sklearn.ensemble import RandomForestClassifier as rfc

# Import data
exog = pd.read_csv('train.csv')
trgt = pd.read_csv('target.csv')

# Declare classifier
clf = rfc(n_estimators=51, bootstrap=True, max_features=3)

# Fit classifier to data
clf.fit(exog, trgt)

Я хотел бы экспортировать clf, чтобы я мог ссылаться на него в другом скрипте. Моя цель - импортировать clf в Python скрипт, который будет работать на удаленном сервере. Я хочу ввести в него данные вне выборки и вернуть их соответствующие баллы, используя clf.predict_proba(new_data).

Мой главный приоритет - избегать обучения классификатора каждый раз, когда я предсказываю вероятности для новых наборов данных. Есть ли способ экспортировать настроенный объект clf?

Этот поток указал мне правильное направление, но решение использует cPickle и выдает следующую ошибку:

Ошибка типа: аргумент write () должен быть str, а не байтами

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

В документации sklearn есть много информации о сохранении модели, но она советует вам использовать pickle или joblib.

например joblib

>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib')
>>> clf = load('filename.joblib')

или pickle

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)

Из документов:

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

1 голос
/ 18 марта 2020

Этот фрагмент кода будет работать для вас:

import pickle
# save the model to disk
filename = 'finalized_model.sav'
pickle.dump(clf, open(filename, 'wb'))

# some time later...

# load the model from disk
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_test, Y_test)
print(result)

из этого источника .

в вашем вопросе дубликат .

1 голос
/ 18 марта 2020

Вы можете сериализовать объект с помощью pickle или cloudpickle. Это будет работать, если вы убедитесь, что версии пакетов одинаковы в вашей удаленной и локальной среде.

Для сохранения:

import pickle

with open('/path/to/file', 'w') as f:
    pickle.dump(clf, f)

Для загрузки:

import pickle
with open('/path/to/file') as f:
    clf = pickle.load(f)
...