现如今房产成为大多数家庭总资产中占比最大的一部分,也成为国人投资的重要渠道,研究和预测房产价格对我国人民和宏观经济发展都有重要价值。本文对包含房产各项基本信息及价格的数据进行处理,利用包括线性回归、核岭回归、支持向量回归、神经网络、决策树以及集成方法等多种数据挖掘算法对房产价格构建预测模型,并利用均方误差作为指标对各模型作出了相应评价。总体来看,本文根据房产信息对房产价格做出了较好的预测模型,为房地产相关行业与从业人员提供了较有力的决策依据。
关键词: 房价预测;模型比较;线性模型;集成模型
目录
注:本文原本是我与其他4人的数据挖掘课程作业,我是矿工头子,负责建模的数据变换到核方法部分,其他四名矿工分别为:LY(可视化)、Maxjiao (缺失值异常值处理)、AY(神经网络决策树集成模型)、TXW(扩展与总结)。
一、研究背景及意义
1.1 研究背景和研究意义
房地产行业在我国国民经济中占支柱地位,对拉动经济增长起到正向影响的同时也对稳定国内经济有重要作用。[1] 现如今房产成为大多数家庭总资产中占比最大的一部分,也成为国人投资的重要渠道,设想若能对房产价格实现准确预测,就相当于通过减少交易双方对房价估计的不确定性为双方都降低了风险与成本。因此,研究和预测房产价格对我国人民和宏观经济发展的重要性不言而喻。
对于购房者来说,如果通过选定房产的地理位置、面积及楼龄等基本信息可以预测出较为准确的房产价格或价格区间,就对其进一步的购房决策提供了参考依据;对于销售方来说,也可以通过相同的方式获取房产的预测价格,避免定价过高而延长房产在市场上的空置时间或是定价过低造成的利润损失;对于房地产开放商来说,也可以将房产信息和价格层次的对应关系作为支撑做出市场定位与经营决策。
1.2 研究内容简要介绍
本文首先将数据集进行可视化,简单直观地刻画出各变量对房价的影响,其次尝试利用线性模型(包括lasso、ridge、elasticnet)、核方法(kernelridge, svr)、神经网络、决策树和集成模型多种方式对房价做出预测,并以均方误差为指标对各模型做出评价和对比分析。
第一章主要介绍对房地产价格预测和研究的背景和意义,以及本文的主要内容与组织结构。
第二章主要对数据进行介绍,做探索性分析、缺失值处理和异常值处理。
第三章分别介绍了几种回归和分类模型,通过对本文选取的房价预测数据的应用,对模型进行比较并将均方误差作为指标来对模型结果做出评价。
最后一章,主要是对本文整体的研究过程进行总结,并对改进方向以及未来研究作出展望。
二、数据探索性分析与预处理
2.1数据介绍
本文选用的房产信息数据取自kaggle数据库,是美国爱荷华州埃姆斯市的房价数据,其中包含三个数据集,分别为测试集、训练集和测试集的标签数据集,训练集含有1460个样本,测试集含有1459个样本。
此数据共包含变量80个,分为79个属性变量和一个响应变量(即房产价格),其中属性变量含36个数值型变量和43个非数值型变量。按照各变量意义将79个属性变量按下表所示分类(各变量中英文对照表参见附录):
表 1 变量分类
类别 |
所含变量 |
地理位置 |
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、BsmtFinType2、BsmtFinSF2、BsmtUnfSF、TotalBsmtSF |
冷暖气 |
Heating、HeatingQC、CentralAir、Electrical |
居住面积 |
1stFlrSF、2ndFlrSF、LowQualFinSF、GrLivArea |
功能房间 |
BsmtFullBath、BsmtHalfBath、FullBath、HalfBath、Bedroom、Kitchen、KitchenQual、TotRmsAbvGrd、Functional |
车库 |
GarageType、GarageYrBlt、GarageFinish、GarageCars、GarageArea、GarageQual、GarageCond、PavedDrive |
其他面积 |
WoodDeckSF、OpenPorchSF、EnclosedPorch、3SsnPorch:、ScreenPorch、PoolArea |
销售 |
MoSold、YrSold、SaleType、SaleCondition |
其他 |
Fireplaces、FireplaceQu、PoolQC、Fence、MiscFeature、MiscVal |
2.2数据探索性分析
2.2.1数值型变量
本文的响应变量是房产价格,其分布直方图是一个右偏的偏态分布,这表明大部分房子的房价是比较相近的,均在较合理水平;而少部分房产房价偏高。
图 1 房产价格分布直方图
对于数值型的属性变量,首先通过作出其直方图观察其分布,部分可视化结果如下图。通过对变量分布直方图分析可知,数值型变量包含许多离散型的整数变量,用于表明某些特征的个数,如车库容量等。而对于连续型数据来说,一部分变量的直方图与房价的直方图类似,是右偏的偏态分布,如1stFlrSF;同时也有部分变量分布较为极端,数据量仅集中在某个或某几个值,如BsmtFinSF2。
图 2 部分数值型变量分布直方图
为了探究变量之间的关系,对所有数值型变量作相关性热力图(见图4),发现部分属性变量间高度相关,提示须对高度相关的变量作一定处理,同时也有不少变量都与响应变量间有较强的相关关系。
图 3 数值型变量间相关性热力图
最后,对数值型变量作其对于房价的散点图。观察可知,部分数值型变量的值有比较明显的趋势性,如1stFlrSF 和OverallQual(如图4所示),随变量取值的增大,房价也在攀升,并且成线性趋势。
图 4 部分数值型变量散布图
同时,对于同属一个意义类别的变量,由于是对房产同一信息的描述,故而相关性较高,对房价的影响也比较类似。如描述车库的车库面积和车库容量两个变量显然是高度相关的,车库大小基本决定车库容量,故可以选择趋势最为明显的车库面积而去除车库容量来对房价进行描述(两变量分布如图5所示)。
图 5 车库面积与车库容量散布图对比
2.2.2 非数值型变量
对于非数值型的分类变量,作出其关于房价的散点图和盒型图,并将两种图对应观察分析。对于一些变量,大多数数据仅集中在某个普通类别中(例如图6中,变量Condition1数据大多集中于Norm类别),该类别所对应的数据几乎涵盖了所有房价取值,从而无法简单判断该类别对房价的影响;而少量数据分布于特殊类别(例如图6中变量Condition1除Norm以外的其他类别),每一个特殊类别对应房价的分布较为集中,各特殊类别对应房价的分布高低错落。这表明,这些变量在取含样本量较少的类别时对应的房价会有一定倾向,有较强的辨识度,对房价预测可能有重要作用。
图6 部分非数值型变量分布图
有些变量有较多的类别取值,考虑根据房价在每一个类别取值的变化程度来分析,变化越大,表明该变量对房价的影响越大。进一步,为了方便观察,对它们按均值进行了排序。比如变量neighborhood,排序后发现,房价跨度从1万到3万,随该变量取值的变化有较明显的变化趋势(如图7),说明该变量与房价关系较密切。
图 7 变量 Neighborhood 分布图
但也有少数变量在几个类别下样本的数量及分布情况没有显著差别,表示该变量与房价的关系可能较弱。
综合来看,对数据的探索性分析一方面直观展示了各变量的分布情况,也对变量选择提供了一定的依据与支撑。
2.3数据预处理
首先将三个原始数据集进行整合,先将测试集与对应的标签集按照id横向合并,再将训练集与得到的完整测试集纵向合并,在以此得到的新数据集上进行数据处理的相关操作。
2.3.1 重复值与异常值处理
对数据作重复值检测,发现无重复值,故无需处理。
通过对变量作箱线图,发现部分变量异常值较多,但考虑到变量异常值对房价预测有重要价值,故不对异常值做处理。
2.3.2 缺失值处理
首先对数据集按行检测缺失值,发现每行都含有缺失值,缺失率达100%。
再对变量检测缺失值,发现共有35个变量包含有缺失值,其中缺失率最高的有关于游泳池的变量,缺失率高达百分之九十九点六,这也就可以解释了数据行缺失率100%了。
对有较高缺失率的变量,虽然缺失较多,但是在数据预处理阶段,为了保证尽量多的信息被保留下来,所以在预处理阶段不首先考虑数据变量删除。这里结合数据集变量间有相关关系,考虑按照表1的变量分类,利用变量之间的相关性进行缺失值处理。具体操作列举如下:
- 对于游泳池类型变量,利用PoolQC(包含有缺失值)与另一个相关变量PoolArea(不包含有缺失值),筛选出PoolArea有值但PoolQC缺失的数据行,并计算出PoolQC各标签对应的PoolArea的平均面积,通过比较距离,对筛选出的数据行PoolQC变量进行填充,剩余PoolQC为Na的值替换为none值;
- 对于车库类数据:类似于游泳池数据,查找相互之间不匹配数据,作为待处理项目,利用众数填补办法对部分缺失值进行处理。但是在车库数据中包含有一项GarageTrBlt数据,是车库的建成年限是数值类数据,但此处用0替换,显然不合理,所以用建成年限里最小值进行替换即1895替换;
- 对于单板类变量:单板数据同样采用空值和0值进行替换,但是在单板数据中存在有异常值,即存在有部分MasVnrType类型为None,但是Area!=0的数据,这个就需要调用之前得到的原始数据变量标签统计,发现在原数据中就存在有空值,这就导致了MasVnrType类型为None,但是Area!=0数据的存在,但是由于三个标签的均值相差不大,不能很好地区分,所以此处选择删去这类异常值;
- 对于街道线数据:考虑街道线填充空值不合适,所以通过街道线和Neighborhood(房屋附近位置)的相关关系进行填充,此处利用groupby函数进行填充。
对于缺失率低于0.07%的变量,经计算发现其缺失值小于等于2,所以对于这类变量考虑使用简单的插补法,或者数据删除进行处理。
最后将经过预处理的数据按照原始数据的训练集和测试集比例重新拆分得到处理过后的训练集和测试集。
三、数据挖掘建模与分析
3.1数据变换
3.1.1 响应变量
通过对数值型变量SalePrice绘制直方图、密度图和计算偏度峰度发现,响应变量分布呈现右偏、高峰度及偏离正态的特点;再对训练数据做K-S检验,Kolmogorov–Smirnov 检验基于累积分布函数,用于检验一个经验分布是否符合某种理论分布,检验结果D = 0.12369, p-value < 2.2e-16,则不拒绝原假设,样本点不符合正态分布。
故对其做对数平滑变换,从而减少其峰度和偏度,使其更符合回归模型数据的正态性假定;再对变换后的数据进行K-S检验,检验结果D = 0.52055, p-value = 0.9494,则不拒绝原假设,认为变换后的数据符合正态理论分布,适合进一步的回归建模。
3.1.2 自变量
对于连续型自变量,对峰度较高的变量作box-cox变换,box-cox变换是一种常用的数据变换方法,这里用于让分布在不丢失信息的前提下,具有更好的性质(独立性、方差齐性、正态性等)[3],以便得到更好的模型。
对于分类型自变量,将其转换为哑变量,进一步提高模型精度,检验不同变量类别对响应变量的影响。
3.2统一评价与调参方法
本文采用交叉验证均方根误差作为模型评价指标。均方根误差(RMSE)是预测值与真实值偏差的平方与观测次数n比值的平方根,即:
能够很好地衡量预测值同真值之间的偏差。进一步通过k重交叉验证,提高所得指标的精度和稳定性,本文中采用5折交叉验证方法。
采用循环搜索以及python-sklearn里常用的网格搜索(GridSearchCV)和随机搜索(RandomizedSearchCV)方法对模型进行调参。
3.3线性模型
在线性模型部分本文选取了OLS线性回归、Lasso、Ridge及Elastic Net四种模型对本文数据集进行应用。其中OLS线性回归通过最小化误差的平方和寻找数据的最佳函数匹配,模型原理较简单,这里主要对后三种模型原理做简要介绍。
Lasso方法在普通线性模型中增加L1惩罚项,对于普通线性模型Lasso估计为
其中λ为调节系数,对调节系数的适当选择可以将不显著的变量系数压缩至零,产生稀疏结果,从而降低自变量的维度,达到减小模型复杂度的作用[4]。
而Ridge方法是L2正则化,在普通线性模型中的估计为
其中t为调节系数。可以发现Ridge估计是有偏的,是对最小二乘估计以同一比例的压缩结果,没有稀疏性,且任一系数都不会被压缩至零,保留了模型的全部变量。
在Lasso方法回归太过(太多特征被稀疏为0),而Ridge方法也正则化不够(回归系数衰减太慢)的时候,使用ElasticNet回归来综合L1正则化项和L2正则化项可以得到比较好的结果,其估计公式为:
将以上四种模型应用于本文所选数据集,得到评价指标对比结果如下表所示,可以看出普通线性回归的结果由于对噪音十分敏感得到的结果稳定性极低,而正则化能够极大地提升线性模型的预测准确度。
表 2 线性模型结果对比
3.4核方法
核方法 是一类把低维空间的非线性可分问题,转化为高维空间的线性可分问题的方法,可以用于数据为非线性可分的算法。这一部分我们选用了核岭回归(KRR) 与支持向量回归(SVR)两种模型。
KRR和SVR都通过采用核技巧来学习非线性函数,它们的损失函数不同。一般来说,对于中型训练集(小于1000个样本),拟合KRR比SVR快; 然而,对于更大的训练集,SVR可以更好地扩展。关于预测时间,由于学习的稀疏解,所以SVR快于KRR。但需要注意稀疏程度以及预测时间取决于SVR的参数。
两种模型的应用结果对比如下表,可以看到支持向量回归模型总体上结果不如核岭回归模型,但两线性核模型表现都不错。
表 3 KRR与SVR评价指标(RMSE)对比
3.5神经网络与决策树
神经网络是一种模仿生物神经网络的结构和功能的数学模型或计算模型,由大量的节点(或称“神经元”)和之间相互的联接构成,每个节点代表一种特定的输出函数,称为激活函数(activation function),每两个节点间的联接都代表一个对于通过该连接信号的加权值,称之为权重。网络的输出依网络的连接方式、权重值和激励函数的不同而不同。
表 4 神经网络原理图示
决策树算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。具体构造方法简述为:构建根节点,选择一个最优特征,对训练数据集进行分割,使得各个子集有一个在当前条件下最好的分类,构建出相应的节点,递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止,这样就生成了一颗决策树。
分类树叶节点是一个类别,而回归树叶节点是一个个具体的值。当特征数据是连续值时,就需要先对数据进行离散化处理。(如考试得分0~100,1~59为不及格,60~80为达标,80~100为优秀)这样离散处理后的数据就可以用来构建决策树了。
应用两模型得到结果对比如下表所示。
表 5 神经网络与决策树结果对比
指标 |
神经网络 |
决策树 |
RMSE均值 |
0.0171 |
0.0222 |
RMSE标准差 |
0.0013 |
0.0013 |
3.6集成模型
集成学习是一种机器学习范式,训练多个模型解决相同的问题,并将它们结合起来以获得更好的结果。当多个模型被正确组合时,可以得到更精确的模型。本文中选用了bagging和stacking两种集成方法。bagging 的目标在于生成比单个模型稳定性更好的集成模型,而stacking 通常考虑的是异质弱学习器(不同的学习算法被组合在一起),并通过训练一个元模型来组合它们,然后基于这些弱模型返回的多个预测结果输出最终的预测结果。
两种集成方法得到的结果分别为:
表 6 bagging集成模型结果
指标 |
SVR |
随机森林 |
ElasticNet |
RMSE均值 |
0.0357 |
0.0174 |
0.0142 |
RMSE标准差 |
0.0025 |
0.0005 |
0.0017 |
表 7 stacking 集成模型结果
指标 |
Ridge |
随机森林 |
MLPRegressor |
RMSE均值 |
0.0185 |
0.0182 |
0.0160 |
RMSE标准差 |
0.0014 |
0.0014 |
0.0014 |
四、扩展与总结
4.1扩展一:RobustScaler方法
由于本文采用的数据集异常值较多且有重要价值,考虑到异常点容易在数据标准化后失去其离群特征,故在数据标准化时考虑采用RobustScaler方法做处理,此方法根据分位数范围(默认为IQR:Interquartile Range)删除中位数并缩放数据,鲁棒性很好。增加RobustScaler处理后,再次将数据带入上文模型,rmse前后对比如下。
表 8 RobustScaler扩展结果
从上表可以看出,ridge,svr-rbf,svr-poly,krr-rbf,krr-poly,MLPregressor和decisiontree的rmse具有轻微改进,总体而言,增加RobustScaler算法后效果较好。
4.2扩展二:变量选择算法尝试
首先,根据探索性分析得到的结果,选出分布图趋势较为明显或辨识度较高的变量,再结合实际情况,选出与购房者在购买房产时可能会主要考虑的各方面需求相关的变量,对重要变量作初步汇总。
由于含有高度相关的变量,考虑到传统lasso方法在处理高度相关变量时有一定局限性,因此采取通过生成数据的bootstrap样本并对每个样本做基本特征选择算法的方式做稳定性选择。[2]
最终选择出的变量汇总如下表:
表 9 变量选择结果
变量名 |
中文对照 |
类别 |
MSSubClass |
建筑类 |
地理位置 |
MSZoning |
城市总体规划分区 |
地理位置 |
Alley |
巷类型 |
地理位置 |
Neighborhood |
城市范围内的物理位置 |
地理位置 |
Condition1 |
接近主干道或铁路 |
地理位置 |
Condition2 |
接近主路或铁路 |
地理位置 |
BldgType |
住宅类型 |
风格 |
OverallQual |
整体质量和表面质量 |
风格 |
RoofStyle |
屋顶类型 |
装修 |
RoofMatl |
屋顶材料 |
装修 |
Exterior1st |
房屋外墙 |
装修 |
1stFlrSF |
一楼面积 |
居住面积 |
GrLivArea |
高档(地面)居住面积 |
居住面积 |
Street |
道路入口类型 |
地理位置 |
LotConfig |
地产配置 |
地理位置 |
HouseStyle |
居家风格 |
风格 |
OverallCond |
总体状态额定值 |
风格 |
YearBuilt |
原施工日期 |
装修 |
BsmtQual |
地下室的高度 |
地下室 |
CentralAir |
空调 |
冷暖气 |
Electrical |
电气系统 |
冷暖气 |