TensorFlow 实例 – 回归问题

TensorFlow 实例 – 回归问题

本教程将展示如何使用 TensorFlow 和 Keras 构建一个完整的回归问题项目,以 Boston Housing(波士顿房价) 数据集为例,目标是预测房屋价格(连续值)。教程涵盖数据加载、预处理、模型构建、训练、评估和结果可视化,适合初学者和需要实用示例的用户。代码简洁,包含调优技巧和性能优化。如果需要更复杂的模型、其他数据集或特定功能(如时间序列回归),请告诉我!


1. 项目目标

  • 任务:根据房屋特征(如房间数、犯罪率等)预测波士顿地区的房屋价格(单位:千美元)。
  • 数据集:Boston Housing,包含 506 个样本,13 个特征(如每栋住宅的平均房间数、犯罪率等),目标是房价。
  • 输出:回归模型,预测连续的房价值,并可视化训练过程和预测结果。

2. 环境准备

确保安装 TensorFlow 和相关库:

pip install tensorflow matplotlib scikit-learn

验证 TensorFlow:

import tensorflow as tf
print(tf.__version__)  # 确保版本为 2.x(如 2.17.0)

3. 完整代码

以下是完整的回归项目代码,包含数据处理、模型构建、训练和评估:

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import boston_housing
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

# 1. 加载和预处理数据
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

# 标准化特征
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# 2. 创建数据管道
train_dataset = (tf.data.Dataset.from_tensor_slices((x_train, y_train))
                 .shuffle(buffer_size=1000)
                 .batch(batch_size=32)
                 .prefetch(tf.data.AUTOTUNE))
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

# 3. 构建回归模型
model = models.Sequential([
    layers.Dense(64, activation='relu', input_shape=(x_train.shape[1],), 
                 kernel_regularizer=tf.keras.regularizers.l2(0.01)),
    layers.BatchNormalization(),
    layers.Dropout(0.3),
    layers.Dense(32, activation='relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.3),
    layers.Dense(1)  # 回归输出,单神经元,无激活函数
])

# 4. 编译模型
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    loss='mean_squared_error',
    metrics=['mean_absolute_error']
)

# 5. 训练模型
callbacks = [
    tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True),
    tf.keras.callbacks.ModelCheckpoint('boston_model.h5', save_best_only=True),
    tf.keras.callbacks.TensorBoard(log_dir='./logs')
]
history = model.fit(
    train_dataset,
    epochs=100,
    validation_data=test_dataset,
    callbacks=callbacks
)

# 6. 评估模型
test_loss, test_mae = model.evaluate(test_dataset)
print(f'\n测试集均方误差 (MSE): {test_loss:.4f}')
print(f'测试集均绝对误差 (MAE): {test_mae:.4f}')

# 7. 可视化训练过程
plt.figure(figsize=(12, 4))

# 绘制 MAE
plt.subplot(1, 2, 1)
plt.plot(history.history['mean_absolute_error'], label='Training MAE')
plt.plot(history.history['val_mean_absolute_error'], label='Validation MAE')
plt.title('Training and Validation MAE')
plt.xlabel('Epoch')
plt.ylabel('Mean Absolute Error')
plt.legend()

# 绘制损失
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss (MSE)')
plt.legend()

plt.show()

# 8. 可视化预测结果
predictions = model.predict(test_dataset).flatten()

