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

如何提升ANN模型的R²分数?解决R²为负的问题

解决方案

1. 修正输出层激活函数(核心问题)

你的任务是回归任务(预测连续数值),但输出层使用了sigmoid激活函数——该函数会将输出强制限制在0-1区间,完全不符合午后臭氧浓度的连续数值特性,这是导致R²为负的核心原因。
将输出层改为无激活函数(等价于activation='linear'):

model.add(layers.Dense(units=1))  # 移除sigmoid激活

2. 移除无关的评估指标

accuracy是分类任务的评估指标,对回归任务毫无意义,会干扰训练状态的判断,编译模型时删除该指标:

model.compile(loss='mse', optimizer='adam')

3. 排查数据处理漏洞

  • 类别特征处理:原始特征包含“区域”,如果这是类别型数据(比如字符串或离散编码),直接放入标准化的数值特征中会导致模型学习错误规律。需先对“区域”做独热编码(pd.get_dummies())或标签编码,再执行标准化。
  • 特征完整性检查:确认X的选择是否覆盖了所有需要的特征(比如你选的是列0、1、3、4、5,是否遗漏了某个关键特征?)。
  • 目标变量尺度:如果午后臭氧浓度数值范围极大,可考虑对y做标准化处理,但需注意:仅用训练集拟合scaler,再转换测试集;预测后需反转换回原始尺度,再计算R²。
  • 数据集分布一致性:检查训练集与测试集的特征、目标变量分布是否一致,避免因随机划分导致的分布偏移(可通过绘制直方图、箱线图验证)。

4. 优化模型结构与训练策略

  • 提升模型容量:当前仅1个隐藏层且神经元数量与输入维度一致,模型拟合能力不足。可尝试增加隐藏层和神经元数量:
    model = Sequential()
    model.add(layers.Dense(16, input_dim=5, activation='relu'))
    model.add(layers.Dense(8, activation='relu'))
    model.add(layers.Dense(1))
    
  • 增加训练轮次并加入早停:15个epoch不足以让模型收敛,尝试设置50-200轮,同时用早停机制防止过拟合:
    from tensorflow.keras.callbacks import EarlyStopping
    early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
    model.fit(X_train, y_train, epochs=200, validation_split=0.2, callbacks=[early_stop])
    
  • 调整学习率:默认Adam学习率可能不匹配你的数据,可尝试微调(比如optimizer=Adam(learning_rate=0.0001)),观察训练损失的下降趋势。

5. 建立基准对比

先计算基准模型的R²:用训练集y_train的平均值作为所有测试样本的预测值,计算该基准的R²。如果你的模型连这个基准都不如,说明模型完全没有学到数据规律,需回到数据预处理和模型结构的基础排查。


内容的提问来源于stack exchange,提问作者여시형

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:35:23