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)
然后可以通过Google Cloud控制台或编程方式创建
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()
谷歌云ML引擎调用分类器的
predict
函数并返回预测类。然而,我想能够返回置信度得分。通常,可以通过调用分类器的predict_proba
函数来实现这一点,但似乎没有更改所调用函数的选项。我的问题是:在使用谷歌云ML引擎时,是否可能返回scikit-learn分类器的置信度得分?如果不行,您有什么其他建议吗?
更新:
我找到了一个hacky解决方案。它涉及重写分类器的predict
函数,将其替换为自己的predict_proba
函数。nb = naive_bayes.MultinomialNB()
nb.predict = nb.predict_proba
classifier = Pipeline([
('vect', CountVectorizer()),
('clf', nb)])
令人惊讶的是,这个方法可行。如果有更好的解决方案,请告诉我。
更新:谷歌发布了一个新功能(目前处于测试版),名为自定义预测例程
。这允许您在预测请求到来时定义要运行的代码。它增加了更多的代码,但肯定比较不那么hacky。