TensorFlow-v2.15实战成果房价预测模型效果与代码分享1. 引言从数据到预测一个经典的机器学习问题房价预测可以说是机器学习入门最经典的实战项目之一。它不像图像识别那样需要复杂的卷积网络也不像自然语言处理那样需要理解上下文。它的目标很直接给你一堆房子的信息比如面积、卧室数量、地理位置让你预测它的价格。听起来简单但要做好却不容易。数据怎么处理特征怎么选模型怎么调每一步都藏着学问。更重要的是这个项目能让你完整地走一遍机器学习的标准流程数据探索、特征工程、模型训练、效果评估。这比任何理论教程都来得实在。今天我们就用 TensorFlow 2.15 这个强大的工具来亲手搭建一个房价预测模型。我会带你从零开始一步步看到数据如何变成预测并分享我在这个过程中踩过的坑和总结的经验。无论你是刚接触机器学习的新手还是想温故知新的老手相信都能有所收获。我们使用的环境是预置好的 TensorFlow-v2.15 深度学习镜像它省去了繁琐的环境配置让我们能专注于模型本身。2. 数据准备与探索理解你要预测的对象在动手写代码之前我们必须先了解数据。这就像医生看病得先望闻问切不能上来就开药方。我们使用一个经典的公开数据集波士顿房价数据集在实际情况中你可能使用的是更复杂、更真实的本地数据但原理相通。2.1 加载与观察数据首先我们看看数据长什么样。import tensorflow as tf import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 这里我们使用sklearn内置的波士顿数据集作为示例 # 注意在实际TensorFlow 2.15环境中你可能需要从其他来源加载数据 # 以下代码演示数据结构和处理流程 # 假设我们已经有了一个Pandas DataFrame df # 它包含以下典型特征列 # - CRIM: 城镇人均犯罪率 # - ZN: 占地面积超过2.5万平方英尺的住宅用地比例 # - INDUS: 城镇非零售业务地区的比例 # - CHAS: 查尔斯河虚拟变量如果河道边界1否则为0 # - NOX: 氮氧化物浓度每千万份 # - RM: 每处住宅的平均房间数 # - AGE: 1940年以前建造的自住单元的比例 # - DIS: 到波士顿五个就业中心的加权距离 # - RAD: 放射状公路的可达性指数 # - TAX: 每万美元的全额财产税税率 # - PTRATIO: 城镇的师生比例 # - B: 1000(Bk - 0.63)^2其中Bk是城镇黑人的比例 # - LSTAT: 人口中地位较低者的百分比 # - MEDV: 自有住房的中位数价值单位1000美元这是我们的目标变量标签 print(数据形状样本数 特征数:, df.shape) print(\n前5行数据预览:) print(df.head()) print(\n数据基本信息:) print(df.info()) print(\n数值特征的统计描述:) print(df.describe())运行这段代码你会看到数据的基本情况有多少条记录多少个特征有没有缺失值每个特征的取值范围大概是多少。这是第一步建立对数据的“感觉”。2.2 数据分析与可视化光看数字不够直观我们画几张图。# 设置绘图风格 sns.set(stylewhitegrid) # 1. 目标变量房价的分布 plt.figure(figsize(10, 5)) plt.subplot(1, 2, 1) sns.histplot(df[MEDV], bins30, kdeTrue) plt.title(房价分布直方图) plt.xlabel(房价千美元) plt.ylabel(频数) # 2. 关键特征与房价的关系以“房间数(RM)”为例 plt.subplot(1, 2, 2) sns.scatterplot(xdf[RM], ydf[MEDV]) plt.title(房间数与房价关系) plt.xlabel(平均房间数) plt.ylabel(房价千美元) plt.tight_layout() plt.show() # 3. 特征间的相关性热图 plt.figure(figsize(12, 8)) # 计算相关系数矩阵 correlation_matrix df.corr().round(2) # 绘制热图 sns.heatmap(datacorrelation_matrix, annotTrue, cmapcoolwarm, center0) plt.title(特征相关性热图) plt.show()从这些图中你能发现很多信息房价分布是正态分布还是偏态分布有没有异常值特征与目标的关系“房间数”和房价明显正相关房间越多房价越贵这符合常识。特征间的关系有些特征之间相关性很强比如TAX和RAD这可能会在后续建模中引起“多重共线性”问题我们需要留意。2.3 数据预处理为模型训练做准备原始数据很少能直接扔给模型我们需要“清洗”和“转换”它。from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 假设目标列名为 MEDV target_column MEDV # 特征就是除了目标列的所有列 feature_columns [col for col in df.columns if col ! target_column] X df[feature_columns].values y df[target_column].values.reshape(-1, 1) # 确保y是二维数组 # 划分训练集和测试集通常8:2或7:3 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) print(f训练集大小: {X_train.shape}, 测试集大小: {X_test.shape}) # 特征标准化这对基于梯度下降的模型如神经网络非常重要 # 它使所有特征处于同一量纲加速模型收敛 scaler_X StandardScaler() scaler_y StandardScaler() X_train_scaled scaler_X.fit_transform(X_train) X_test_scaled scaler_X.transform(X_test) # 注意测试集使用训练集的scaler进行转换避免数据泄露 y_train_scaled scaler_y.fit_transform(y_train) y_test_scaled scaler_y.transform(y_test)关键点解释划分数据集绝对不能拿测试集参与训练我们用train_test_split把数据分成两部分一部分用于训练模型另一部分用于最终评估模型在“没见过”的数据上的表现。标准化房子的“面积”可能是几十到几百“房间数”是个位数。如果直接输入模型数值大的特征会主导训练过程。标准化就是把所有特征都转换到均值为0、标准差为1的分布上让它们公平竞争。3. 构建与训练模型让TensorFlow开始学习数据准备好了现在搭建我们的预测模型。我们将使用 TensorFlow Keras 的 Sequential API它非常直观适合构建层叠式的网络。3.1 模型架构设计对于房价预测这样的回归问题我们不需要像图像分类那样复杂的网络。一个简单的多层感知机MLP通常就能取得不错的效果。from tensorflow.keras import layers, models def build_model(input_dim): 构建一个简单的全连接神经网络用于回归预测。 参数: input_dim: 输入特征的维度 返回: 编译好的Keras模型 model models.Sequential([ # 输入层 layers.Input(shape(input_dim,)), # 第一个隐藏层64个神经元使用ReLU激活函数 layers.Dense(64, activationrelu, kernel_initializerhe_normal), # 随机丢弃部分神经元防止过拟合 layers.Dropout(0.1), # 第二个隐藏层32个神经元 layers.Dense(32, activationrelu, kernel_initializerhe_normal), layers.Dropout(0.1), # 输出层1个神经元预测一个连续值房价不使用激活函数线性激活 layers.Dense(1) ]) return model # 获取输入维度 input_dim X_train_scaled.shape[1] model build_model(input_dim) # 打印模型结构摘要 model.summary()运行model.summary()你会看到每一层的参数数量。这个模型大约有几千个参数需要学习。3.2 编译与训练模型模型结构是空的架子我们需要告诉它如何学习优化器以及学得好坏的标准损失函数。# 编译模型 model.compile( optimizeradam, # 自适应矩估计优化器非常常用且高效 lossmse, # 均方误差回归问题的标准损失函数 metrics[mae] # 平均绝对误差更直观的评估指标单位与房价相同 ) # 准备训练回调函数 # EarlyStopping: 当验证集损失不再下降时提前停止训练防止过拟合 early_stop tf.keras.callbacks.EarlyStopping( monitorval_loss, patience20, # 容忍轮数 restore_best_weightsTrue # 恢复最佳权重 ) # 开始训练 print(开始训练模型...) history model.fit( X_train_scaled, y_train_scaled, validation_split0.2, # 从训练集中再分20%作为验证集用于监控训练过程 epochs200, # 最大训练轮数 batch_size32, # 每次梯度更新使用的样本数 callbacks[early_stop], verbose1 # 显示训练进度条 ) print(训练完成)关键参数解读优化器adam可以自动调整学习率比传统的SGD随机梯度下降更稳定、更快。损失函数mse预测值与真实值差的平方的均值。我们的目标就是最小化这个值。评估指标mae预测值与真实值差的绝对值的均值。比如MAE5意味着平均预测误差是5千美元。验证集validation_split它不参与参数更新只用来在每轮训练后评估模型让我们知道模型是否在“死记硬背”训练数据过拟合。EarlyStopping这是防止过拟合的利器。如果连续20轮验证集损失都不再降低就停止训练并回到验证损失最低的那个模型状态。3.3 可视化训练过程训练完了我们看看模型学得怎么样。# 绘制训练历史 def plot_training_history(history): fig, axes plt.subplots(1, 2, figsize(12, 4)) # 绘制损失变化 axes[0].plot(history.history[loss], label训练损失) axes[0].plot(history.history[val_loss], label验证损失) axes[0].set_title(模型损失变化) axes[0].set_xlabel(训练轮次) axes[0].set_ylabel(损失 (MSE)) axes[0].legend() axes[0].grid(True) # 绘制评估指标变化 axes[1].plot(history.history[mae], label训练MAE) axes[1].plot(history.history[val_mae], label验证MAE) axes[1].set_title(模型平均绝对误差变化) axes[1].set_xlabel(训练轮次) axes[1].set_ylabel(MAE) axes[1].legend() axes[1].grid(True) plt.tight_layout() plt.show() plot_training_history(history)理想的曲线应该是训练损失和验证损失都随着训练轮次下降并逐渐趋于平稳。如果训练损失持续下降而验证损失开始上升说明过拟合了。MAE同样应该下降并趋于稳定。最终的值就是我们模型预测的平均误差。4. 模型评估与结果分析是骡子是马拉出来遛遛模型训练好了曲线看起来也不错但真正的考验在测试集上。测试集是模型从未见过的“新考卷”。4.1 在测试集上进行预测# 在测试集上进行预测 y_pred_scaled model.predict(X_test_scaled) # 将标准化后的预测值转换回原始房价尺度 y_pred scaler_y.inverse_transform(y_pred_scaled) y_true scaler_y.inverse_transform(y_test_scaled) # y_test_scaled就是标准化后的y_test # 计算关键评估指标 from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score mae mean_absolute_error(y_true, y_pred) mse mean_squared_error(y_true, y_pred) rmse np.sqrt(mse) # 均方根误差与原始数据单位一致 r2 r2_score(y_true, y_pred) print( 测试集评估结果 ) print(f平均绝对误差 (MAE): {mae:.2f} 千美元) print(f均方误差 (MSE): {mse:.2f}) print(f均方根误差 (RMSE): {rmse:.2f} 千美元) print(f决定系数 (R² Score): {r2:.4f})指标解读MAE/RMSE都是误差指标值越小越好。RMSE对大的误差惩罚更重。假设结果是RMSE: 4.5意味着预测值平均偏离真实值约4.5千美元。R² Score这个指标很重要它表示模型能多大程度上解释目标变量的变化。范围在0到1之间越接近1越好。比如R²: 0.85意味着模型能解释房价85%的波动剩下的15%是模型无法捕捉的随机因素或未包含的特征。4.2 可视化预测效果数字不够直观我们画图对比预测值和真实值。# 绘制预测值与真实值的散点对比图 plt.figure(figsize(8, 8)) plt.scatter(y_true, y_pred, alpha0.6) # 绘制理想对角线预测值真实值 min_val min(y_true.min(), y_pred.min()) max_val max(y_true.max(), y_pred.max()) plt.plot([min_val, max_val], [min_val, max_val], r--, lw2, label理想线 (预测真实)) plt.xlabel(真实房价 (千美元)) plt.ylabel(预测房价 (千美元)) plt.title(测试集预测值 vs 真实值) plt.legend() plt.grid(True, linestyle--, alpha0.7) plt.show() # 绘制误差分布直方图 errors y_pred - y_true plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) sns.histplot(errors, bins30, kdeTrue) plt.axvline(x0, colorr, linestyle--) plt.title(预测误差分布) plt.xlabel(预测误差 (千美元)) plt.ylabel(频数) plt.subplot(1, 2, 2) sns.boxplot(xerrors) plt.title(预测误差箱线图) plt.xlabel(预测误差 (千美元)) plt.tight_layout() plt.show()从散点图看点越靠近红色对角线说明预测越准。误差分布图应该大致以0为中心呈正态分布。如果误差分布明显偏斜说明模型存在系统性高估或低估。5. 总结与进阶思考通过这个完整的项目我们实践了机器学习解决回归问题的标准流程。使用 TensorFlow 2.15整个过程清晰而高效。这个简单的模型已经能捕捉到房价与多个特征之间的复杂关系取得了不错的预测效果。5.1 核心要点回顾数据为先永远花足够时间理解、清洗和探索你的数据。好的数据是成功的一半。预处理是关键正确的数据划分和标准化能极大提升模型训练的稳定性和速度。从简单开始先用一个结构简单的模型如本文的MLP建立基线。它往往能提供不错的性能并且训练快、易调试。监控与防过拟合使用验证集和EarlyStopping回调是防止模型在训练集上“钻牛角尖”的有效手段。全面评估不要只看一个指标。结合 MAE、RMSE、R² 以及可视化图表才能全面判断模型好坏。5.2 如何做得更好这个基础模型还有很大的提升空间你可以尝试以下方向特征工程这是提升模型性能的“魔法”。尝试创造新的特征比如“房间密度”房间数/面积、组合特征或者使用领域知识筛选更相关的特征。模型调优调整网络层数、神经元数量、Dropout比率、学习率等超参数。可以使用 Keras Tuner 或 Optuna 等工具进行自动超参数搜索。尝试其他模型除了全连接网络可以试试决策树系的模型如 XGBoost、LightGBM它们对表格数据往往有奇效。也可以用 TensorFlow 实现一个简单的集成模型。处理更复杂的数据引入更多特征如文本描述需要自然语言处理、图片需要卷积网络等构建多模态模型。机器学习是一个迭代和实验的过程。希望这个基于 TensorFlow-v2.15 的房价预测实战能成为你探索更广阔AI世界的一块坚实垫脚石。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。