端到端机器学习项目实战:加州房价预测案例

端到端机器学习项目实战:加州房价预测案例

【免费下载链接】handson-ml 该仓库包含《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》一书的所有代码示例,为初学者提供实战式的学习路径。 【免费下载链接】handson-ml 项目地址: https://gitcode.com/gh_mirrors/ha/handson-ml

本文详细介绍了加州房价预测机器学习项目的完整流程,从数据获取与探索性分析(EDA)开始,展示了数据获取机制、数据集概览与统计特征分析、数据质量评估等关键步骤。接着深入探讨了数据预处理与特征工程技巧,包括缺失值处理、类别特征编码、特征组合与标准化处理。然后系统比较了多种回归模型的性能,包括线性回归、决策树回归和随机森林回归,并通过交叉验证和网格搜索进行模型优化。最后涵盖了模型部署与性能优化策略,包括模型持久化、部署架构设计、性能优化和监控系统。

数据获取与探索性分析(EDA)

在机器学习项目中,数据获取与探索性分析(EDA)是构建成功模型的基础。加州房价预测案例为我们展示了如何系统地从数据获取到深入分析的全过程。让我们深入探讨这一关键阶段的技术细节和最佳实践。

数据获取机制

项目采用模块化的数据获取方式,通过精心设计的函数实现数据的自动化下载和解压:

import os
import tarfile
import urllib.request

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"

def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
    os.makedirs(housing_path, exist_ok=True)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    urllib.request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=housing_path)
    housing_tgz.close()

def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

这个设计体现了良好的工程实践:

  • 可配置性:通过参数化URL和路径,支持不同数据源的灵活切换
  • 错误处理exist_ok=True确保目录创建不会因已存在而失败
  • 资源管理:正确关闭tar文件句柄,避免资源泄漏

数据集概览与统计特征

加载数据后,我们首先进行整体了解:

housing = load_housing_data()
print(housing.info())
print(housing.describe())

数据集包含20,640个样本,10个特征,具体结构如下:

特征名称数据类型非空数量描述
longitudefloat6420640经度坐标
latitudefloat6420640纬度坐标
housing_median_agefloat6420640房屋年龄中位数
total_roomsfloat6420640总房间数
total_bedroomsfloat6420433总卧室数(含缺失值)
populationfloat6420640人口数量
householdsfloat6420640家庭数量
median_incomefloat6420640收入中位数
median_house_valuefloat6420640房价中位数(目标变量)
ocean_proximityobject20640海洋接近度类别

数值特征统计分析

通过描述性统计,我们获得关键数值洞察:

housing.describe()

统计结果揭示了数据分布的重要特征:

统计量longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
count20640.0020640.0020640.0020640.0020433.0020640.0020640.0020640.0020640.00
mean-119.5735.6328.642635.76537.871425.48499.543.87206855.82
std2.002.1412.592181.62421.391132.46382.331.90115395.62
min-124.3532.541.002.001.003.001.000.5014999.00
25%-121.8033.9318.001447.75296.00787.00280.002.56119600.00
50%-118.4934.2629.002127.00435.001166.00409.003.53179700.00
75%-118.0137.7137.003148.00647.001725.00605.004.74264725.00
max-114.3141.9552.0039320.006445.0035682.006082.0015.00500001.00

分类特征分布分析

对于类别型特征ocean_proximity,我们需要特别关注其分布:

housing["ocean_proximity"].value_counts()

分布情况显示数据的地理分布特征:

类别数量占比
<1H OCEAN913644.3%
INLAND655131.7%
NEAR OCEAN265812.9%
NEAR BAY229011.1%
ISLAND50.02%

数据质量评估

在EDA阶段,数据质量检查至关重要:

# 检查缺失值
print("缺失值统计:")
print(housing.isnull().sum())

# 检查重复值
print("\n重复值数量:", housing.duplicated().sum())

# 检查数据类型一致性
print("\n数据类型:")
print(housing.dtypes)

发现的关键问题:

  • total_bedrooms有207个缺失值(约1%)
  • 无重复数据记录
  • 数据类型设计合理,数值特征使用float64,分类特征使用object

地理空间分布可视化

利用经纬度信息创建基础的地理分布图:

housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)

这帮助我们理解数据的地理分布模式,识别可能的聚类区域和异常点。

数据探索流程图

mermaid

关键发现与洞察

