使用 ColumnTransformer 预测值

using ColumnTransformer for predicting values

我目前正在使用 keras 运行建立逻辑回归模型。

我有 1 个数值变量和大约 6 个分类变量。

我目前正在使用列转换器来训练和测试模型,它运行良好(代码如下所示):

numeric_variables = ["var1"]
cat_variables = ["var2","var3","var4","var5","var6","var7"]

pipeline = ColumnTransformer([('num',StandardScaler(), numeric_variables), ('cat',OneHotEncoder(handle_unknown = "ignore"), cat_variables)], remainder = "passthrough")

pipeline.fit(X_Train)

pipeline.fit_transform(X_Train)

当我 运行 训练和测试数据集时,这非常有效。

但是,当我部署模型以获得客户续订的可能性时,我将数据作为一行数据框发送。

虽然 X_Train 和 X_Test 的 fit_transform 给出了一个 nx17 数组(因为 7 个因子的单热编码),预测的变换只给出了 nx7。

我的理论是管道正在丢弃一个热编码字段。例如,如果 var2 可以取 3 个值(例如“M”、“F”和“O”),则 X_Train 为每个值(isM、isF 和 isO)给出 3 列,而预测的变换是如果 Var2 的值为“M”

,则仅给出“isM”的输出

我该如何解决这个问题?

我在 运行 单个客户示例中 model.predict 时收到此错误:

Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 19), found shape=(None, 7)

经过评论讨论:

您似乎正在使用 pipeline.fit_transform(X_test)。这意味着您在转换管道之前将其与 X_test 相匹配。这是您的问题,原因有二:

  • 你是 re-fitting StandardScaler,这意味着你将以不同于你对训练集所做的方式缩放你的特征。
  • 你是re-fitting OneHotEncoder。因此,您可能会错过 cat_variables 中仅存在于训练集中的某些类别。因此,您的输出形状更小。

只需使用 .transform(X_train) 即可。