如何将特征归一化整合到Keras回归模型中,适配未知测试数据?
嘿,我来帮你把StandardScaler的缩放逻辑整合到Keras模型里,这样你以后用模型的时候直接喂原始数据就行,不用再单独处理缩放啦!
解决方案:将缩放层整合到Keras模型中
核心思路是把StandardScaler的缩放逻辑作为一个自定义层添加到模型的最前端,这样训练好的模型会自动对输入数据应用和训练集完全一致的缩放规则。
步骤1:补全基础代码并定义带缩放层的模型
先保留你原本的数据拆分与缩放逻辑,然后修改模型构建函数,加入实现缩放的Lambda层:
# 补全所需导入 from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 数据拆分与缩放(先完成scaler的拟合,拿到训练集的均值和标准差) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) sc = StandardScaler() X_train_scaled = sc.fit_transform(X_train) X_test_scaled = sc.transform(X_test) # 修改模型构建函数,加入缩放层 def build_model(scaler_mean, scaler_scale): model = keras.Sequential([ # 用Lambda层实现StandardScaler的缩放公式:(x - mean) / scale layers.Lambda(lambda x: (x - scaler_mean) / scaler_scale, input_shape=[X_train.shape[1]]), layers.Dense(64, activation=tf.nn.relu), layers.Dense(64, activation=tf.nn.relu), layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['mean_absolute_error', 'mean_squared_error']) return model # 传入训练好的scaler参数构建模型 model = build_model(sc.mean_, sc.scale_)
步骤2:训练并保存整合后的模型
接下来正常训练模型,注意这里可以直接喂原始的X_train(模型内部会自动完成缩放),训练完成后保存为.hdf5文件:
EPOCHS = 1000 history = model.fit(X_train, y_train, epochs=EPOCHS, validation_split=0.2, verbose=0) # 保存整合了缩放逻辑的完整模型 model.save('scaled_regression_model.hdf5')
步骤3:加载模型并处理未知数据
之后加载模型时,直接喂原始的测试/未知数据即可,模型会自动应用和训练集一致的缩放规则,不需要再单独调用sc.transform():
# 加载保存的模型 loaded_model = tf.keras.models.load_model('scaled_regression_model.hdf5') # 直接用原始X_test评估模型 loss, mae, mse = loaded_model.evaluate(X_test, y_test, verbose=0) print(f"测试集MAE: {mae:.2f}, MSE: {mse:.2f}") # 对未知原始数据预测 # y_pred = loaded_model.predict(unknown_raw_feature_data)
关键说明
StandardScaler的核心逻辑就是(输入数据 - 训练集均值) / 训练集标准差,我们把这个计算逻辑固化到模型的第一层,确保推理时的预处理和训练时完全一致,避免了手动同步缩放参数的出错风险。
内容的提问来源于stack exchange,提问作者Malathi
相关产品推荐
相关产品推荐

