如何让 SK Learn 分类器接受 2D 数组作为预测的输入?

Posted

技术标签:

【中文标题】如何让 SK Learn 分类器接受 2D 数组作为预测的输入?【英文标题】:How do I make an SK Learn Classifier accept a 2D array as input for predictions? 【发布时间】:2019-05-22 16:38:42 【问题描述】:

所以我制作了一个混合数据类型的模型,并使用了 SK Learn Docs 中推荐的示例,使用列转换器来构建分类器。

https://scikit-learn.org/stable/auto_examples/compose/plot_column_transformer_mixed_types.html#sphx-glr-auto-examples-compose-plot-column-transformer-mixed-types-py

由于输入来自 csv,并被转换为 Pandas 数据帧,因此 X_test、X_train、y_test、y_train 看起来也都是数据帧。将 y_test 传递给 clf.predict() 函数工作正常,我收到了预测。

但是,我想托管此模型 Google 云 ML 引擎,它在预测请求 API 中接受 2D 实例数组。如何让我的分类器适应并接受输入数组而不是数据框?我意识到这可能相当琐碎,但很难找到解决方案。

【问题讨论】:

传递一个 numpy 数组有效吗?如果是这样,并且您从 DataFrame df 开始,那么只需传递 df.values。如果您需要 python 原生 2D 列表,df.values.tolist()。我对 Google ML Cloud 不熟悉,所以也许这完全没有意义。 【参考方案1】:

要使您的分类器与 Google Cloud Machine Learning Engine (CMLE) 兼容,您需要从管道中分离出预处理器和 LogisticRegression 分类器。您将需要执行预处理逻辑客户端,并且独立分类器将托管在 CMLE 上。

在读取 csv 文件并定义数字和分类转换器后,您需要修改训练代码如下:

...

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])
model = LogisticRegression(solver='lbfgs')

X_train_transformed = preprocessor.fit_transform(X_train)
model.fit(X_train_transformed, y_train)
print("model score: %.3f" % model.score(preprocessor.transform(X_test), y_test))

您可以导出模型(使用 pickle 或 joblib)并将其部署到 CMLE。在构建对 CMLE 进行预测的 json 请求时,您首先需要使用 preprocessor.transform(X_test) 将数据帧预处理为二维数组。

【讨论】:

以上是关于如何让 SK Learn 分类器接受 2D 数组作为预测的输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sk-learn 管道中使用我自己的自定义函数?

scikit-learn 虚拟分类器的理论基础是啥?

无法让 NLTK-Trainer 识别/使用 scikit-learn 分类器

scikit_learn分类器详解

Scikit-Learn 中的分类数据转换

Python scikit-learn SVM 分类器“ValueError:找到昏暗 3 的数组。预期 <= 2”