You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

深度学习模型训练异常:R²值为负,预测值偏离范围求助

深度学习回归模型训练异常问题排查与解决

核心问题根源

你的深度学习模型无法收敛、训练集预测值离谱且R²为负,核心并非问题不适合深度学习,而是训练流程存在关键疏漏。对比线性回归的表现,以下几点是主要诱因:

  1. 数据预处理不到位:线性回归对特征尺度不敏感,但深度学习(尤其是带ReLU激活、梯度类优化器的模型)对输入数据的尺度差异极其敏感。你提到做了归一化,但代码未体现规范的特征/目标变量缩放,这会导致梯度爆炸或震荡,模型无法学到有效参数。
  2. 优化器学习率设置过高:RMSprop的学习率0.01在未归一化的数据上过大,会让模型参数在训练过程中剧烈震荡,无法收敛到合理值。
  3. 训练过程无监控: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:17:06