通过系统的EDA分析,我们获得以下重要洞察:

  1. 数据规模适中:20,640个样本足够进行有意义的机器学习建模
  2. 特征设计合理:包含地理、人口、房屋特征,覆盖多个维度
  3. 缺失值处理需求total_bedrooms需要缺失值处理策略
  4. 类别不平衡:ISLAND类别样本极少,可能需要特殊处理
  5. 数值范围差异:不同特征的数值范围差异较大,需要标准化
  6. 地理聚类明显:数据呈现明显的地理分布模式

这个EDA过程为后续的特征工程、模型选择和评估奠定了坚实基础,确保我们基于对数据的深刻理解来构建预测模型。

数据预处理与特征工程技巧

在加州房价预测项目中,数据预处理和特征工程是构建高性能机器学习模型的关键步骤。原始数据往往包含缺失值、异常值、类别特征和数值特征,需要通过系统化的处理流程将其转换为适合机器学习算法使用的格式。

缺失值处理策略

在加州房价数据集中,total_bedrooms特征存在207个缺失值。处理缺失值的策略直接影响模型的性能表现:

from sklearn.impute import SimpleImputer

# 使用中位数策略填充缺失值
imputer = SimpleImputer(strategy="median")

# 分离数值特征
housing_num = housing.drop('ocean_proximity', axis=1)

# 训练填充器并转换数据
imputer.fit(housing_num)
X = imputer.transform(housing_num)

# 将转换后的数据重新转换为DataFrame
housing_tr = pd.DataFrame(X, columns=housing_num.columns)

中位数策略相比均值策略更具鲁棒性,能够有效抵抗异常值的影响。填充后的统计信息被保存在imputer.statistics_属性中,确保在预测阶段使用相同的填充值。

类别特征编码

ocean_proximity是一个重要的类别特征,包含5个不同的类别。类别特征需要转换为数值形式才能被机器学习算法处理:

from sklearn.preprocessing import OneHotEncoder

# 分离类别特征
housing_cat = housing[["ocean_proximity"]]

# 创建One-Hot编码器
cat_encoder = OneHotEncoder()

# 转换类别特征
housing_cat_1hot = cat_encoder.fit_transform(housing_cat)

# 查看编码结果
print(cat_encoder.categories_)

One-Hot编码将每个类别转换为二进制向量,避免了类别间的大小关系对模型产生误导。编码后的特征维度会显著增加,但为线性模型提供了更好的特征表示。

特征工程与组合特征

原始特征中的绝对数值往往不如相对比例信息有意义。通过特征工程创建新的组合特征:

# 创建有意义的组合特征
housing["rooms_per_household"] = housing["total_rooms"] / housing["households"]
housing["bedrooms_per_room"] = housing["total_bedrooms"] / housing["total_rooms"]
housing["population_per_household"] = housing["population"] / housing["households"]

这些新特征能够更好地反映房屋的实际使用情况:

  • rooms_per_household: 每个家庭的房间数,反映居住密度
  • bedrooms_per_room: 卧室占总房间的比例,反映房屋类型
  • population_per_household: 每个家庭的人口数,反映家庭规模

数据标准化处理

不同特征的量纲差异会影响某些算法的性能,特别是基于距离的算法。标准化处理确保所有特征具有相同的尺度:

from sklearn.preprocessing import StandardScaler

# 创建标准化器
scaler = StandardScaler()

# 对数值特征进行标准化
housing_num_scaled = scaler.fit_transform(housing_num)

标准化后的特征均值为0,标准差为1,有助于梯度下降算法更快收敛,并提高某些模型的性能。

构建完整的数据处理流水线

为了确保训练和预测阶段的数据处理一致性,需要构建可复用的数据处理流水线:

mermaid

特征重要性分析

通过相关性分析可以发现哪些特征对房价预测最重要:

特征与房价的相关性重要性
median_income0.69⭐⭐⭐⭐⭐
rooms_per_household0.15⭐⭐⭐
total_rooms0.13⭐⭐
housing_median_age0.11⭐⭐
households0.06
total_bedrooms0.05
population-0.03
longitude-0.05
latitude-0.14⭐⭐

收入水平(median_income)是最重要的预测因子,这与经济常识一致。地理位置特征(longitude, latitude)也显示出一定的预测能力,反映了加州不同地区的房价差异。

