深度学习模型训练异常:R²值为负,预测值偏离范围求助
深度学习回归模型训练异常问题排查与解决
核心问题根源
你的深度学习模型无法收敛、训练集预测值离谱且R²为负,核心并非问题不适合深度学习,而是训练流程存在关键疏漏。对比线性回归的表现,以下几点是主要诱因:
- 数据预处理不到位:线性回归对特征尺度不敏感,但深度学习(尤其是带ReLU激活、梯度类优化器的模型)对输入数据的尺度差异极其敏感。你提到做了归一化,但代码未体现规范的特征/目标变量缩放,这会导致梯度爆炸或震荡,模型无法学到有效参数。
- 优化器学习率设置过高:RMSprop的学习率0.01在未归一化的数据上过大,会让模型参数在训练过程中剧烈震荡,无法收敛到合理值。
- 训练过程无监控:
verbose=0导致你看不到训练时的loss变化,无法及时发现模型根本没在收敛的问题。
具体修复步骤
1. 强制标准化特征与目标变量
必须将所有特征和目标变量缩放到相近范围(如均值0、方差1的标准分布),同时用Pipeline封装流程避免交叉验证的数据泄露:
import pandas as pd import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from scikeras.wrappers import KerasRegressor from sklearn.model_selection import cross_val_score, KFold from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline var='target' matrixpd = pd.read_csv('data.csv', index_col=0) md=matrixpd[var] matrixpd = matrixpd.drop(columns=var) def build_model(): model = keras.Sequential([ layers.Dense(16, activation='relu', input_shape=[len(matrixpd.keys())]), layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) # 降低学习率至合理范围 model.compile(loss='mse', optimizer=optimizer, metrics=['mae', 'mse']) return model # 用Pipeline封装特征缩放与模型,确保交叉验证时不泄露测试集数据 pipeline = Pipeline([ ('scaler', StandardScaler()), # 对特征做标准化处理 ('regressor', KerasRegressor(model=build_model, epochs=100, verbose=1)) # 打开verbose监控训练过程 ]) kfold = KFold(n_splits=3) results = cross_val_score(pipeline, matrixpd, md, cv=kfold, scoring='r2') print("R2: %.2f (%.2f)" % (results.mean(), results.std()))
2. 监控训练过程
将verbose=1打开后,观察训练时的loss变化:
- 如果loss持续下降,说明模型在收敛;
- 如果loss上下波动甚至持续上升,需继续降低学习率(如调整至0.0001)。
3. 可选优化:添加批量归一化
若特征维度多、尺度差异大,可在网络中加入BatchNormalization层稳定训练:
def build_model(): model = keras.Sequential([ layers.Dense(16, activation='relu', input_shape=[len(matrixpd.keys())]), layers.BatchNormalization(), # 加入批量归一化,稳定训练过程 layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae', 'mse']) return model
关于深度学习的适用性
这个问题完全适合用深度学习解决:线性回归效果好说明数据存在强线性相关性,而深度学习可以轻松拟合线性关系,甚至能捕捉潜在的非线性模式。只要修正训练流程中的疏漏,深度学习的表现至少不会弱于线性模型,在数据规模扩大、特征间存在非线性交互时还会更优。
内容的提问来源于stack exchange,提问作者Igbin
相关产品推荐
相关产品推荐

