基于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
相关产品推荐
相关产品推荐

