房价预测
目录
- 一、认识数据
- 二、定性分析
- 2.1 属性的意义
- 2.2 属性分析
- 三、缺失值处理
- 3.1 缺失值举例
- 3.2 缺失值统计
- 3.3 填充缺失值
- 3.4 格式转换
- 四、特征分析
- 4.1 房价分析
- 4.2 房价属性的关系
- 4.3 相关性
- 4.5 特征选取
- 五、回归前的准备
- 5.1 特征向量化
- 5.2 测试集预处理
- 六、回归
- 6.1梯度提升回归
- 6.2 提交尝试
- 6.3 改进再提交
- 七、总结与展望
- 八、参考文献
一、认识数据
House Prices数据集分为train(即训练)数据和test(即测试)数据,其中,训练集含有1460个样本,80个属性(包括序号),一个标签(SalePrice,即房价);测试集含有1459个样本,80个属性。
需要做的工作:根据测试集的属性预测每个样本的房价。
图1
二、定性分析
2.1 属性的意义
SalePrice 以美元出售的房产价格。
MSSubClass 建筑类
MSZoning 城市总体规划分区
LotFrontage 连接物业的街道线
LotArea: Lot size in square feet 方块大小
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 销售条件
2.2 属性分析
可以看出,标签为房价,而对于79个属性主要分为几分方面:
(1)房子地理位置:
MSSubClass、MSZoning、LotFrontage、LotArea、Street、Alley、LotShape、LandContour、Utilities、LotConfig、LandSlope、Neighborhood、Condition1、Condition2
(2)房子风格:
BldgType、HouseStyle、OverallQual、OverallCond
(3)房子装修:
YearBuilt、YearRemodAdd、RoofStyle、RoofMatl、Exterior1st、Exterior2nd、MasVnrType、MasVnrArea、ExterQual:
ExterCond
(4)地下室:
Foundation、BsmtQual、BsmtCond、BsmtExposure:、BsmtFinType1、BsmtFinSF1、BsmtFinType2、BsmtFinSF2、BsmtUnfSF、TotalBsmtSF
(5)冷暖气:
Heating、HeatingQC、CentralAir、Electrical
(6)居住面积:
1stFlrSF、2ndFlrSF、LowQualFinSF、GrLivArea
(7)功能房间:
BsmtFullBath、BsmtHalfBath、FullBath、HalfBath、Bedroom、Kitchen、KitchenQual、TotRmsAbvGrd、Functional
(8)车库:
GarageType、GarageYrBlt、GarageFinish、GarageCars、GarageArea、GarageQual、GarageCond、PavedDrive
(9)其他面积:
WoodDeckSF、OpenPorchSF、EnclosedPorch、3SsnPorch:、ScreenPorch、PoolArea
(10)销售:
MoSold、YrSold、SaleType、SaleCondition
(11)其他:
Fireplaces、FireplaceQu、PoolQC、Fence、MiscFeature、MiscVal
假如数据真实可靠,则从实际情况考虑,对于一个房子的价格,最重要的属性首先应该有:地理位置、面积、地下室、冷暖气、车库、房子质量,还有会影响到房价的有:销售条件如时间和方式。所以先可以着重讨论这些方面的属性。
三、缺失值处理
3.1 缺失值举例
图中NA就是缺失值:
图2
3.2 缺失值统计
训练集数据缺失情况, 和它们对应的意义为:
图3
3.3 填充缺失值
缺失数据的变量有很多,处理情况可以分为如下几类:
(1)缺失多
直接数据集中剔除哪些存在大量缺失值的变量 缺失量比较多的PoolQC、MiscFeature、Alley、Fence、FireplaceQu是由于房子没有泳池、特殊的设施、旁边的小巷、篱笆、壁炉等设施。 由于缺失量比较多,缺失率超过40%,我们直接移除这几个变量。
(2)车库的属性
由于有些房子没有车库,造成车库相关的属性缺失,对于这种情况,我们有missing填充,同时对于车库建造时间的缺失,我们用1900填充,表示车库是年久的,使其变得不重要。
(3)与装修有关
有些房子重装修过,但是有些房子是没重装修过的,所有有关的属性可能确实。这是使用missing填充装修情况,用0填充装修面积。
(4)其它确实较少的属性
由于Electrical等属性缺失较少,可以使用众数填充:
3.4 格式转换
为了使得特征分析顺利进行,首先对字符串型的属性转换到数值型,其中,字符型的属性为:
转换的规则是:对于字符型属性,按照各个类型的属性的不同取值时房价的均值排高低,按此顺序从低往高,给属性的不同取值赋予1,2,3,4……,使得其变成数值型。
经过转换后的属性全部为数值型,这时有利于进行分析。
四、特征分析
4.1 房价分析
首先对房价进行分析,画出房价的分布图为:
图4
从图中可以看出关于房价分布图有几个特点:
(1)偏离正态分布
(2)有明显的正偏态
(3)有峰值
进一步求得
偏度: 1.882876
峰度: 6.536282
我们可以知道,在数据中房价主要集中在区间[100000,300000]中,而有关小于100000,和大于300000的房价是偏向异常数据,在进一步考虑时,应该适当合理区分这些数据。
4.2 房价属性的关系
在此先分析房价与属性的关系,其中数值型的属性有,字符型的在上面已展示。
在定性前面分析知,面积等属性与房价是有关系的,下面将分析一下它们的关系,部分情况如图所示:
图5
从图中还是很明显地看出, “GrLivArea”和“TotalBsmtSF”似乎与“SalePrice”是线性相关的。这两种关系都是正的,这意味着当一个变量增加时,另一个变量也会增加。 “OverallQual”和“YearBuilt”似乎也与“SalePrice”有关。这种关系似乎在“Overallqual”的情况下更加强烈,在这种情况下,箱型图显示了销售价格是如何随着整体质量而增长的。
相同的情况分析其它属性得到与房价近似正相关关系的属性有:
Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars
4.3 相关性
首先进行对数值型的属性进行相关系数分析,期待发现它们之间的相关性。
图6
这个热图是快速浏览特征与价格关系的最好方法。(颜色越深,对应的像个特征的相关性越大)
有两个红色的方块引起了我的注意。第一个是“TotalBsmtSF”和“1stFlrSF”变量,第二个是“GarageX”变量。这两种情况都显示了这些变量之间的相关性有多大。实际上,这种相关性是如此强烈,以至于它可以表明多线性的情况。如果我们考虑这些变量,我们可以得出结论,它们给出的信息几乎是相同的,所以多细胞性确实发生了。热图很好地发现了这种情况,在特征选择的主导问题中,像我们这样的问题,它们是必不可少的工具。
另一件引起我注意的事情是“SalePrice”的相关性。我们可以看到我们著名的“GrLivArea”,“TotalBsmtSF”,以及“OverallQual”与其具有很大相关性。但我们也可以看到许多其他的变量的颜色也很深,这些变量应该被考虑进去。这就是我们接下来要做的。
现在有上面热点图选择与SalePrice 相关性最大的9个特征,进一步分析它们的相关性。
图7
这几个属性之间的信息是否互相包含?或者是,它们之间是否存在线性性?若存在,则可知只需要选取某些属性,就可以代表所有属性,而不必讲所有属性都考虑。
图8
从图中可以看出,确实有些属性之间信息重叠,如GrLivArea 和OverallQual之间就存在正相关性,还有GrLivArea和TotalBsmtSF之间也存在正相关性,OverallQual和TotalBsmtSF存在较弱的正相关性。定性分析可知,地下室面积TotalBsmtSF与居住面积当然有关系,除去没有地下室的极少数房子,其它房子地下室面积大,伴随着房子面积大,反过来也成立。
进一步采用皮尔逊相关分析法对所有属性和房价进行分析:
图9
可以清楚地看出与房价高度相关的属性有:
OverallQual、Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、YearBuilt、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars、GrLivArea
4.5 特征选取
根据以上讨论,去掉部分互相相关性强的属性,选择作为房价分析的特征有:
OverallQual、Foundation、Heating、Electrical、SaleType、2ndFlrSF、SaleCondition、GarageArea、YearRemodAdd、YearBuilt、ExterQual、BsmtFullBath、1stFlrSF、TotalBsmtSF、BsmtUnfSF、CentralAir、Neighborhood、GarageCars、
五、回归前的准备
5.1 特征向量化
首先采用DictVectorizer进行特征向量化,目的是为了数据归一化(使特征数据方差为1,均值为0)。
5.2 测试集预处理
前面的数据预处理只是对训练集进行,对于测试集,其数据缺失情况如下:
图10
对于选取的属性进行数据预处理,使用均值或众数进行填充缺失值,步骤和训练集的一样。
六、回归
6.1梯度提升回归
现在训练集的选取的属性和标签准备就位,测试集的选取的属性也预处理完毕,可以进行测试集的回归预测了。
为了准确地利用训练集对测试集进行回归,在此我们利用了梯度提升回归即 Gradient Boosting Regression这个方法。
梯度提升回归(Gradient boosting regression,GBR)是一种集成模型,它是一个集成学习算法是一种从它的错误中进行学习的技术。它本质上就是集思广益,集成一堆较差的学习算法进行学习。GBR与一般集成算法的区别是GBR在迭代的时候选择梯度下降的方向来保证最后的结果最好,即是让损失函数在其梯度方向上下降。
6.2 提交尝试
再对输出结果转换为提交要求的格式:
评分标准是均方根误差(RMSE),即是:
提交结果为:0.14922
排名:2497/4989 (50%)
图11
6.3 改进再提交
改进的想法由房价的分布产生,房价分布图为:
图12
根据前面讨论可知,在数据中房价主要集中在区间[100000,300000]中,而有关小于100000,和大于300000的房价是偏向异常数据,在进一步考虑时,应该适当合理区分这些数据。
所以,在此将数据按照房价的大小分为两部分。由于测试集中是没有房价的,在这里想到了GrLivArea属性与房价高度正相关,而且在前面讨论中由于属性间信息重叠,不考虑GrLivArea作为分析房价的特征。
一个很自然的想法是,既然GrLivArea与房价高度正相关,就以GrLivArea作为分隔的属性,将数据分为两部分。经分析GrLivArea的取值,以GrLivArea中值大于等于2500的分为一类,小于2500的分为一类。
现在有4部分数据集:
(1)训练集中GrLivArea大于等于2500的数据集;
(2)训练集中GrLivArea小于2500的数据集;
(3)测试集中GrLivArea大于等于2500的数据集;
(4)测试集中GrLivArea小于2500的数据集;
进行再次回归:
利用上面(1)中数据对(3)进行回归。利用(2)中数据对(4)进行回归。
再次提交得分为:0.14438
排名:2250/4989 (46%)
图13
七、总结与展望
(1)房价预测这个题目看似简单,实质上很有难度,主要是属性很多,而且缺失值也很多,数据预处理有难度。
(2)本文进行数据预处理考虑还简单,可以继续考虑属性间的线性关系程度,以及属性间合并,或属性分拆等。
(3)对于结果,我们还是满意的,经过一番尝试后,排名为45%。若要继续提升,一个方向是将数据集继续分类,分为三类或更多。
八、参考文献
[1]周志华.机器学习[M].北京:清华大学出版社,2016.
[2]Peter Harrington.机器学习实战[M].北京:人民邮电出版社,2013.
[3]韩家炜等.数据挖掘概念与技术[M].北京:机械工业出版社,2012.
[4] House Prices: Advanced Regression Techniques,
https://blog.csdn.net/ns2250225/article/details/72626155
[5] Kaggle房价预测:数据预处理——练习,
https://blog.csdn.net/qilixuening/article/details/75153131