使用ColumnTransformer来预测值



我目前正在使用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列,而预测的转换只给出" is"的输出。如果Var2的值为" ">

如何解决这个问题?

当我运行模型时,我得到这个错误。预测单个客户示例:

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来适配管道。这在您的案例中是一个问题,原因有两个:

  • 你正在重新拟合StandardScaler,这意味着你将缩放你的特征不同于你对训练集所做的。
  • 您正在重新装配OneHotEncoder。因此,您可能会错过cat_variables中只存在于列车集中的一些类别。因此,你的输出形状更小。

直接使用.transform(X_train)

最新更新