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

如何解决FastAI表格数据模型的过拟合问题?

问题描述

基于特定特征构建了一个使用fastai表格学习器的预测模型,数据集约300条记录,已划分训练集、验证集和测试集。已尝试早停、权重衰减解决过拟合,调整学习率、批量大小等超参数,但模型在未见数据上仍存在过拟合问题。怀疑模型架构或预处理流程存在问题,但不知从何排查。无法提供数据集和任务细节,可分享预处理和模型结构。

训练输出

epochtrain_lossvalid_lossaccuracytime
00.7527070.5795010.77611900:00
10.6992700.8337710.77611900:00
20.6524380.5982430.79104500:00
30.6210833.8893980.77611900:00
40.5913480.6323660.79104500:00
50.5805826.6703140.79104500:00

No improvement since epoch 2: early stopping

预处理代码(特征构建部分无法披露)

features字典定义了每个特征的有效值范围和权重(对应下方normalize函数中的feature、range_和weight)。

def custom_normalize(df, feature, range_, weight):
    df[feature] = normalize(df[feature], range_)
    df[feature] = df[feature] * weight
    return df

splits = RandomSplitter(valid_pct=0.2)(range_of(df))

procs = [Categorify, FillMissing]

for feature, info in features.items():
    # 训练时确定选取值的范围
    procs.append(partial(custom_normalize, feature=feature, range_=info['range'], weight=info['weight']))

模型构建与训练流程

to = TabularPandas(df, procs=procs,
                   cat_names = cat_vars,
                   cont_names = cont_vars,
                   y_names=dep_var,
                   splits=splits)

dls = to.dataloaders(bs=64)

early_stop = EarlyStoppingCallback(monitor='accuracy', min_delta=0.01, patience=3)

learn = tabular_learner(dls, metrics=accuracy, wd=0.1)
learn.lr_find()

# 绘制学习率曲线
learn.recorder.plot_lr_find()

# 根据曲线选择学习率
lr = learn.recorder.lrs[np.argmin(learn.recorder.losses)]

learn.fit_one_cycle(15, lr, cbs=early_stop)
learn.show_results()

# 仅在模型不存在时保存
# TODO 用条件包裹保存逻辑,避免覆盖已有模型
if not os.path.exists(model_fname):
    learn.save(model_fname)

排查与解决建议

1. 数据集规模与划分优化

  • 300条记录属于小规模数据集,单一随机划分的验证集样本量不足,无法准确反映模型泛化能力。改用5折交叉验证,通过多次划分取平均指标,更可靠评估模型表现。
  • 检查划分逻辑:若任务是时间序列类,不能用RandomSplitter随机划分,必须按时间顺序分割,避免数据泄露。

2. 预处理环节排查

  • 移除自定义加权逻辑:手动给特征加权可能放大个别特征的影响,导致模型过度依赖。先去掉df[feature] = df[feature] * weight这一步,仅保留归一化,观察模型表现;若必须加权,需基于训练集统计结果(如特征与目标的相关性)确定权重,而非主观赋值。
  • 修正归一化范围计算:确保range_是从训练集单独统计得到的,不能用全数据集的范围,否则会导致验证集/测试集的信息泄露。建议替换自定义归一化为fastai内置的Normalize proc,它会自动基于训练集计算归一化参数。
  • 精简特征数量:若特征数量超过样本量的1/10(比如超过30个),容易出现维度灾难。用特征重要性、互信息等方法筛选核心特征,减少输入维度。

3. 模型架构与训练策略调整

  • 简化模型结构:fastai默认的tabular learner隐藏层规模可能过大,针对小数据集,缩小隐藏层维度或减少层数:
    learn = tabular_learner(dls, metrics=accuracy, wd=0.1, layers=[64, 32])
    
  • 调整早停策略:当前监控accuracy且min_delta=0.01过于严格,验证集准确率波动大时易误触发。改为监控valid_loss,并将patience调至2,更早停止训练避免过拟合:
    early_stop = EarlyStoppingCallback(monitor='valid_loss', min_delta=0.05, patience=2)
    
  • 优化权重衰减:当前wd=0.1可尝试增大至0.2或0.5,同时开启wd_bn_bias=False,仅对权重应用衰减,避免影响偏置和BN层参数:
    learn = tabular_learner(dls, metrics=accuracy, wd=0.2, wd_bn_bias=False)
    
  • 调整学习率选择:lr_find取损失最低点的学习率可能偏大,改为选择损失曲线下降最陡点对应的学习率(通常是最低点的1/10左右),降低训练时的震荡。
  • 尝试基准模型:先用逻辑回归、决策树等传统模型做基准,若传统模型也过拟合,说明问题出在数据或特征;若传统模型泛化性好,再回到深度学习模型调整结构。

4. 过拟合诊断补充

  • 绘制训练/验证损失曲线,直观观察两者的差距变化,确认过拟合的趋势。
  • 提取特征重要性:通过learn.model查看各特征的权重,排查是否有个别特征权重过高,导致模型过度依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:34:52