一、问题描述
波士顿或加州房价预测这是一经典的回归预测建模机器学习问题。
二、波士顿房价数据集
数据集中的数据来源于1970年的波士顿标准大都市统计区(SMSA)。该数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。数据库中的每条记录都描述了波士顿的一个郊区或城镇。
数据结构
数据集都有以下14个属性:
CRIM–城镇人均犯罪率 ——【城镇人均犯罪率】 ZN – 占地面积超过25,000平方英尺的住宅用地比例。 ——【住宅用地所占比例】 INDUS – 每个城镇非零售业务的比例。 ——【城镇中非商业用地占比例】 CHAS – Charles River虚拟变量(如果是河道,则为1;否则为0 ——【查尔斯河虚拟变量,用于回归分析】 NOX – 一氧化氮浓度(每千万份) ——【环保指标】 RM – 每间住宅的平均房间数 ——【每栋住宅房间数】 AGE – 1940年以前建造的自住单位比例 ——【1940年以前建造的自住单位比例 】 DIS -波士顿的五个就业中心加权距离 ——【与波士顿的五个就业中心加权距离】 RAD – 径向高速公路的可达性指数 ——【距离高速公路的便利指数】 TAX – 每10,000美元的全额物业税率 ——【每一万美元的不动产税率】 PTRATIO – 城镇的学生与教师比例 ——【城镇中教师学生比例】 B – 1000(Bk – 0.63)^ 2其中Bk是城镇黑人的比例 ——【城镇中黑人比例】 LSTAT – 人口状况下降% ——【房东属于低等收入阶层比例】 MEDV – 自有住房的中位数报价, 单位1000美元 ——【自住房屋房价中位数】
数据样例:
0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 24.00
0.02731 0.00 7.070 0 0.4690 6.4210 78.90 4.9671 2 242.0 17.80 396.90 9.14 21.60
0.02729 0.00 7.070 0 0.4690 7.1850 61.10 4.9671 2 242.0 17.80 392.83 4.03 34.70
0.03237 0.00 2.180 0 0.4580 6.9980 45.80 6.0622 3 222.0 18.70 394.63 2.94 33.40
0.06905 0.00 2.180 0 0.4580 7.1470 54.20 6.0622 3 222.0 18.70 396.90 5.33 36.20
0.02985 0.00 2.180 0 0.4580 6.4300 58.70 6.0622 3 222.0 18.70 394.12 5.21 28.70
0.08829 12.50 7.870 0 0.5240 6.0120 66.60 5.5605 5 311.0 15.20 395.60 12.43 22.90
0.14455 12.50 7.870 0 0.5240 6.1720 96.10 5.9505 5 311.0 15.20 396.90 19.15 27.10
0.21124 12.50 7.870 0 0.5240 5.6310 100.00 6.0821 5 311.0 15.20 386.63 29.93 16.50
0.17004 12.50 7.870 0 0.5240 6.0040 85.90 6.5921 5 311.0 15.20 386.71 17.10 18.90
0.22489 12.50 7.870 0 0.5240 6.3770 94.30 6.3467 5 311.0 15.20 392.52 20.45 15.00
0.11747 12.50 7.870 0 0.5240 6.0090 82.90 6.2267 5 311.0 15.20 396.90 13.27 18.90
...
三、加州房价数据集
因波士顿房价数据集比较陈旧,现推荐使用加州房价数据集用于进行回归预测建模机器学习。加州房价数据集(California Housing Dataset),这是一个公开的机器学习数据集,包含加利福尼亚州各地区的房屋信息,包括房价、中位数收入、住房年龄等特征。加州房价数据集(California Housing dataset)最初是在1990年代由UCI机器学习库收录的。
数据结构
数据集字段定义:
1. longitude/经度:衡量房屋距离西边的远近;数值越高表示越靠西
2. latitude/纬度:衡量房屋距离北边的远近;数值越高表示越靠北
3. housingMedianAge:一个街区内的房屋中位年龄;数值越低表示建筑越新
4. totalRooms:一个街区内房间总数
5. totalBedrooms:一个街区内卧室总数
6. population:一个街区内居住的总人数
7. households:一个街区内家庭总数,一个家庭指居住在一个住宅单元内的一群人
8. medianIncome:一个街区内家庭的中位收入(以万美金计)
9. medianHouseValue:一个街区内家庭的中位房价(以美金计)
10. oceanProximity:房屋相对于海洋/海域的位置
在 `scikit-learn` 的加州房价数据集中,`oceanProximity` 字段的取值范围包括以下五个类别:
1)<1H OCEAN:房屋距离海洋不到 1 英里(约 1.6 公里)。
2)INLAND:房屋距离海洋超过 25 英里(约 40 公里),并且不在海岸线 1 小时车程范围内。
3)NEAR BAY:房屋距离旧金山湾或东海湾不超过 6 英里(约 9.6 公里)。
4)NEAR OCEAN:房屋距离太平洋不超过 1 英里(约 1.6 公里)。
5)<2H OCEAN:房屋距离海洋超过 1 英里但不超过 2 小时车程(约 32 公里)。
这些类别帮助描述房屋与海洋的相对位置,从而可以用于分析和建模。
数据样例:ca-housing-dataset.csv
longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | ocean_proximity |
---|---|---|---|---|---|---|---|---|---|
-122.23 | 37.88 | 41 | 880 | 129 | 322 | 126 | 8.3252 | 452600 | NEAR BAY |
-122.22 | 37.86 | 21 | 7099 | 1106 | 2401 | 1138 | 8.3014 | 358500 | NEAR BAY |
-122.24 | 37.85 | 52 | 1467 | 190 | 496 | 177 | 7.2574 | 352100 | NEAR BAY |
-122.25 | 37.85 | 52 | 1274 | 235 | 558 | 219 | 5.6431 | 341300 | NEAR BAY |
-122.25 | 37.85 | 52 | 1627 | 280 | 565 | 259 | 3.8462 | 342200 | NEAR BAY |
-122.25 | 37.85 | 52 | 919 | 213 | 413 | 193 | 4.0368 | 269700 | NEAR BAY |
-122.25 | 37.84 | 52 | 2535 | 489 | 1094 | 514 | 3.6591 | 299200 | NEAR BAY |
-122.25 | 37.84 | 52 | 3104 | 687 | 1157 | 647 | 3.12 | 241400 | NEAR BAY |
致谢
该数据最初出现在以下论文中: Pace, R. Kelley, 和 Ronald Barry. “Sparse spatial autoregressions.” 统计与概率信函 33.3 (1997): 291-297。
数据集使用许可协议
Deed – CC0 1.0 Universal – Creative Commons
四、预测方案样例
安装开发包
常用数据分析和传统机器学习开发包的安装方法如下:
conda create -n ml python=3.12
conda activate ml
conda install numpy pandas matplotlib seaborn statsmodels
conda install scikit-learn scipy
源码
1. 导入数据集和必要的库
加州房价是一公开的机器学习数据集,直接从sklearn.datasets开发包中加载。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 设置字体,解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体字体显示中文
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号显示问题
# 加载加州房价数据集
california = fetch_california_housing()
data = pd.DataFrame(california.data, columns=california.feature_names)
data['MedHouseVal'] = california.target
2. 创建和训练线性回归模型
# 选择特征 'MedInc'等参数进行建模
# 选择MedHouseVal为输出参数
X = data[['MedInc', 'HouseAge', 'AveRooms', 'AveOccup']]
y = data['MedHouseVal']
# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
3. 模型预测和评估
# 使用测试集进行预测
y_pred = model.predict(X_test)
# 评估模型表现
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差(MSE): {mse}")
print(f"决定系数(R^2): {r2}")
输出样例
(ml) C:\AiSelect1\ML\Biz\AiS-ML-Boston-CA-House-Prices-Predict\code>python ca-housing-predict.py
均方误差(MSE): 0.657451727882265
决定系数(R^2): 0.49828508595474374
4. 结果可视化
# 可视化预测值与实际值的比较
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5, label="预测值 vs 实际值")
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2, label="理想的直线 $y = x$")
plt.xlabel("实际房价")
plt.ylabel("预测房价")
plt.title("实际房价 vs 预测房价")
plt.legend()
plt.show()
输出:可视化预测值与实际值的比较