如何将 Scikit Learn OneVsRestClassifier 预测方法输出转换为谷歌云 ML 的密集数组?

Posted

技术标签:

【中文标题】如何将 Scikit Learn OneVsRestClassifier 预测方法输出转换为谷歌云 ML 的密集数组?【英文标题】:How to convert Scikit Learn OneVsRestClassifier predict method output to dense array for google cloud ML? 【发布时间】:2019-08-17 09:15:23 【问题描述】:

我有一个使用 sklearn 管道和 OneVsRestClassifier 训练的模型,我正尝试将其部署到 Cloud ML Engine,但是当我使用命令时:

gcloud ml-engine predict --model $MODEL_NAME --version $VERSION_NAME --json-instances $INPUT_FILE

我收到错误:

"error": "Prediction failed: Bad output type returned.The predict function should return either a numpy ndarray or a list."

这让我相信 OneVsRestClassifier 的预测方法输出是一个稀疏矩阵,而它应该是一个 numpy 数组。如何将其输出转换为管道中的密集数组?

管道的架构如下所示:

Pipeline([('tfidf', tfidf), ('clf', OneVsRestClassifier(XGBClassifier())])

谢谢!

我尝试使用此处的方法 (Google Cloud ML-engine scikit-learn prediction probability 'predict_proba()') 用它的 predict_proba 方法覆盖 OneVsRestClassifier 的预测方法,但是当我尝试腌制新管道时,这会导致以下错误:

PicklingError: Can't pickle <function OneVsRestClassifier.predict_proba at 0x10a8f9d08>: it's not the same object as sklearn.multiclass.OneVsRestClassifier.predict_proba

【问题讨论】:

【参考方案1】:

AI Platform(以前称为 Cloud Machine Learning Engine)为您的模型提供服务,并期望输入和输出可进行 json 序列化。如果您的模型返回稀疏矩阵,那么您需要将其转换为密集矩阵(有关详细信息,请参阅this)。

如果您选择覆盖predict_proba,那么您正在使用一些自定义代码(您的代码覆盖函数)部署您的模型。然后,您需要打包自定义代码,并在部署模型时将其与模型一起传递。有关如何使用自定义代码部署模型的更多信息,请访问 AI Platform 上的Custom prediction routines。

【讨论】:

以上是关于如何将 Scikit Learn OneVsRestClassifier 预测方法输出转换为谷歌云 ML 的密集数组?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas + scikit-learn - 如何将二维数组转换应用于 DataFrame

如何使用 scikit-learn 将多项式曲线拟合到数据中?

如何将参数传递给 Scikit-Learn Keras 模型函数

如何将 scikit-learn 模型部署到 android?

如何将训练有素的 scikit-learn 模型导入 android 项目

如何将模型 (GLM) 从 h2o 移植到 scikit-learn?