plt.figure(figsize=(8, 8))
plt.scatter(y_test, predictions, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('True Prices ($1000s)')
plt.ylabel('Predicted Prices ($1000s)')
plt.title('True vs Predicted Prices')
plt.show()

4. 代码逐部分解释

4.1 数据加载与预处理

  • Boston Housing 数据集:包含 506 个样本,13 个特征(如犯罪率、房间数等),目标是房价(连续值)。
  • 标准化:使用 StandardScaler 将特征标准化(均值为 0,标准差为 1),提高模型稳定性。
  • 数据管道:使用 tf.data 实现打乱、批处理和预取,优化训练效率。

4.2 模型结构

  • Dense 层:两层全连接层(64 和 32 个神经元),使用 ReLU 激活增加非线性。
  • BatchNormalization:标准化每层输入,加速收敛。
  • Dropout:随机丢弃 30% 神经元,防止过拟合。
  • L2 正则化:在第一层添加权重惩罚,减少过拟合。
  • 输出层:单个神经元,无激活函数,输出连续值(房价)。

4.3 编译与训练

  • 优化器:Adam,学习率为 0.001,适合回归任务。
  • 损失函数mean_squared_error(MSE),衡量预测值与真实值的平方差。
  • 指标mean_absolute_error(MAE),直观反映预测误差(单位:千美元)。
  • 回调
  • EarlyStopping:验证损失 10 个 epoch 无改进则停止。
  • ModelCheckpoint:保存最佳模型。
  • TensorBoard:记录训练日志,可视化指标。

4.4 评估与可视化

  • 评估:在测试集上计算 MSE 和 MAE,MAE 通常在 3-5(千美元)。
  • 可视化
  • 绘制训练和验证的 MAE/损失曲线,检查模型学习效果。
  • 绘制预测房价与真实房价的散点图,红线表示理想预测(预测 = 真实)。

5. 运行结果

  • 训练:100 个 epoch(可能因早停提前结束),测试 MAE 通常在 3-5 千美元
  • 可视化
  • MAE 和损失曲线反映训练过程,验证指标接近训练指标表明泛化良好。
  • 散点图显示预测值与真实值的相关性,点越靠近红线(y=x)越好。

示例输出

测试集均方误差 (MSE): 22.3456
测试集均绝对误差 (MAE): 3.4567

6. 生成图表

以下是训练过程中 MAE 和损失的示例图表:

{
  "type": "line",
  "data": {
    "labels": ["Epoch 1", "Epoch 10", "Epoch 20", "Epoch 30", "Epoch 40"],
    "datasets": [
      {
        "label": "Training MAE",
        "data": [8.5, 5.2, 4.0, 3.8, 3.6], // 示例数据
        "borderColor": "#1f77b4",
        "fill": false
      },
      {
        "label": "Validation MAE",
        "data": [8.7, 5.5, 4.2, 4.0, 3.9], // 示例数据
        "borderColor": "#ff7f0e",
        "fill": false
      }
    ]
  },
  "options": {
    "scales": {
      "x": { "title": { "display": true, "text": "Epoch" } },
      "y": { "title": { "display": true, "text": "Mean Absolute Error ($1000s)" }, "beginAtZero": false }
    }
  }
}

说明:实际数据来自 history.history['mean_absolute_error']history.history['val_mean_absolute_error']。损失曲线类似,可从 history.history['loss']history.history['val_loss'] 获取。


7. 优化建议

  • 提高准确率
  • 增加模型复杂度(更多层/神经元):
    python model.add(layers.Dense(128, activation='relu'))
  • 尝试其他模型(如 XGBoost 或深度残差网络)。
  • 加速训练
  • 启用混合精度训练:
    python from tensorflow.keras import mixed_precision mixed_precision.set_global_policy('mixed_float16')
  • 使用多 GPU:tf.distribute.MirroredStrategy
  • 防止过拟合
  • 增加 Dropout 比例或 L2 正则化强度。
  • 使用交叉验证(需借助 sklearn.model_selection.KFold)。
  • 监控性能
  • 使用 TensorBoard 查看详细指标:tensorboard --logdir ./logs
  • 绘制残差图:
    python residuals = y_test - predictions plt.hist(residuals, bins=30) plt.xlabel('Prediction Error ($1000s)') plt.title('Residual Distribution') plt.show()

8. 常见问题与解决

  • 预测误差大
  • 检查特征标准化是否正确。
  • 调整学习率(learning_rate=0.0001)或更换优化器(如 RMSprop)。
  • 过拟合
  • 验证损失高于训练损失,增加正则化或减少模型复杂度。
  • 训练慢
  • 确保 GPU 可用:tf.config.list_physical_devices('GPU')
  • 优化数据管道(prefetch, cache)。
  • 内存不足
  • 减小 batch_size
  • 使用 TFRecord 存储数据:
    python def create_tfrecord(features, label): feature = { 'features': tf.train.Feature(float_list=tf.train.FloatList(value=features.flatten())), 'label': tf.train.Feature(float_list=tf.train.FloatList(value=[label])) } return tf.train.Example(features=tf.train.Features(feature=feature))

9. 总结

本项目展示了使用 TensorFlow 和 Keras 解决回归问题的完整流程,基于 Boston Housing 数据集的房价预测。示例中的全连接神经网络结合了标准化、正则化和高效数据管道,适合回归任务入门。如果需要进一步优化(如使用深度网络、集成方法)或处理其他数据集,请告诉我!

需要更多内容?

  • 更复杂的模型(如残差网络、集成模型)。
  • 其他数据集(如 California Housing、自定义数据)。
  • 额外图表(如残差分布、特征重要性)。
  • 部署模型(TensorFlow Lite 或 Serving)。


import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import boston_housing
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

1. 加载和预处理数据

(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

标准化特征

scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

2. 创建数据管道

train_dataset = (tf.data.Dataset.from_tensor_slices((x_train, y_train))
.shuffle(buffer_size=1000)
.batch(batch_size=32)
.prefetch(tf.data.AUTOTUNE))
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

3. 构建回归模型

model = models.Sequential([
layers.Dense(64, activation=’relu’, input_shape=(x_train.shape[1],),
kernel_regularizer=tf.keras.regularizers.l2(0.01)),
layers.BatchNormalization(),
layers.Dropout(0.3),
layers.Dense(32, activation=’relu’),
layers.BatchNormalization(),
layers.Dropout(0.3),
layers.Dense(1) # 回归输出,单神经元,无激活函数
])

4. 编译模型

model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=’mean_squared_error’,
metrics=[‘mean_absolute_error’]
)

5. 训练模型

callbacks = [
tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True),
tf.keras.callbacks.ModelCheckpoint(‘boston_model.h5’, save_best_only=True),
tf.keras.callbacks.TensorBoard(log_dir=’./logs’)
]
history = model.fit(
train_dataset,
epochs=100,
validation_data=test_dataset,
callbacks=callbacks
)

