在房地产行业中,精确的房产价格预测对买卖双方决策至关重要。传统的价格估算方法常常依赖于人为经验,而随着数据科学的发展,利用机器学习算法进行价格预测已经成为主流趋势。本案例以波士顿房价数据集为基础,展示了如何通过数据清洗、特征工程和回归模型来预测房产的售价。
本文将详细介绍如何在数据预处理、特征转换、回归建模等方面应用不同的机器学习方法,最终实现对房产价格的精准预测,帮助决策者优化市场策略与投资分析。
案例概述
本案例数据地址 Boston House Prices-Advanced Regression Techniques。
在这个案例中,旨在预测房产的售价(SalePrice
),并通过多种数据处理技术和回归模型优化预测效果。数据清洗和预处理工作对于处理缺失值、异常值和分类特征至关重要。通过转换和特征工程,创建了一些新的特征,这些特征有助于提高模型的预测能力。不同的回归模型(如线性回归、岭回归、Lasso回归等)分别进行了训练和评估,最后通过集成学习方法(Stacking)和模型融合进一步提高了预测性能。本案例的目标是通过精细的数据处理和强大的回归模型,优化房产价格预测。
模块名称 | 内容简介 | 所需技能 | 数据类型 | 应用场景 |
---|---|---|---|---|
案例概述 | 该案例用于房产价格预测,通过数据预处理、特征工程和回归模型的应用,展示了如何处理和分析数据以进行预测。 | 数据分析、回归建模、特征工程 | 结构化数据(数值型、类别型) | 房地产分析、市场预测 |
案例目标 | 通过不同的回归模型预测房产的售价,比较多种模型的性能,并通过特征工程提升预测效果。 | 回归分析、模型调优、交叉验证 | 数值数据 | 房产售价预测 |
评价指标 | 使用均方根误差(RMSE)评估模型预测的准确性,并通过交叉验证进行模型评估。 | 统计学、模型评估 | 数值数据 | 模型性能评估 |
业务意义 | 通过准确预测房产售价,可以为买卖双方提供有价值的参考,帮助决策者优化定价策略。 | 数据分析、业务分析 | 数值数据 | 房产定价决策、投资分析 |
该教程案例详细展示了从数据预处理、特征工程到模型选择与评估的完整过程。在整个过程中,数据清洗是关键的第一步,确保数据的质量有助于后续建模的准确性。同时,特征工程的应用(如特征转换、缺失值处理、类别变量编码等)有效地增强了模型对房产售价的预测能力。最后,集成学习方法的运用提升了模型的整体表现,确保了结果的稳健性。
数据详解
这份数据集包含了有关波士顿地区房价的多个特征数据,旨在对影响房价的因素进行深入分析。数据涉及多个变量,如犯罪率、住宅区的土地比例、工业区比例、教育水平、税率等,这些都可能影响地区的住房市场。每个字段的描述提供了具体的统计信息,如均值、标准差、最小值、最大值等。通过对这些数据的深入分析,可以识别出影响房价的主要因素,并做出预测。
字段名称 | 类型/范围 | 描述信息 |
---|---|---|
CRIM | per capita crime rate by town | 每个城镇的犯罪率,最小值为0.01,最大值为88.98,均值为3.61,标准差为8.59。 |
ZN | proportion of residential land zoned for lots over 25,000 sq.ft. | 住宅区土地比例,最小值为0,最大值为100,均值为11.4,标准差为23.3。 |
INDUS | proportion of non-retail business acres per town | 非零售商业区域的比例,最小值为0.46,最大值为27.7,均值为11.1,标准差为6.85。 |
CHAS | Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) | 查尔斯河虚拟变量,表示该区域是否接壤查尔斯河,均值为0.07。 |
NOX | nitric oxides concentration (parts per 10 million) | 氮氧化物浓度,最小值为0.39,最大值为0.87,均值为0.55,标准差为0.12。 |
RM | average number of rooms per dwelling | 每个住宅的平均房间数,最小值为3.56,最大值为8.78,均值为6.28,标准差为0.7。 |
AGE | proportion of owner-occupied units built prior to 1940 | 1940年之前建造的自有住房比例,最小值为2.9,最大值为100,均值为68.6,标准差为28.1。 |
DIS | weighted distances to five Boston employment centres | 到五个波士顿就业中心的加权距离,最小值为1.13,最大值为12.1,均值为3.8,标准差为2.1。 |
RAD | index of accessibility to radial highways | 径向高速公路的可达性指数,最小值为1,最大值为24,均值为9.55,标准差为8.7。 |
TAX | full-value property-tax rate per $10,000 | 每$10,000的物业税率,最小值为187,最大值为711,均值为408,标准差为168。 |
PTRATIO | pupil-teacher ratio by town | 每个城镇的师生比例,最小值为12.6,最大值为22,均值为18.5,标准差为2.16。 |
B | B=1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town | 表示每个城镇中黑人比例的变量,最小值为0.32,最大值为397,均值为357,标准差为91.2。 |
LSTAT | % lower status of the population | 低收入群体的比例,最小值为1.73,最大值为37.97,均值为12.7,标准差为7.13。 |
MEDV | Median value of owner-occupied homes in $1000’s | 自有住房的中位数房价(以千美元为单位),最小值为5,最大值为50,均值为22.5,标准差为9.19。 |
该数据集中的字段涵盖了多种影响房价的社会经济因素。犯罪率(CRIM)与其他字段如教育水平(PTRATIO)、商业面积(INDUS)以及土地使用(ZN)等变量相互作用,最终共同决定了某一地区的房地产市场。每个字段的统计描述帮助我们了解数据的基本分布特征,并为后续的深入分析提供了必要的背景。
案例分析
这段代码实现了一个基于房产数据的价格预测模型,其中包含了数据的清洗、预处理、特征工程、模型训练及评估等步骤。主要使用了多种回归模型,包括线性回归、岭回归、LASSO回归和XGBoost、LightGBM等机器学习算法。
数据加载与合并
代码读取了训练集和测试集,并将其按列合并成一个统一的数据集,这有助于后续统一处理训练集和测试集中的特征。接着,通过检查训练集和测试集中的Id
字段,找出了重复的ID并进行了删除,确保数据的唯一性。
train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')
# 合并训练集和测试集
all_data = pd.concat((train.loc[:,'MSSubClass':'SaleCondition'], test.loc[:,'MSSubClass':'SaleCondition']))
提供的数据是一个房地产销售数据集,目标是预测每处房产的售价(SalePrice
)。该数据集包含了众多与房产相关的特征,如房产的建筑类型、位置、面积、房屋条件、车库信息等。每个特征代表了影响房产售价的不同方面,例如,MSSubClass
代表建筑类型,LotArea
代表房产的面积,YearBuilt
代表房产的建造年份等。通过分析这些特征与售价之间的关系,可以帮助构建预测模型。数据集中还包括许多质量和条件相关的特征(如 OverallQual
、ExterQual
等),这些都是判断房产质量和价值的重要因素。
特征名称 | 描述 |
---|---|
SalePrice | 房产的售价(目标变量) |
MSSubClass | 建筑类型 |
MSZoning | 一般的分区分类 |
LotFrontage | 与财产相连的直线英尺 |
LotArea | 方尺尺寸 |
Street | 访问类型的道路 |
Alley | 小巷的访问类型 |
LotShape | 一般形状的财产 |
LandContour | 平坦的财产 |
Utilities | 可用的工具类型 |
LotConfig | 很多配置 |
LandSlope | 斜率的财产 |
Neighborhood | 在埃姆斯城范围内的物理位置 |
Condition1 | 靠近主路或铁路 |
Condition2 | 靠近主路或铁路(如果有第二个) |
BldgType | 住宅类型 |
HouseStyle | 住宅风格 |
OverallQual | 整体材料和成品质量 |
OverallCond | 总体状况评级 |
YearBuilt | 原始施工日期 |
YearRemodAdd | 改变日期 |
RoofStyle | 屋顶类型 |
RoofMatl | 屋顶材料 |
Exterior1st | 外观上覆盖的房子 |
Exterior2nd | 房屋外盖(如果超过一种材料) |
MasVnrType | 表层砌体类型 |
MasVnrArea | 方尺砌体单板面积 |
ExterQual | 外部材质 |
ExterCond | 外部材料的现状 |
Foundation | 基础类型 |
BsmtQual | 地下室的高度 |
BsmtCond | 地下室的一般情况 |
BsmtExposure | 走出去或花园层的地下室墙 |
BsmtFinType1 | 地下室完工面积 |
BsmtFinSF1 | 1型完成平方英尺 |
BsmtFinType2 | 第二完工区域的质量(如果有的话) |
BsmtFinSF2 | 2型完成平方英尺 |
BsmtUnfSF | 地下室未完工的平方英尺 |
TotalBsmtSF | 基底面积总平方英尺 |
Heating | 加热类型 |
HeatingQC | 加热质量和条件 |
CentralAir | 中央空调 |
Electrical | 电气系统 |
1stFlrSF | 一楼平方英尺 |
2ndFlrSF | 二楼平方英尺 |
LowQualFinSF | 质量低劣的平方英尺(所有楼层) |
GrLivArea | 以上等级(地面)居住面积平方英尺 |
BsmtFullBath | 地下室全浴室 |
BsmtHalfBath | 半地下室卫生间 |
FullBath | 完整的浴室年级以上 |
HalfBath | 洗澡一半以上年级 |
Bedroom | 地下室以上的卧室数 |
Kitchen | 厨房数量 |
KitchenQual | 厨房质量 |
TotRmsAbvGrd | 所有房间均超过等级(不包括浴室) |
Functional | 家庭功能评级 |
Fireplaces | 壁炉数量 |
FireplaceQu | 壁炉质量 |
GarageType | 车库的位置 |
GarageYrBlt | 车库建设年份 |
GarageFinish | 车库内部装修 |
GarageCars | 汽车容量车库的大小 |
GarageArea | 车库的平方英尺 |
GarageQual | 车库质量 |
GarageCond | 车库条件 |
PavedDrive | 道路车道 |
WoodDeckSF | 木甲板面积(平方英尺) |
OpenPorchSF | 开敞阳台面积(平方英尺) |
EnclosedPorch | 围成方尺 |
3SsnPorch | 三季门廊面积(平方英尺) |
ScreenPorch | 屏风玄关面积(平方英尺) |
PoolArea | 游泳池面积(平方英尺) |
PoolQC | 池质量 |
Fence | 栅栏质量 |
MiscFeature | 其他类别不包括的杂项特征 |
MiscVal | 杂项功能的美元价值 |
MoSold | 月销售 |
YrSold | 年销售 |
SaleType | 销售类型 |
SaleCondition | 销售条件 |
这些特征展示了不同类型的房产信息,其中包括房屋的基础设施、外观、装修质量、大小、位置等多维度的特征,帮助分析和预测房产的售价。
数据清理与缺失值处理
在数据清理部分,代码处理了多个缺失值。通过根据数据特性填充缺失值(例如将没有通道访问的Alley
列填充为"None"),将其他类别缺失值填充为“None”或0等合理值。同时,数值型特征的缺失值被填充为中位数。
def fill_missing(dataset):
dataset.loc[:, "Alley"] = dataset.loc[:, "Alley"].fillna("None")
dataset.loc[:, "BedroomAbvGr"] = dataset.loc[:, "BedroomAbvGr"].fillna(0)
dataset.loc[:, "BsmtQual"] = dataset.loc[:, "BsmtQual"].fillna("No")
...
return dataset
异常值处理
通过绘制散点图来观察房价和居住面积之间的关系,代码识别并去除了一些异常值,例如去除了那些居住面积大于4000且售价小于300000的异常数据点。
fig, ax = plt.subplots()
ax.scatter(x = train['GrLivArea'], y = train['SalePrice'])
plt.show()
# 处理离群值
train = train.drop(train[(train['GrLivArea']>4000) & (train['SalePrice']<300000)].index)
数据分布处理
房价目标变量SalePrice
原本的分布并不符合正态分布,因此,代码通过对其进行对数变换(np.log1p
)使其更符合正态分布,这对许多回归模型的性能有很大帮助。
train["SalePrice"] = np.log1p(train["SalePrice"])
sns.distplot(train['SalePrice'], fit=stats.norm)
特征工程
特征工程部分创建了多个新特征,如简化房屋质量的等级,将数值型的特征(如OverallQual
)转换为类别特征。并且通过组合不同特征,生成了新的合成特征,如房屋整体评分、车库评分等。
def new_feature(dataset):
dataset["SimplOverallQual"] = dataset.OverallQual.replace({1 : 1, 2 : 1, 3 : 1, # bad
4 : 2, 5 : 2, 6 : 2, # average
7 : 3, 8 : 3, 9 : 3, 10 : 3 # good
})
...
return dataset
模型训练与评估
接下来,使用不同的回归模型(如线性回归、岭回归、LASSO回归等)对数据进行训练。并通过交叉验证(cross_val_score
)评估模型的表现。每个模型都有其特定的训练过程和参数调整。
例如,岭回归通过RidgeCV
实现自动选择最佳的正则化参数(alpha
),而LASSO回归通过LassoCV
调整学习率。
lr = LinearRegression()
lr.fit(X_train, y_train)
ridge = RidgeCV(alphas=[0.01, 0.03, 0.06, 0.1, 0.3, 0.6, 1, 3, 6, 10, 30, 60])
ridge.fit(X_train, y_train)
模型预测与残差分析
通过训练好的模型进行预测,并使用RMSE
(均方根误差)来评估模型在训练集和验证集上的表现。代码还绘制了残差图,以便更直观地观察模型的偏差。
plt.scatter(y_train_pred, y_train_pred - y_train, c="blue", marker="s", label="Training data")
plt.scatter(y_test_pred, y_test_pred - y_test, c="lightgreen", marker="s", label="Validation data")
集成学习
在不同的模型中,集成方法(如平均多个模型的预测结果)得到了应用。AveragingModels
类实现了简单的模型集成方法,该方法通过将多个模型的预测结果进行平均来获得最终的预测结果。
class AveragingModels(BaseEstimator, RegressorMixin, TransformerMixin):
def __init__(self, models):
self.models = models
def fit(self, X, y):
self.models_ = [clone(x) for x in self.models]
for model in self.models_:
model.fit(X, y)
return self
def predict(self, X):
predictions = np.column_stack([
model.predict(X) for model in self.models_
])
return np.mean(predictions, axis=1)
通过集成不同的回归模型(如Lasso回归、梯度提升回归、XGBoost等),模型的稳定性和准确性得到了提高。
最终提交结果
最后,将最终的预测结果写入CSV文件以供提交。
sub = pd.DataFrame()
sub['Id'] = test_ID
sub['SalePrice'] = ensemble
sub.to_csv('submission.csv', index=False)
整个过程涵盖了从数据加载、清洗、特征工程,到模型训练与评估,再到最终的预测与提交,全面地演示了如何通过机器学习方法预测房产价格。
总结
通过本案例,可以深入了解如何运用数据处理与回归模型来预测房产价格。数据清洗、特征工程、模型训练及评估等过程逐步完善了预测精度,不同回归模型的应用展现了在处理房产数据时的多样性与复杂性。利用集成学习和模型融合方法,模型的稳定性和预测精度得到了有效提升。
未来,随着数据处理技术和回归算法的不断发展,房产价格预测将在实时性、准确性和可扩展性等方面取得进一步突破。结合大数据与人工智能,未来的预测模型将更加智能化,能够为房地产行业提供更具参考价值的决策支持。