数据与模型融合波士顿房价回归建模预测

发布于:2025-08-18 ⋅ 阅读:(13) ⋅ 点赞:(0)

在房地产行业中,精确的房产价格预测对买卖双方决策至关重要。传统的价格估算方法常常依赖于人为经验,而随着数据科学的发展,利用机器学习算法进行价格预测已经成为主流趋势。本案例以波士顿房价数据集为基础,展示了如何通过数据清洗、特征工程和回归模型来预测房产的售价。

本文将详细介绍如何在数据预处理、特征转换、回归建模等方面应用不同的机器学习方法,最终实现对房产价格的精准预测,帮助决策者优化市场策略与投资分析。

案例概述

本案例数据地址 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 代表房产的建造年份等。通过分析这些特征与售价之间的关系,可以帮助构建预测模型。数据集中还包括许多质量和条件相关的特征(如 OverallQualExterQual 等),这些都是判断房产质量和价值的重要因素。

特征名称 描述
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)

整个过程涵盖了从数据加载、清洗、特征工程,到模型训练与评估,再到最终的预测与提交,全面地演示了如何通过机器学习方法预测房产价格。

总结

通过本案例,可以深入了解如何运用数据处理与回归模型来预测房产价格。数据清洗、特征工程、模型训练及评估等过程逐步完善了预测精度,不同回归模型的应用展现了在处理房产数据时的多样性与复杂性。利用集成学习和模型融合方法,模型的稳定性和预测精度得到了有效提升。

未来,随着数据处理技术和回归算法的不断发展,房产价格预测将在实时性、准确性和可扩展性等方面取得进一步突破。结合大数据与人工智能,未来的预测模型将更加智能化,能够为房地产行业提供更具参考价值的决策支持。


网站公告

今日签到

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