在机器学习的领域中,波士顿房价案例是一个经典且具有代表性的示例。它为我们展示了如何运用机器学习算法来解决实际问题,尤其是预测性的回归问题。通过这个案例,我们可以深入理解从数据处理、模型选择与训练到模型评估与优化的整个机器学习流程。
一、波士顿房价数据集介绍
波士顿房价数据集包含了 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 呈现较强的正相关。
(四)数据预处理
- 检查缺失值:
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,说明岭回归模型在该数据集上的表现优于线性回归模型。
五、模型优化与改进
(一)特征工程优化
- 特征选择:可以根据特征与目标变量的相关性、特征之间的相关性等因素,选择对目标变量影响较大且相互之间相关性较小的特征。例如,通过相关性分析,我们发现某些特征与房价的相关性非常弱,可以考虑将其从数据集中删除,以减少模型的复杂度,防止过拟合。
- 特征组合:尝试创建新的特征,比如将某些特征进行乘积或比值运算,可能会发现新的特征与房价之间存在更强的关系。例如,将房间数量(RM)与住宅用地比例(ZN)进行某种组合运算,可能会得到一个更能反映房屋价值的新特征。
(二)模型参数调整
除了前面提到的岭回归中调整正则化参数alpha外,对于其他模型(如决策树回归、随机森林回归等),也有许多参数可以调整。例如,决策树的最大深度、叶子节点的最小样本数等参数都会影响模型的性能。可以使用网格搜索或随机搜索等方法来寻找最优的参数组合。
(三)集成学习方法
可以尝试使用集成学习方法,如随机森林回归、梯度提升回归等。这些方法通过组合多个弱学习器来构建一个强学习器,通常能够提高模型的性能和稳定性。例如,随机森林回归通过构建多个决策树,并对它们的预测结果进行平均来得到最终的预测值,能够有效地减少过拟合现象。
六、总结与展望
通过对波士顿房价案例的分析,我们完整地经历了从数据处理、模型选择与训练到模型评估与优化的机器学习流程。这个案例不仅帮助我们掌握了基本的机器学习技术,更让我们理解了如何将这些技术应用到实际问题中。
在未来的研究和实践中,可以进一步探索更多的机器学习算法和技术,如深度学习中的神经网络在回归问题中的应用。同时,不断优化数据处理和特征工程的方法,以提高模型的性能和泛化能力。此外,还可以将机器学习与其他领域的知识相结合,如经济学、地理学等,从更多的角度来分析和解决房价预测等实际问题。
希望通过这个博客,能让大家对机器学习的波士顿房价案例有更深入的理解,也为大家在机器学习的学习和实践中提供一些有益的参考。