一、数据集介绍
波士顿房价数据集是一个经典的回归问题数据集,包含了1970年代末期波士顿的南部郊区共506个房屋样本。这些数据都是在20世纪70年代末期以旧金山海湾区房价的情况为基准,采集了波士顿房价相关的特征。这些特征包括了房屋所在城市的犯罪率、每个城镇平均房间数以及自有住房比例等。每个特征的值都已经经过了预处理,例如处理了缺失值和异常值。
该数据集已经成为了机器学习、统计学和数据挖掘领域的经典数据集,被广泛用于回归问题和特征选择问题的研究。
二、数据集特征
波士顿房价数据集共有13个要素特征,分别是:
CRIM:城镇人均犯罪率
ZN:占地面积超过25000平方英尺的住宅用地比例
INDUS:城镇非零售商业用地比例
CHAS:是否靠近Charles River的虚拟变量(如果靠近为1,否则为0)
NOX:一氧化氮浓度(每千万份)
RM:每个住房的平均房间数
AGE:1940年以前自有住房的比例
DIS:距离5个波士顿就业中心的成块加权距离
RAD:辐射性公路的可达性指数
TAX:每10,000美元的全额财产税率
PTRATIO:城镇师生比例
B:黑人比例(以1000为单位)
LSTAT:地位较低人群的比例
其中,前12个特征都是数值型特征,而第13个特征是一个百分比。这些特征是用于预测每个房屋的房价。
三、探索性数据分析
1. 单独特征与标签的关系探讨
为了更好地理解特征和标签之间的关系,我们可以通过绘制特征和标签的图像来进行探究。
# 导入数据集
from sklearn.datasets import load_boston
boston_dataset = load_boston()
# 转换数据为pandas DataFrame
import pandas as pd
boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
boston['MEDV'] = boston_dataset.target
# 绘制每个特征与标签之间的散点图
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(15,10))
for col,ax in zip(boston.columns,axes.flat):
ax.scatter(boston[col],boston['MEDV'])
ax.set_title(col)
plt.tight_layout()
plt.show()
通过观察每个子图的判定系数(R²值),我们可以初步了解到每个特征与标签之间的关系。例如,我们可以发现与房价最相关的特征是房间数量(RM),而与房价最不相关的特征是犯罪率(CRIM)。
2. 特征之间的关系探讨
除了单独特征与标签之间的关系,我们也可以考虑不同特征之间的关系来进行探究。例如,我们可以使用热力图来可视化特征之间的关系:
# 绘制特征之间的热力图
import seaborn as sns
corr_matrix = boston.corr().round(2)
sns.heatmap(data=corr_matrix, annot=True)
通过观察热力图,我们可以发现有多个特征之间存在较强的相关性,例如房屋的房间数(RM)和房屋的平均年龄(AGE)之间的负相关关系。
四、建模预测
1. 线性回归
线性回归可以被用来预测波士顿房价的范围。我们可以使用train_test_split()函数来将数据分割成训练集和测试集,并使用LinearRegression()来训练我们的模型:
# 导入数据集
from sklearn.datasets import load_boston
boston_dataset = load_boston()
# 构建数据集并进行分割
from sklearn.model_selection import train_test_split
X = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
y = boston_dataset.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练线性回归模型
from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(X_train, y_train)
# 输出模型评分
print("训练集评分:{:.2f}".format(reg.score(X_train, y_train)))
print("测试集评分:{:.2f}".format(reg.score(X_test, y_test)))
我们可以将训练集评分和测试集评分分别输出,以评估我们的模型的性能。如果训练集评分比测试集评分要高,这意味着我们的模型可能存在过拟合:即模型在训练集上表现良好但在测试集上表现不佳。
2. KNN回归
KNN回归是另一种用于波士顿房价预测的常用算法。与线性回归不同,KNN回归不需要假设房价与特征之间的关系是线性的。我们可以使用KNeighborsRegressor()来训练我们的模型:
# 导入数据集
from sklearn.datasets import load_boston
boston_dataset = load_boston()
# 构建数据集并进行分割
from sklearn.model_selection import train_test_split
X = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
y = boston_dataset.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练KNN回归模型
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor().fit(X_train, y_train)
# 输出模型评分
print("训练集评分:{:.2f}".format(knn.score(X_train, y_train)))
print("测试集评分:{:.2f}".format(knn.score(X_test, y_test)))
同样,我们也可以将训练集评分和测试集评分分别输出,以评估我们的模型的性能。
五、总结
波士顿房价数据集是一个经典的回归问题数据集,包含了1970年代末期波士顿的南部郊区共506个房屋样本。特征包括了房屋所在城市的犯罪率、每个城镇平均房间数以及自有住房比例等。我们可以通过探索性数据分析来确定每个特征和标签之间的关系,也可以使用线性回归和KNN回归模型来预测波士顿房价的范围。