6. 评估模型

test_loss, test_mae = model.evaluate(test_dataset)
print(f’\n测试集均方误差 (MSE): {test_loss:.4f}’)
print(f’测试集均绝对误差 (MAE): {test_mae:.4f}’)

7. 可视化训练过程

plt.figure(figsize=(12, 4))

绘制 MAE

plt.subplot(1, 2, 1)
plt.plot(history.history[‘mean_absolute_error’], label=’Training MAE’)
plt.plot(history.history[‘val_mean_absolute_error’], label=’Validation MAE’)
plt.title(‘Training and Validation MAE’)
plt.xlabel(‘Epoch’)
plt.ylabel(‘Mean Absolute Error’)
plt.legend()

绘制损失

plt.subplot(1, 2, 2)
plt.plot(history.history[‘loss’], label=’Training Loss’)
plt.plot(history.history[‘val_loss’], label=’Validation Loss’)
plt.title(‘Training and Validation Loss’)
plt.xlabel(‘Epoch’)
plt.ylabel(‘Loss (MSE)’)
plt.legend()

plt.show()

8. 可视化预测结果

predictions = model.predict(test_dataset).flatten()

plt.figure(figsize=(8, 8))
plt.scatter(y_test, predictions, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], ‘r–‘, lw=2)
plt.xlabel(‘True Prices ($1000s)’)
plt.ylabel(‘Predicted Prices ($1000s)’)
plt.title(‘True vs Predicted Prices’)
plt.show()

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注