【发布时间】:2019-02-08 14:48:23
【问题描述】:
Google Cloud ML-engine 支持部署 scikit-learn Pipeline 对象的能力。例如,文本分类Pipeline 可能如下所示,
classifier = Pipeline([
('vect', CountVectorizer()),
('clf', naive_bayes.MultinomialNB())])
可以训练分类器,
classifier.fit(train_x, train_y)
然后分类器可以上传到谷歌云存储,
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)
然后可以通过Google Cloud Console 或programmatically 创建Model 和Version,将'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()
Google Cloud ML 引擎调用分类器的predict 函数并返回预测的类。但是,我希望能够返回置信度分数。通常这可以通过调用分类器的predict_proba 函数来实现,但是似乎没有更改被调用函数的选项。我的问题是:使用 Google Cloud ML 引擎时是否可以返回 scikit-learn 分类器的置信度分数?如果没有,您对如何实现这一结果有什么建议吗?
更新:
我找到了一个 hacky 解决方案。它涉及用自己的predict_proba函数覆盖分类器的predict函数,
nb = naive_bayes.MultinomialNB()
nb.predict = nb.predict_proba
classifier = Pipeline([
('vect', CountVectorizer()),
('clf', nb)])
令人惊讶的是,这有效。如果有人知道更简洁的解决方案,请告诉我。
更新:Google 发布了一项名为 Custom prediction routines 的新功能(目前处于测试阶段)。这允许您定义当预测请求进来时运行什么代码。它为解决方案添加了更多代码,但它肯定不那么hacky。
【问题讨论】:
标签: python scikit-learn google-cloud-platform google-cloud-ml