如何将 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?