项目网址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques
项目要求:用79个特征预测房价。
先加载数据吧。
1 | # 加载数据 |
有81列数据,其中一列是预测目标即房价,其它80列为特征。有很多缺失值。
把训练集和测试集合并到一起,进行特征工程。
1 | # 将训练数据和训练数据合并到一起 |
下面进行数据处理,先用最简单的方法,抛弃所有有缺失值的特征。
1 | # 数据处理 |
只剩47列了,剩下的都丢弃了。
现在再将数据拆分为训练集和测试集。
1 | # 将数据集重新分割为训练集和测试集 |
接下来进行特征工程,最简单的做法,把所有特征统统选入。但后来发现有的特征不是数值类变量,不能直接用,干脆随便选两个吧。
建模,用多元线性回归。
1 | # 建模,用多元线性回归。 |
生成提交文件提交看看。
1 | # 生成提交文件 |
提交到kaggle看看。
排4217名,果然很差。现在开始改进吧。
数据比较复杂,还是看看别人的吧。[1]
导入库
1 | import numpy as np |
导入数据,丢弃”Id”列
1 | # 载入数据 |
接下来寻找异常值,画GrLivArea与房价的关系。
1 | # 数据处理 |
可以看到右下角有一些异常值,可以删除它们。
1 | # 删除异常值 |
不能总是这么删除异常值,尤其是测试集上也有异常值时。
再来分析一下目标变量:SalePrice。
1 | # 研究目标变量SalePrice |
数据是右偏的,而线性模型希望数据是正态分布的,因此需要对数据进行处理。
对数据进行对数转换。
1 | # 对SalePrice进行对数转换 |
OK了,比处理以前好多了。
下面进行特征工程。
首先将训练集数据和测试集数据合并到一起。
1 | # 将训练集和测试集合并到一起 |
看看缺失值。
1 | # 处理缺失值 |
缺失值比例
Missing Ratio
PoolQC 99.691
MiscFeature 96.400
Alley 93.212
Fence 80.425
FireplaceQu 48.680
LotFrontage 16.661
GarageQual 5.451
GarageCond 5.451
GarageFinish 5.451
GarageYrBlt 5.451
GarageType 5.382
BsmtExposure 2.811
BsmtCond 2.811
BsmtQual 2.777
BsmtFinType2 2.743
BsmtFinType1 2.708
MasVnrType 0.823
MasVnrArea 0.788
MSZoning 0.137
BsmtFullBath 0.069
再画图看看
1 | # 画图看看 |
绘图看看特征与SalePrice的相关性。
1 | # 特征与SalePrice的相关性 |
具体处理缺失值
1 | # 处理缺失值 |
没有缺失值了。
接着进行进一步的特征工程。
转换实际上是分类变量的数值变量
1 | # 转换实际上是分类变量的数值变量 |
对一些分类变量进行标签编码。
1 | # 对一些分类变量进行标签编码 |
再新增一个特征,将所有面积数相加。
接着处理偏态特征
1 | # 将所有面积特征相加 |
对高偏态数据进行Box Cox转换。
1 | # 进行Box Cox转换 |
然后进行建模了。
先导入相关的库。
1 | from sklearn.linear_model import ElasticNet, Lasso, BayesianRidge, LassoLarsIC |
接着定义一个交叉验证策略
使用sklearn的cross_val_score函数,在这之前先将数据打乱。
1 | # 先建立交叉验证策略 |
接下来就正式开始建模了,拉索回归(LASSO Regression)对异常值比较敏感,使用sklearn的Robustscaler()函数来处理。
1 | # 建模 |
结果
下面进行模型堆栈。
最简单的方法,将基本模型取均值。
创建一个类来实现。
1 | # 模型堆栈,求模型平均值 |
结果:
平均基本模型得分为: 0.1085 (0.0070)
下面进行更复杂一些的stacking。在平均基本模型上增加一个元模型,并用基础模型的预测来训练元模型。
分四步:
①将训练集划分为两个互斥的部分
②用其中的一部分训练众多基本模型
③用另一部分进行测试。
④用第三步的预测作为输入,正确的目标变量作为输出训练更高级的成为元模型的学习器。
1 | # 加入元模型的stacking |
结果为
元模型得分为: 0.1085 (0.0070)
跟原来一样(原文没有把全部模型加入)
最后进行预测生成提交文件
1 | # 生成预测 |
结果
0.07330605313530042
RMSLE score on train data:
0.07614183169332166
提交到kaggle里看看。
改进蛮大,排名401,进前10%了。
本文代码: https://github.com/zwdnet/MyQuant/tree/master/39
对于模型集成,还不太明白,下次专门研究下这个问题。
参考文献
[1]https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地