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

Keras三输出回归模型仅单输出准确的技术求助

解决多输出回归模型精度不均衡问题的实战方案

嘿,我看你遇到了多输出回归模型的典型问题——三个输出精度差异巨大,还被错误的评估指标误导了,咱们一步步来拆解解决:

先纠正核心误区:回归模型别用accuracy!

你代码里用metrics=['accuracy']完全是用错了指标!accuracy是分类任务专属的评估指标,用来衡量预测类别和真实类别匹配的比例,对回归任务(预测连续数值)来说毫无意义,你看到的65%精度根本反映不了模型的真实性能。回归任务应该用mean_squared_error(MSE)、mean_absolute_error(MAE)这类指标,它们能准确衡量预测值和真实值的偏差程度。

输出层激活函数选错了

你最后一层用了relu激活函数,relu的输出范围是[0, +∞),但回归任务的输出(等效冰荷载)可能是任意实数,而且如果三个输出的数值分布差异明显,relu会截断模型的输出能力,导致部分输出无法被准确拟合。回归任务的输出层应该用线性激活(linear),也就是Keras默认的激活函数,不需要额外指定。

损失函数与数据分布不匹配

你用了mean_squared_logarithmic_error,这个损失对大于1的数值更敏感,如果三个输出的量级差异很大(比如第一个输出是100,第三个是0.1),模型会自动优先拟合数值大的输出,忽略小数值的输出。建议换成mean_squared_error(MSE)或者mean_absolute_error(MAE),如果输出量级差异明显,必须先做数据归一化/标准化!

关键解决步骤:数据预处理(精度不均衡的核心解药)

三个输出精度差异大的最常见原因就是输出变量的量级差异过大,模型会自动优先拟合误差权重更高的大数值输出。所以必须对输入和输出都做标准化处理:

  • 用StandardScaler将数据转换为均值0、方差1的分布,或者用MinMaxScaler缩放到[0,1]区间
  • 注意:训练集和测试集要用同一个scaler拟合转换,避免数据泄露

训练策略优化

你设置了100000轮训练,这肯定会导致严重过拟合!应该加上**早停(EarlyStopping)**回调,当验证集损失不再下降时自动停止训练,同时保存最优权重,避免无效训练和过拟合。


修改后的完整代码示例

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping

seed = 9
np.random.seed(seed)

# 导入数据集
dataset = np.loadtxt("Final_test_matrix_new_3_digits.csv", delimiter=",")
Y = dataset[:, 0:3]
X = dataset[:, 3:5]

# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)

# 数据标准化处理
scaler_X = StandardScaler()
scaler_Y = StandardScaler()

X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)

Y_train_scaled = scaler_Y.fit_transform(Y_train)
Y_test_scaled = scaler_Y.transform(Y_test)

# 创建模型
model = Sequential()
model.add(Dense(12, input_dim=2, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(8, activation='relu'))
# 回归任务输出层用线性激活
model.add(Dense(3, activation='linear'))

# 编译模型:用MSE作为损失,搭配回归专属指标
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error', 'mean_absolute_error'])

# 回调函数:保存最优权重 + 早停防止过拟合
filepath = "weights.best_12_8_8_neurons.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_mean_squared_error', verbose=1, save_best_only=True, mode='min')
early_stop = EarlyStopping(monitor='val_mean_squared_error', patience=50, restore_best_weights=True, verbose=1)
callbacks_list = [checkpoint, early_stop]

# 训练模型
history = model.fit(X_train_scaled, Y_train_scaled, validation_split=0.1, epochs=10000, batch_size=32, callbacks=callbacks_list)

# 评估模型
scores = model.evaluate(X_test_scaled, Y_test_scaled)
print(f"测试集MSE: {scores[1]:.4f}, MAE: {scores[2]:.4f}")

# 预测并转换回原始尺度,方便对比真实值
Y_pred_scaled = model.predict(X_test_scaled)
Y_pred = scaler_Y.inverse_transform(Y_pred_scaled)
# 可以单独计算每个输出的MSE/MAE,查看各输出的精度
for i in range(3):
    output_mse = np.mean((Y_pred[:,i] - Y_test[:,i])**2)
    print(f"第{i+1}个输出的MSE: {output_mse:.4f}")

额外优化建议

  1. 训练完成后,单独计算每个输出的MSE/MAE,这样就能精准看到每个输出的精度表现
  2. 如果调整后仍有输出精度低,可以尝试调整模型结构:比如增加神经元数量、添加Dropout层防止过拟合、换用不同的优化器(比如SGD+动量)
  3. 检查数据集:看看第三个输出的数据是否存在缺失、异常值,或者和输入变量的相关性极低,如果数据本身没有规律,模型也无法拟合

内容的提问来源于stack exchange,提问作者pantelis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:55:10