Вероятность предсказания scikit-Learn Google Cloud ML-engine'gnett_proba () ' - PullRequest
0 голосов
/ 03 сентября 2018

Google Cloud ML-engine поддерживает возможность развертывания объектов scikit-learn Pipeline. Например, текстовая классификация Pipeline может выглядеть следующим образом:

classifier = Pipeline([
('vect', CountVectorizer()), 
('clf', naive_bayes.MultinomialNB())])

Классификатор можно обучить,

classifier.fit(train_x, train_y)

Затем классификатор можно загрузить в Google Cloud Storage,

model = 'model.joblib'
joblib.dump(classifier, model)
model_remote_path = os.path.join('gs://', bucket_name, datetime.datetime.now().strftime('model_%Y%m%d_%H%M%S'), model)
subprocess.check_call(['gsutil', 'cp', model, model_remote_path], stderr=sys.stdout)

Затем можно создать Model и Version с помощью Google Cloud Console или программным способом , связывание файла 'model.joblib' с Version.

Затем этот классификатор можно использовать для прогнозирования новых данных, вызывая развернутую модель predict конечная точка,

ml = discovery.build('ml','v1')
project_id = 'projects/{}/models/{}'.format(project_name, model_name)
if version_name is not None:
    project_id += '/versions/{}'.format(version_name)
request_dict = {'instances':['Test data']}
ml_request = ml.projects().predict(name=project_id, body=request_dict).execute()

ML-движок Google Cloud вызывает функцию классификатора predict и возвращает прогнозируемый класс. Тем не менее, я хотел бы иметь возможность вернуть счет доверия. Обычно этого можно достичь, вызвав функцию predict_proba класса, однако, похоже, нет возможности изменить вызываемую функцию. Мой вопрос: возможно ли вернуть показатель достоверности для классификатора scikit-learn при использовании ML-движка Google Cloud? Если нет, то не могли бы вы дать какие-либо рекомендации относительно того, как еще добиться этого результата?

Обновление: Я нашел хакерское решение. Он включал перезапись функции predict классификатора собственной функцией predict_proba,

nb = naive_bayes.MultinomialNB()
nb.predict = nb.predict_proba
classifier = Pipeline([
('vect', CountVectorizer()), 
('clf', nb)])

Удивительно, но это работает. Если кто-нибудь знает более точное решение, пожалуйста, дайте мне знать.

Обновление: Google выпустил новую функцию (в настоящее время в бета-версии) под названием Custom prediction routines. Это позволяет вам определить, какой код запускается при поступлении запроса на предсказание. Он добавляет больше кода к решению, но, безусловно, менее хакерский.

1 Ответ

0 голосов
/ 04 сентября 2018

API ML Engine, который вы используете, имеет только метод предсказания, как вы можете видеть в документации , поэтому он будет делать только предсказание (если вы не заставите его сделать что-то еще с взломом Вы упомянули).

Если вы хотите сделать что-то еще с вашей обученной моделью, вам придется загрузить ее и использовать в обычном режиме. Если вы хотите использовать модель, хранящуюся в облачном хранилище, вы можете сделать что-то вроде:

from google.cloud import storage
from sklearn.externals import joblib

bucket_name = "<BUCKET_NAME>"
gs_model = "path/to/model.joblib"  # path in your Cloud Storage bucket
local_model = "/path/to/model.joblib"  # path in your local machine

client = storage.Client()
bucket = client.get_bucket(bucket_name)
blob = bucket.blob(gs_model)
blob.download_to_filename(local_model)

model = joblib.load(local_model)
model.predict_proba(test_data)
...