经过了一段时间的学习,对机器学习常见的算法有了一定的了解,是时候找个实战项目来检验自己这段时间学习的结果了。
最终选择了kaggle上房价预测的问题: kaggle房价预测比赛入口
kaggle为我们提供了详细的住宅数据信息,而我们的任务就是利用这些数据来预测房屋的售价,一个明确的回归问题,我的目标:准就完事了。
拿到数据集,先来看看数据长什么样吧:
在训练集与测试集数据合并后,有80个特征,而且多数特征都有缺失值,接下来首要任务就是处理掉异常值与缺失值。
房屋售价与房屋面积应该是息息相关的,所以来看看二者之间的关系:
可以看到,二者之间线性关系比较强,而且有少量异常点,这里我将右边的四个点去掉:
接下来处理空值:定义了一个查看空值的函数,方便使用:
可以看到,这些空值之间有一定联系,比如Garage代表车库相关的信息,所以接下来批量处理。
这三个特征都是缺失值占比很大,实际代表没有,因此填充为none
车库相关特征:
通过一起查看这些特征的数据,发现车库面积为0的实际代表没有车库:
因此可以放心的将数值类特征填充为0,类别类型特征填充为none:
用同样的方式处理地下室相关特征:
这五个类别类型特征缺失值都很少,所以用它们的众数来填充
对于年份特征,先填充为none,等下进行labelencode编码
剩下的缺失值填充过程就不一一展示了,与上面处理类似,最后还剩一个距街道距离
至此为止,缺失值的处理完成,接下来进行特征工程,对数值类型的变量观察其数据分布的偏度,若偏度过大,对其进行对数转换,提高模型精度,对于类别类型,进行独热编码。
首先处理年份类型的数据:
这些数值变量其实是类别类型,因此将其转化为字符串,
接下来处理数值类型:
处理基本完成,进行独热编码并重新拆分训练集与测试集:
导入鲁棒标准化,对数据标准化处理,降低异常数据处理:
由于独热编码后新增了许多特征,维度较高,所以利用方差齐性检验和弹性网络模型进行了特征的选择:
最终确定在250个特征:
上面在缺失值处理的时候,发现许多特征间联系较强,可能存在严重的多重共线性,因此对数据集还进行了PCA的处理来处理数据之间的相关性。
接下来的任务就是建模了,选取了常见的回归模型,包括ridge,弹性网络,svr,随机森林,gbdt等,
其中,ridge,弹性网络,svr调参后在验证集上效果还行:
对于随机森林,xgboost,我没有很好的去调参,在简单调参后效果还不如上面的三个模型。这里只给大家看xgboost的简单调参结果了。
ridge,svr,elasticnet 最后在测试集上的结果在kaggle排名约1400名
不过到此为止还没完,还没有利用集成来提升精度,既然这里bagging和boosting效果都不佳,于是利用stacking来集成。个人理解:stacking的思路是在第一层基模型训练出来一个预测结果来做为第二层模型的特征来训练。
这里基模型就采用刚才的三个模型,第二层模型在一些模型选择后,选择了xgboost:
最终结果为822名,约前16%,对我个人来说还是可以接受的,通过这次的比赛,走了一遍完整的流程,从数据清洗,特征工程再到模型的调参集成,是一次很好的练习。