处理流程的最佳实践

  1. 保持数据处理的一致性:确保训练和预测阶段使用相同的处理参数
  2. 避免数据泄露:所有数据处理步骤都应在训练集上拟合,然后应用到测试集
  3. 监控特征分布:定期检查特征分布的变化,确保模型的稳定性
  4. 迭代优化:根据模型表现不断调整特征工程策略

通过系统化的数据预处理和特征工程,我们能够从原始数据中提取更有价值的信息,为构建准确的房价预测模型奠定坚实基础。这些技巧不仅适用于房价预测项目,也是任何机器学习项目中数据处理的核心环节。

多种回归模型比较与选择

在加州房价预测项目中,选择合适的回归模型是决定预测性能的关键环节。通过系统性地比较多种回归算法,我们可以找到最适合该数据集的模型,从而获得最佳的预测效果。本节将深入分析线性回归、决策树回归、随机森林回归等主流算法的性能表现,并通过交叉验证和网格搜索来优化模型参数。

模型选择策略概述

在机器学习项目中,模型选择通常遵循以下流程:

mermaid

候选回归模型介绍

1. 线性回归 (Linear Regression)

线性回归是最基础的回归算法,假设特征与目标值之间存在线性关系。在加州房价预测中,我们使用Scikit-learn的LinearRegression

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)

特点:

  • 简单易懂,计算效率高
  • 对线性关系假设敏感
  • 容易受到异常值和多重共线性的影响
2. 决策树回归 (Decision Tree Regressor)

决策树通过递归地划分特征空间来构建预测模型:

from sklearn.tree import DecisionTreeRegressor

tree_reg = DecisionTreeRegressor(random_state=42)
tree_reg.fit(housing_prepared, housing_labels)

特点:

  • 能够捕捉非线性关系
  • 不需要特征缩放
  • 容易过拟合,需要正则化
3. 随机森林回归 (Random Forest Regressor)

随机森林通过集成多个决策树来提高预测性能:

from sklearn.ensemble import RandomForestRegressor

forest_reg = RandomForestRegressor(n_estimators=10, random_state=42)
forest_reg.fit(housing_prepared, housing_labels)

特点:

  • 降低过拟合风险
  • 提供特征重要性评估
  • 计算成本较高

模型性能评估与比较

我们使用交叉验证来评估各模型的性能,确保评估结果的稳定性:

from sklearn.model_selection import cross_val_score

# 线性回归性能
lin_scores = cross_val_score(lin_reg, housing_prepared, housing_labels,
                            scoring="neg_mean_squared_error", cv=10)
lin_rmse_scores = np.sqrt(-lin_scores)

# 决策树性能
tree_scores = cross_val_score(tree_reg, housing_prepared, housing_labels,
                             scoring="neg_mean_squared_error", cv=10)
tree_rmse_scores = np.sqrt(-tree_scores)

# 随机森林性能
forest_scores = cross_val_score(forest_reg, housing_prepared, housing_labels,
                               scoring="neg_mean_squared_error", cv=10)
forest_rmse_scores = np.sqrt(-forest_scores)
性能对比结果

下表展示了各模型的交叉验证性能指标:

模型类型平均RMSE标准差最佳RMSE最差RMSE
线性回归68,628±2,56965,31772,140
决策树71,407±2,43567,89775,832
随机森林49,666±1,87347,21352,891

从结果可以看出,随机森林回归在加州房价预测任务中表现最佳,平均RMSE为49,666,明显优于线性回归和单棵决策树。

超参数调优与模型优化

为了进一步提升模型性能,我们对随机森林进行超参数调优:

from sklearn.model_selection import GridSearchCV

param_grid = [
    {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
    {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
]

forest_reg = RandomForestRegressor(random_state=42)
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
                          scoring='neg_mean_squared_error')
grid_search.fit(housing_prepared, housing_labels)

调优后的最佳参数组合为:

  • n_estimators: 30
  • max_features: 8
  • bootstrap: True

特征重要性分析

随机森林模型提供了特征重要性的量化指标,帮助我们理解哪些特征对房价预测最为关键:

特征重要性得分相对重要性
median_income0.32432.4%
ocean_proximity_INLAND0.18718.7%
latitude

【免费下载链接】handson-ml 该仓库包含《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》一书的所有代码示例,为初学者提供实战式的学习路径。 【免费下载链接】handson-ml 项目地址: https://gitcode.com/gh_mirrors/ha/handson-ml

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值