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

构建深度神经网络时MAE值偏高的原因及优化咨询

回归任务DNN超参数优化:MAE指标优化方向

问题背景

使用深度神经网络进行年龄回归任务,同一数据集下训练得到的MAE为5-7,但文献中该指标范围在0.9-5之间。数据情况:

  • X为865432行特征、134列样本,按与Y(年龄,浮点型)的皮尔逊相关系数降序排列,特征值范围0-1;
  • 特征数远多于样本数,已选取Top40000特征,但不知如何将特征选择融入训练流程。

训练代码如下:

#!/usr/bin/env python3

import numpy as np
import pandas as pd
import os

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

from scikeras.wrappers import KerasRegressor
import keras.losses
from keras import backend as K
import keras_tuner as kt
from keras_tuner.tuners import RandomSearch

from sklearn.model_selection import cross_val_score

def dynamic_model(hp):
    # hyperparameters (independent of number of layers)
    # Number of hidden layers: 1 - 50
    hp_num_layers = hp.Int("num_layers", 2, 10)
    hp_learning_rate = hp.Choice("learning_rate", values=[1e-2, 1e-3, 1e-4])    
    
    # Initialize sequential API and start building model.
    model = keras.Sequential()
    model.add(keras.layers.InputLayer(input_shape=(CpG_num,)))
        
    # Tune the number of hidden layers and units in each
    for i in range(1, hp_num_layers):
        
        # hyperparameters (dependent on num_layers):
        hp_units = hp.Int(f"units_{i}", min_value=100, max_value=400, step=100)
        hp_dropout_rate = hp.Float(f"dropout_{i}", 0, 0.5, step=0.1)
        hp_activation = hp.Choice(f"act_{i}", ['LeakyReLU', 'PReLU'])            
        
        model.add(
            keras.layers.Dense(units=hp_units, kernel_initializer='normal', activation=hp_activation)
        )
        model.add(keras.layers.Dropout(hp_dropout_rate))
    
    # Add output layer
    model.add(keras.layers.Dense(units=1, kernel_initializer='normal'))
    
    # Define optimizer, loss, and metrics
    model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
        loss=loss_function, 
        metrics=metrics
    )
    
    return model

def correlation_coefficient_loss(y_true, y_pred):
    x = y_true
    y = y_pred
    mx = K.mean(x)
    my = K.mean(y)
    xm, ym = x-mx, y-my
    print(type(mx))
    r_num = K.sum(tf.multiply(xm,ym))
    r_den = K.sqrt(tf.multiply(K.sum(K.square(xm)), K.sum(K.square(ym))))
    r = r_num / r_den
    r = K.maximum(K.minimum(r, 1.0), -1.0)
    return (1 - K.square(r))

loss_function = 'mae'
metrics = ['mae', correlation_coefficient_loss]
scoring_function = 'neg_mean_absolute_error'
tuner_kind = 'random'
results_dir = '../tmp_files/Grid_Search_results/'+name+tuner_kind
hp = kt.HyperParameters()

if tuner_kind == 'random':
    tuner = kt.RandomSearch(
        dynamic_model,
        objective = 'mae',
        overwrite=True,
        directory = results_dir,
        project_name = 'random_tuner_trials',
        max_trials = 500
    )

tuner.search(
    X1[name],Y1[name], 
    epochs=50, 
    validation_data=(X2[name],Y2[name]),
)

best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
best_hps_model = dynamic_model(best_hps)
best_hps_model.fit(X1_train[name],y1_train[name],validation_data=(X2_train[name],y2_train[name]), epochs=500, batch_size=10)

优化方向

一、特征选择与维度优化

  • 嵌入式特征选择融入训练:在Dense层添加L1正则化(kernel_regularizer=keras.regularizers.L1(1e-5)),让模型自动稀疏化特征权重,过滤无效特征;或用sklearn.feature_selection.SelectFromModel结合线性回归、XGBoost等简单模型,动态筛选与Y相关性高的特征。
  • 压缩特征维度:尝试PCA降维保留80%-90%的方差,或用自编码器做无监督降维,将高维特征压缩到低维空间后再输入DNN;同时可过滤方差接近0的冗余特征。
  • 调整特征数量:当前40000特征远多于134个样本,可逐步减少特征数量(如Top1000、Top5000),测试不同特征规模下的MAE变化,找到最优维度平衡点。

二、模型结构与训练策略优化

  • 降低模型复杂度:样本量极小,当前最多10层的模型易过拟合,可尝试1-3层隐藏层,每层32-128个单元;同时加入L2正则(kernel_regularizer=keras.regularizers.L2(1e-4))增强约束。
  • 优化训练流程:
    • 在tuner.search中加入EarlyStopping(监控验证集MAE,patience设为10-15),同时将搜索阶段epoch增加到100-200,保证模型收敛;
    • 调整batch_size为32或64,让每个batch包含更多样本信息,稳定训练过程;
    • 尝试AdamW(带权重衰减的Adam)或SGD带动量,提升正则化效果。
  • 损失函数调整:可尝试MAE与自定义相关系数损失的加权混合,同时删除自定义损失中的print(type(mx))避免冗余输出;也可测试MSE作为损失,观察拟合效果变化。

三、数据预处理与验证策略优化

  • 标准化处理:虽然特征已在0-1区间,仍可尝试Z-score标准化(均值为0、方差为1),帮助模型更快收敛。
  • 强化验证策略:改用5折或10折交叉验证,替代简单的训练-验证划分,避免样本划分差异导致的结果波动;可在tuner.search中加入cv参数实现。

四、代码细节修正

  • 修复自定义损失:在r_den计算中加入极小epsilon(如+1e-8),避免除以0的异常;删除print(type(mx))减少训练开销。
  • 调整超参数范围:将学习率扩展到1e-5,Dropout率范围调整为0.1-0.6,覆盖更多正则化场景。
  • 补全未定义变量:确保CpG_num等于所选特征数量(如40000),name变量取值正确,避免路径或输入维度错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:31:05