California Housing 可复现回归实验:随机森林预测加州房价


字段
title California Housing 可复现回归实验:随机森林预测加州房价
slug california-housing-random-forest-regression
summary 基于 California Housing 数据集,使用随机森林回归模型预测加州各县房价中位数,完整记录数据探索、建模过程、误差分析与特征重要性解读。
description 本文基于 scikit-learn California Housing 数据集,使用随机森林回归模型预测房价中位数,涵盖数据探索、模型训练、误差评估与特征解释,提供完整可复现代码与实验输出。
coverImage assets/actual_vs_predicted.png

本项目由 星枢 支持


星枢官网:https://claudeaihub.cloud/

技术交流 秋秋:1097156200

California Housing 可复现回归实验:随机森林预测加州房价

做完分类项目之后,很自然想试试回归。分类是判断"是或不是",回归是预测"具体是多少"。这次用经典的 California Housing 数据集,训练一个随机森林回归模型来预测加州各地区的房价中位数。

项目已开源:

text 复制代码
https://github.com/coderWang404/xingshuProjects/tree/main/2026-06-06-california-housing-regression

核心结论先放前面:

  • 数据规模:20,640 条记录,8 个特征
  • 模型:RandomForestRegressor
  • :0.7930(能解释约 79% 的房价方差)
  • RMSE:0.5208(约 $52,083)
  • 最强特征MedInc(地区收入中位数)

1. 数据集长什么样

California Housing 是 scikit-learn 内置的经典数据集,记录了加州 20,640 个地区(census block group)的 8 项指标:

特征 含义
MedInc 地区收入中位数(万美元)
HouseAge 房龄中位数
AvgRooms 每户平均房间数
AvgBedrms 每户平均卧室数
Population 地区人口
AvgOccup 每户平均居住人数
Latitude 纬度
Longitude 经度

目标值是 MedHouseVal,即该地区房价中位数,单位是 $100,000。也就是说,目标值 2.0 代表房价中位数 20 万美元。

我扫了一眼数据分布,target 的均值是 2.07,标准差 1.15。换算成美元,加州这批地区的房价中位数大约是 20.7 万美元,但差异很大------最低的不到 1.5 万,最高的超过 50 万。

2. 环境准备

依赖和上一个项目一样,四个包:

text 复制代码
pandas
numpy
scikit-learn
matplotlib
bash 复制代码
git clone https://github.com/coderWang404/xingshuProjects.git
cd xingshuProjects/2026-06-06-california-housing-regression

python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

3. 运行实验

bash 复制代码
python experiments/california-housing/run_experiment.py

脚本会自动从 sklearn 加载数据,训练模型,输出所有图表和指标到 outputs/ 目录。

4. 为什么用随机森林做回归

树模型做回归有一个天然优势:它不需要假设特征和目标之间是线性关系。房价和收入之间可能是非线性的------收入高到一定程度,房价增长会放缓;或者地理位置的影响也不是简单的加减关系。

具体参数:

python 复制代码
model = RandomForestRegressor(
    n_estimators=300,
    max_depth=12,
    min_samples_leaf=3,
    random_state=42,
    n_jobs=-1,
)

300 棵树对于 2 万条数据来说完全够用。深度限制在 12 是为了防止过拟合------California Housing 只有 8 个特征,如果让树无限生长,它会记住训练数据里的噪声,而不是学到真正的规律。min_samples_leaf=3 也是一个保险:要求每个叶子节点至少有 3 个样本,避免模型对极端值过于敏感。

5. 结果分析:R² = 0.793 意味着什么

测试集 4,128 条记录,核心指标:

指标 数值 解释
MSE 0.27126 均方误差
RMSE 0.52083 约 $52,083
MAE 0.34322 约 $34,322
0.79299 解释 79.3% 方差

R² = 0.793 的意思是:模型能解释房价变异的约 79%,剩下的 21% 由数据中没有包含的因素决定------比如学区质量、房屋装修水平、距离商圈的远近、海景/山景等。

RMSE 0.52 意味着预测值和真实值平均偏差约 5.2 万美元。MAE 0.34 意味着平均绝对偏差约 3.4 万美元。这两个数字差得不少(0.52 vs 0.34),说明误差分布是不对称的------有一些极端误差拉高了 RMSE,但大多数样本的误差在 3.4 万左右。

从 Actual vs Predicted 散点图能看出几个规律:

  1. 低价房区域(左下角)点非常密集,模型预测也比较准。
  2. 随着房价升高,点的散布明显变大------高价房的预测误差更大。这和数据分布一致:高价房样本少,模型学得不充分。
  3. 最上方有几个点明显偏离对角线,这些是模型"看走眼"的极端案例。

残差分布基本以 0 为中心,近似正态分布,说明模型没有明显的系统性偏差。但右侧有一个长尾------存在少量正残差很大的样本,即模型低估了这些地区的房价。这可能就是那些"好学区+好地段"但数据里没有体现出来的房子。

6. 特征重要性:收入是碾压级的王者

