深入剖析机器学习之波士顿房价案例

发布于:2025-05-28 ⋅ 阅读:(22) ⋅ 点赞:(0)

在机器学习的领域中,波士顿房价案例是一个经典且具有代表性的示例。它为我们展示了如何运用机器学习算法来解决实际问题,尤其是预测性的回归问题。通过这个案例,我们可以深入理解从数据处理、模型选择与训练到模型评估与优化的整个机器学习流程。​

一、波士顿房价数据集介绍​

波士顿房价数据集包含了 506 个样本,每个样本有 13 个特征,这些特征涵盖了房屋所在区域的各种信息,例如:​

  • CRIM:城镇人均犯罪率。​
  • ZN:住宅用地超过 25,000 平方英尺的比例。​
  • INDUS:城镇非零售商业用地比例。​
  • CHAS:是否靠近查尔斯河(虚拟变量,1 表示是,0 表示否)。​
  • NOX:一氧化氮浓度(每千万份)。​
  • RM:平均每间房的房间数。​
  • AGE:1940 年之前建成的自住房屋比例。​
  • DIS:到波士顿五个就业中心的加权距离。​
  • RAD:辐射状公路的可达性指数。​
  • TAX:每 10,000 美元的全值财产税率。​
  • PTRATIO:城镇师生比例。​
  • B:1000 (Bk - 0.63)^2,其中 Bk 是城镇黑人的比例。​
  • LSTAT:低收入人群的比例。​

目标变量是MEDV,即自有住房的中位数价格(单位:千美元)。这个数据集的任务就是通过这些特征来预测房价。​

二、数据处理​

(一)导入必要的库​

在 Python 中,我们利用一系列强大的库来处理和分析数据。首先导入以下库:​

TypeScript

取消自动换行复制

import pandas as pd​

import numpy as np​

import matplotlib.pyplot as plt​

import seaborn as sns​

from sklearn.datasets import load_boston​

from sklearn.model_selection import train_test_split​

from sklearn.linear_model import LinearRegression, Ridge, RidgeCV​

from sklearn.metrics import mean_squared_error, r2_score​

(二)加载数据集​

使用 scikit - learn 库中的load_boston函数加载数据集:​

TypeScript

取消自动换行复制

boston = load_boston()​

data = pd.DataFrame(boston.data, columns = boston.feature_names)​

target = pd.Series(boston.target, name='MEDV')​

(三)数据探索与可视化​

通过data.head()可以查看数据集的前几行,了解数据的大致结构。同时,利用data.describe()获取数据的统计摘要,包括均值、标准差、最小值、最大值等。​

为了更直观地了解特征与房价之间的关系,我们进行数据可视化。例如,绘制散点图来观察房间数量(RM)与房价(MEDV)的关系:​

TypeScript

取消自动换行复制

plt.scatter(data['RM'], target)​

plt.xlabel('Average Number of Rooms (RM)')​

plt.ylabel('Median House Value (MEDV)')​

plt.title('Relationship between RM and MEDV')​

plt.show()​

从图中可以大致看出,房间数量越多,房价往往越高,呈现出正相关的趋势。我们还可以使用seaborn库绘制热力图来查看各特征之间的相关性:​

TypeScript

取消自动换行复制

corr = data.corr()​

plt.figure(figsize=(12, 10))​

sns.heatmap(corr, annot=True, cmap='coolwarm')​

plt.title('Correlation Matrix')​

plt.show()​

通过热力图,我们可以发现一些特征之间存在较强的相关性,比如 LSTAT(低收入人群比例)与 MEDV(房价中位数)呈现较强的负相关,而 RM(房间数量)与 MEDV 呈现较强的正相关。​

(四)数据预处理​

  1. 检查缺失值:​

TypeScript

取消自动换行复制

data.isnull().sum()​

幸运的是,波士顿房价数据集没有缺失值,这在一定程度上简化了数据处理的过程。​

2. 特征缩放:虽然线性回归对特征缩放不是特别敏感,但对于一些算法(如梯度下降法),特征缩放可以加速收敛。这里我们使用StandardScaler对数据进行标准化处理:​

TypeScript

取消自动换行复制

from sklearn.preprocessing import StandardScaler​

scaler = StandardScaler()​

data_scaled = scaler.fit_transform(data)​

(五)划分训练集和测试集​

将数据集划分为训练集和测试集,这是评估模型性能的关键步骤。通常,我们将大约 70% - 80% 的数据作为训练集,其余作为测试集。使用train_test_split函数进行划分:​

TypeScript

取消自动换行复制

X_train, X_test, y_train, y_test = train_test_split(data_scaled, target, test_size = 0.2, random_state = 42)​

random_state参数用于确保每次运行代码时划分的结果是一致的,便于结果的复现。​

三、模型训练与选择​

(一)线性回归模型​

线性回归是一种基本的回归模型,它假设目标变量与特征之间存在线性关系。在 scikit - learn 中,使用LinearRegression类进行建模:​

TypeScript

取消自动换行复制

lin_reg = LinearRegression()​

lin_reg.fit(X_train, y_train)​

训练完成后,可以获取模型的系数和截距:​

TypeScript

取消自动换行复制

print('Coefficients:', lin_reg.coef_)​

print('Intercept:', lin_reg.intercept_)​

系数表示每个特征对目标变量的影响程度,截距则是当所有特征为 0 时目标变量的值(在实际应用中,所有特征为 0 的情况可能没有实际意义,但在数学模型中有其作用)。​

