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

基于TF Keras的线性回归模型效果差,求优化方案与调参建议

加州房价预测模型优化问题及解决方案

问题描述

我是TensorFlow与深度学习新手,尝试使用Colab中sample_data文件夹内的california_housing_train.csv数据集,选取housing_median_age、total_bedrooms、population三个特征,预测median_house_value。但无论如何调整,模型效果都极差,R²值为负。

我已尝试增加epoch数、调整学习率、更换损失函数与优化器、修改网络层数,但均无明显改善。希望得到模型优化方向,以及模型构建时参数选择的通用建议。

附代码及训练日志

代码

import pandas as pd
import matplotlib as plt
import numpy as np
import tensorflow as tf

from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

df = pd.read_csv('/content/sample_data/california_housing_train.csv')
X = df[['housing_median_age', 'total_bedrooms', 'population']]
y = df['median_house_value']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

# Normalizing Layer
train = np.array(X_train)
normalizer = tf.keras.layers.Normalization(input_shape=[3,], axis=None)
normalizer.adapt(train)

# Creating Model
model = tf.keras.Sequential([normalizer,
                             tf.keras.layers.Dense(32, activation=tf.nn.relu),
                             tf.keras.layers.Dense(64, activation=tf.nn.relu),
                             tf.keras.layers.Dense(32, activation=tf.nn.relu),
                             tf.keras.layers.Dense(1, activation='linear')])

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=0.3),
              loss="mean_absolute_error")
model.fit(X_train, y_train, batch_size=16, epochs=10, 

validation_split=0.3)

y_pred = model.predict(X_test)

# R2 Score (Aim to get a better r2 score, but keep getting -ve)
r2 = r2_score(y_test, y_pred)
print(r2)

训练日志

Epoch 1/10
595/595 [==============================] - 2s 3ms/step - loss: 96617.8047 - val_loss: 89414.4844
Epoch 2/10
595/595 [==============================] - 1s 2ms/step - loss: 92717.9062 - val_loss: 95228.3125
Epoch 3/10
595/595 [==============================] - 1s 2ms/step - loss: 90894.2812 - val_loss: 87268.4453
Epoch 4/10
595/595 [==============================] - 1s 2ms/step - loss: 91260.7578 - val_loss: 89836.5312
Epoch 5/10
595/595 [==============================] - 2s 3ms/step - loss: 89796.4375 - val_loss: 87359.7188
Epoch 6/10
595/595 [==============================] - 2s 4ms/step - loss: 89364.0000 - val_loss: 87501.6641
Epoch 7/10
595/595 [==============================] - 1s 2ms/step - loss: 89179.9922 - val_loss: 89818.0156
Epoch 8/10
595/595 [==============================] - 1s 2ms/step - loss: 88969.0312 - val_loss: 98786.2031
Epoch 9/10
595/595 [==============================] - 1s 2ms/step - loss: 89250.4531 - val_loss: 86751.1172
Epoch 10/10
595/595 [==============================] - 2s 3ms/step - loss: 88562.3828 - val_loss: 87661.0703
107/107 [==============================] - 0s 1ms/step
-0.04170347420320697

优化方向与通用建议

1. 核心问题:学习率过高

你的Adam优化器学习率设为0.3,远超出合理范围(Adam默认是0.001)。过大的学习率会导致参数更新时剧烈震荡,模型无法收敛到最优解,这是R²为负的主要原因。建议先把学习率降到0.001,效果不佳时再微调(比如0.0005或0.005)。

2. 特征工程优化

  • 扩充特征:仅用3个特征不足以捕捉房价的复杂规律,建议加入median_income(该数据集最核心的预测特征)、total_rooms、households等字段。
  • 处理缺失值:total_bedrooms存在缺失值,需用均值/中位数填充或删除缺失样本。
  • 构造衍生特征:尝试生成比例类特征,比如bedroom_per_room = total_bedrooms / total_rooms、people_per_household = population / households,这类特征比原始计数特征更有预测价值。

3. 模型结构调整

  • 简化模型:当前3层隐藏层对于小数据集和简单任务过于复杂,易过拟合。先从1-2层隐藏层开始,每层神经元数设为8-16个,再逐步增加复杂度。
  • 目标值缩放:房价数值范围大(最高50万),可以用StandardScaler对y做标准化处理,训练后再反转换回原始尺度,降低模型训练的数值压力,加快收敛。

4. 训练策略优化

  • 增加训练轮数:10个epoch太少,降低学习率后至少训练50-100个epoch,同时加入早停回调避免过拟合:
    from tensorflow.keras.callbacks import EarlyStopping
    early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
    model.fit(..., callbacks=[early_stop])
    
  • 调整批大小:批大小16偏小,建议尝试32或64,平衡训练稳定性和速度。
  • 更换损失函数:回归任务中mean_squared_error(MSE)比MAE更常用,对大误差惩罚更重,有助于降低显著偏差。

5. 评估与验证优化

  • 交叉验证:仅用validation_split=0.3易受数据划分偶然性影响,建议用K折交叉验证确认模型性能稳定性。
  • 可视化分析:绘制预测值与真实值的散点图查看误差分布,绘制训练/验证损失曲线判断模型是否收敛或过拟合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:07:46