Permutation Importance 排名:

排名 特征 重要性 标准差
1 MedInc 1.03488 0.01976
2 Latitude 0.48061 0.00817
3 Longitude 0.35107 0.00637
4 AvgOccup 0.26749 0.00740
5 HouseAge 0.08981 0.00487
6 AvgRooms 0.02725 0.00197
7 AvgBedrms 0.01111 0.00184
8 Population 0.00879 0.00114

MedInc(收入中位数)的重要性是 1.03,是第二名 Latitude(0.48)的 2 倍多。而且这个结果极其稳定------标准差只有 0.02,意味着换不同的测试集,MedInc 永远是第一。

这个结果完全符合直觉,也符合经济学常识:一个地区的收入水平,是决定房价的最核心因素。不是房龄,不是房间数,而是住在这里的人赚多少钱。

但后面几个特征的排名更有意思:

Latitude + Longitude 排第二、第三(合计重要性约 0.83)。这说明在加州,地理位置是硬通货。北纬 37 度附近的湾区(San Francisco、San Jose)房价明显高于内陆地区。模型不需要知道"这是硅谷",它只需要知道纬度和经度,就能大致判断房价水平。

AvgOccup(平均居住人数)排第四(0.27),这有点反直觉。直觉上"住的人多"应该和房价无关,甚至正相关才对。但数据里 AvgOccup 和房价是负相关的------居住人数多的地区,往往是多户合租或住房条件较差的社区,房价反而更低。

AvgRooms(平均房间数)只有 0.027,几乎可以忽略。这似乎违反常识------大房子不应该更贵吗?但注意这是"每户平均房间数",它跟 AvgOccup 高度相关(住的人多,房间数通常也多)。随机森林已经通过 AvgOccup 捕捉了这部分信息,所以 AvgRooms 的独立贡献很小。这也解释了为什么 AvgBedrms(卧室数)和 Population(人口)的重要性几乎可以忽略------它们的信息已经被更强的特征覆盖了。

7. 这个模型能用来买房吗

坦率说,不能直接用来买房。

RMSE 约 5.2 万美元,对于 20 万美元级别的房子来说,误差比例约 25%。如果你拿这个模型去估价,一套真实价值 20 万的房子,模型可能报 15-25 万------这个区间太宽了,无法指导具体交易。

但这个模型非常适合做初步的市场分析

  • 快速筛选"明显被低估"或"明显被高估"的区域
  • 理解不同因素对房价的相对影响
  • 作为更复杂模型的 baseline(比如加入学区、交通、POI 数据后,R² 应该能进一步上升)

8. 实验输出

运行脚本后 experiments/california-housing/outputs/ 会生成:

text 复制代码
metrics.json              # 完整指标 JSON
regression_report.txt     # 回归报告
dataset_profile.csv       # 数据统计
feature_importance.csv    # 全部特征重要性
actual_vs_predicted.png   # 预测 vs 真实值散点图
residual_distribution.png # 残差分布图
feature_importance.png    # 特征重要性图
summary.md                # 实验摘要

所有输出都是自动生成的,随机种子固定为 42,结果完全一致。

9. 总结

这个实验的核心收获:

  • 收入是房价的绝对主导因素,重要性是地理位置的 2 倍以上。
  • 地理位置(经纬度)是第二硬通货,在加州这种沿海经济带尤其明显。
  • 房间数、卧室数、人口数量对房价的独立预测力很弱,它们的信息已经被收入水平和居住密度覆盖了。
  • R² = 0.793 是一个不错的 baseline,但要用于实际估价还差得远------需要更多特征和更复杂的模型。

如果你想拿它当学习模板,建议试试这几个改动:

  • max_depth 从 12 改成 20,观察过拟合迹象(训练 R² 会上升,测试 R² 可能下降)
  • 加入特征交叉(比如 MedInc × Latitude),看 R² 能不能提升
  • 换成 GradientBoostingRegressor 或 XGBoost,对比不同树模型的表现

本项目由 星枢 支持

星枢官网:https://claudeaihub.cloud/

技术交流 秋秋:1097156200

相关推荐
吴佳浩 Alben1 小时前
pytorch 你不学?_EP01_环境准备与安装验证
人工智能·pytorch·python
XiaoZhangGOGOGO1 小时前
新的文本编辑方式
python
留白_1 小时前
pandas练习题
python·数据分析·pandas
码界索隆1 小时前
Python转Java系列:面向对象基础
java·开发语言·python
逻辑星辰1 小时前
x-ds-pow-response逆向分析
开发语言·人工智能·python·深度学习·算法
c_lb72882 小时前
涨跌停与流动性变差还要不要挂单:quote 涨跌停字段与熔断思路
python·区块链
非生而知之者2 小时前
基于灰狼算法优化的电量预测
python·算法·群体智能算法·电力预测
AI行业学习2 小时前
CC‑Switch v3.16.1 免费下载(Windows+macOS+Linux)、使用方法【2026.6.11】
linux·开发语言·windows·python·macos·前端框架·html