(二)岭回归模型​

岭回归是一种改进的线性回归方法,它通过在损失函数中添加 L2 正则化项来解决多重共线性问题。当特征之间存在较强的相关性时,普通线性回归可能会出现过拟合,而岭回归可以通过正则化来缓解这个问题。​

首先,使用RidgeCV来确定最优的正则化参数alpha:​

TypeScript

取消自动换行复制

alphas = np.logspace(-5, 2, 200)​

ridge_cv = RidgeCV(alphas = alphas, scoring='neg_mean_squared_error', cv = 10)​

ridge_cv.fit(X_train, y_train)​

这里alphas是一个包含一系列可能的正则化参数值的数组,scoring指定了用于评估模型性能的指标(这里使用负均方误差,因为RidgeCV会选择使该指标最大化的alpha值),cv表示交叉验证的折数。​

然后,使用确定好的alpha值来创建Ridge模型并进行训练:​

TypeScript

取消自动换行复制

ridge = Ridge(alpha = ridge_cv.alpha_)​

ridge.fit(X_train, y_train)​

四、模型评估​

(一)预测与评估指标计算​

使用训练好的模型对测试集进行预测,并计算一些评估指标来衡量模型的性能。常用的评估指标有均方误差(MSE)、均方根误差(RMSE)和决定系数(R2)。​

对于线性回归模型:​

TypeScript

取消自动换行复制

y_pred_lin = lin_reg.predict(X_test)​

mse_lin = mean_squared_error(y_test, y_pred_lin)​

rmse_lin = np.sqrt(mse_lin)​

r2_lin = r2_score(y_test, y_pred_lin)​

print('Linear Regression - MSE:', mse_lin)​

print('Linear Regression - RMSE:', rmse_lin)​

print('Linear Regression - R2:', r2_lin)​

对于岭回归模型:​

TypeScript

取消自动换行复制

y_pred_ridge = ridge.predict(X_test)​

mse_ridge = mean_squared_error(y_test, y_pred_ridge)​

rmse_ridge = np.sqrt(mse_ridge)​

r2_ridge = r2_score(y_test, y_pred_ridge)​

print('Ridge Regression - MSE:', mse_ridge)​

print('Ridge Regression - RMSE:', rmse_ridge)​

print('Ridge Regression - R2:', r2_ridge)​

均方误差衡量了预测值与真实值之间误差的平方的平均值,均方根误差是均方误差的平方根,它与目标变量的单位相同,更直观地反映了误差的大小。决定系数 R2 表示模型对数据的拟合优度,取值范围在 0 到 1 之间,越接近 1 表示模型拟合得越好。​

(二)模型性能比较与分析​

通过比较线性回归和岭回归模型的评估指标,可以发现:​

  • 如果数据不存在严重的多重共线性问题,线性回归和岭回归的性能可能相差不大。但在实际情况中,由于特征之间往往存在一定的相关性,岭回归通常能够在一定程度上提高模型的泛化能力,避免过拟合。​
  • 从计算出的 MSE、RMSE 和 R2 值来看,如果岭回归的 RMSE 更小,R2 更接近 1,说明岭回归模型在该数据集上的表现优于线性回归模型。​

五、模型优化与改进​

(一)特征工程优化​

  1. 特征选择:可以根据特征与目标变量的相关性、特征之间的相关性等因素,选择对目标变量影响较大且相互之间相关性较小的特征。例如,通过相关性分析,我们发现某些特征与房价的相关性非常弱,可以考虑将其从数据集中删除,以减少模型的复杂度,防止过拟合。​
  1. 特征组合:尝试创建新的特征,比如将某些特征进行乘积或比值运算,可能会发现新的特征与房价之间存在更强的关系。例如,将房间数量(RM)与住宅用地比例(ZN)进行某种组合运算,可能会得到一个更能反映房屋价值的新特征。​

(二)模型参数调整​

除了前面提到的岭回归中调整正则化参数alpha外,对于其他模型(如决策树回归、随机森林回归等),也有许多参数可以调整。例如,决策树的最大深度、叶子节点的最小样本数等参数都会影响模型的性能。可以使用网格搜索或随机搜索等方法来寻找最优的参数组合。​

(三)集成学习方法​

可以尝试使用集成学习方法,如随机森林回归、梯度提升回归等。这些方法通过组合多个弱学习器来构建一个强学习器,通常能够提高模型的性能和稳定性。例如,随机森林回归通过构建多个决策树,并对它们的预测结果进行平均来得到最终的预测值,能够有效地减少过拟合现象。​

六、总结与展望​

通过对波士顿房价案例的分析,我们完整地经历了从数据处理、模型选择与训练到模型评估与优化的机器学习流程。这个案例不仅帮助我们掌握了基本的机器学习技术,更让我们理解了如何将这些技术应用到实际问题中。​

在未来的研究和实践中,可以进一步探索更多的机器学习算法和技术,如深度学习中的神经网络在回归问题中的应用。同时,不断优化数据处理和特征工程的方法,以提高模型的性能和泛化能力。此外,还可以将机器学习与其他领域的知识相结合,如经济学、地理学等,从更多的角度来分析和解决房价预测等实际问题。​

希望通过这个博客,能让大家对机器学习的波士顿房价案例有更深入的理解,也为大家在机器学习的学习和实践中提供一些有益的参考。


网站公告

今日签到

点亮在社区的每一天
去签到