我目前正在使用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)
。