在Keras LSTM模型中使用RobustScaler的缩放正确性及逆变换问题
问题1:缩放方法的正确性
- 核心逻辑是合理的:RobustScaler基于分位数计算缩放参数,不受异常值影响,非常适合你带异常值的时序数据场景;且你严格遵守了「只在训练集拟合缩放器,测试集仅做变换」的原则,不会出现数据泄露问题。
- 代码存在冗余瑕疵:你已经通过
scaler = RobustScaler().fit(train)完成了缩放器拟合,后续scaler.fit_transform(train)重复执行了拟合操作,虽然两次拟合都用训练集,结果不会出错,但可以优化为直接调用scaler.transform(train),避免重复计算。
问题2:预测值逆变换的实现方法
你无法直接逆变换的核心原因是:RobustScaler的inverse_transform方法要求输入的特征维度必须和拟合时输入的训练集特征维度完全一致,但你提取的y仅包含前12维特征,维度不匹配导致报错。
你可以通过构造补全维度的方法完成逆变换,步骤和代码如下:
# 1. 获取缩放器拟合时的总特征数 full_feature_count = scaler.n_features_in_ # 2. 处理预测值的逆变换 # 构造和全维度匹配的空矩阵,非预测特征位的填充值不影响目标特征的逆变换结果 y_hat_full = np.zeros((y_hat.shape[0], full_feature_count)) # 将预测值填入对应列(你这里是前12列) y_hat_full[:, :12] = y_hat # 逆变换后提取目标列,得到原始尺度的预测值 y_hat_original = scaler.inverse_transform(y_hat_full)[:, :12] # 3. 同理处理真实标签y_test,用于后续对比 y_test_full = np.zeros((y_test.shape[0], full_feature_count)) y_test_full[:, :12] = y_test y_test_original = scaler.inverse_transform(y_test_full)[:, :12]
如果你的预测特征不是前12列,只需要把上述代码中的列索引修改为对应特征的原始位置即可。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

