含正负值数据集归一化至0-1后预测不佳,求保留正负值的优化方案
问题背景
我手头的数据集包含正负值,用MinMaxScaler归一化到0-1区间后预测效果很差;但把负值转成绝对值后再归一化,效果有明显提升。我希望在保留原始数据正负属性的前提下,让模型获得同样好的预测表现。
当前模型最后一层用Sigmoid激活,结构如下:
model = Sequential() model.add(LSTM(64, activation='relu', return_sequences=False, input_shape=(50,89))) model.add(Dense(32, activation='relu')) model.add(Dense(16, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mse', optimizer=Adam(learning_rate=0.002), metrics=['mse']) model.summary()
两种归一化方式的代码
用abs()处理负值的归一化代码
df = pd.read_csv('1113_Rwalk40s1.csv', low_memory=False) columns = ['Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'] selected_df = df[columns] FCDatas = selected_df[:2050] FCDatas = abs(FCDatas) SmartInsole = np.array(SIData[:2050]) FCData = np.array(FCDatas) Dataset = np.concatenate((SmartInsole, FCData), axis=1) scaler_in = MinMaxScaler(feature_range=(0, 1)) scaler_out = MinMaxScaler(feature_range=(0, 1)) data_scaled_in = scaler_in.fit_transform(Dataset[:,0:89]) data_scaled_out = scaler_out.fit_transform(Dataset[:,89:90])
注:该方式下模型预测效果更优
未用abs()的原始归一化代码
df = pd.read_csv('1113_Rwalk40s1.csv', low_memory=False) columns = ['Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'] selected_df = df[columns] FCDatas = selected_df[:2050] SmartInsole = np.array(SIData[:2050]) FCData = np.array(FCDatas) Dataset = np.concatenate((SmartInsole, FCData), axis=1) scaler_in = MinMaxScaler(feature_range=(0, 1)) scaler_out = MinMaxScaler(feature_range=(0, 1)) data_scaled_in = scaler_in.fit_transform(Dataset[:,0:89]) data_scaled_out = scaler_out.fit_transform(Dataset[:,89:90])
注:该方式下模型预测效果较差
针对性解决建议
替换归一化策略:MinMaxScaler(0,1)会把正负值压缩到0-1区间,丢失了原本的正负分布信息。可以试试:
- StandardScaler:将数据标准化为均值0、方差1,完整保留正负分布,适合带正负值的序列数据;
- MinMaxScaler(feature_range=(-1,1)):直接把数据归一化到-1到1区间,既做了缩放,又保留正负属性。
调整激活函数:
- 最后一层用Sigmoid会限制输出在0-1,但如果目标变量本身有正负,换成Tanh(输出-1到1)或Linear(无限制输出)更匹配,MSE损失同样适用;
- 前面的ReLU激活会直接丢弃负值梯度,换成LeakyReLU或ELU,保留部分负向信息,帮助模型学习正负差异。
优化特征处理:
- 对带正负值的特征单独做归一化/标准化,再和其他特征拼接,避免其他特征的分布干扰正负特征的表达;
- 新增二分类特征:给每个样本加一列标记(1为正,0为负),和原始特征一起输入,强化模型对正负属性的感知。
微调模型结构:
- 把LSTM的
return_sequences=True,叠加一层LSTM,让模型捕捉更长序列中的正负变化规律; - 加入Dropout层(如
model.add(Dropout(0.2)))抑制过拟合,提升模型泛化能力。
- 把LSTM的
内容的提问来源于stack exchange,提问作者lead step
相关产品推荐
相关产品推荐

