AI行业实践精选:Kaggle竞赛 — 2017年房价预测
【AI00导读】本文的两位作者分别是杜克大学电气工程博士后和莱斯大学电气与计算机工程系博士生,他们正在参加在纽约数据科学院举办的在线数据科学训练营计划。这篇文章是他们为其参与的“机器学习”课程而编写的。他们选择了 Kaggle 竞赛中关于房价预测的题目。在大概两周内,他们完成了 EDA、包括特征工程、ensembling、stacking以及特征选择;并对模型效果的影响因素进行了精彩的总结。
简介
我们已经学习了许多不同的机器学习算法,例如监督学习、非监督学习以及增强学习等。现在,是时候利用这些算法解决实际问题了。我们是在Kaggle上看到这个竞赛的,十分新颖而且也觉得有意思。同时,它也不是那种花哨而不实用的竞赛,其目标是利用2010年卖房的不同特征来预测亚美尼亚州洛瓦市(Ames,Lowa)的房价。其中,用于描述洛瓦(Lowa)住房方方面面的特征总共有79个。我们觉得这个竞赛很好,因为Kaggle为参赛者提供的特征足够详尽。与此同时,通过这个竞赛我们还可以将机器学习方面的知识付诸实践,例如Xgboost、ensemble以及stacking等方法。
我们的策略是借鉴前人的研究成果,比如说利用Kaggle上的公共特征工程与机器学习模型。例如:
--[Feature engineering] https://www.kaggle.com/humananalog/house-prices-advanced-regression-techniques/xgboost-lasso
--[Stacking] https://www.kaggle.com/eliotbarr/house-prices-advanced-regression-techniques/stacking-starter
--[General framework] http://blog.kaggle.com/2016/04/08/homesite-quote-conversion-winners-write-up-1st-place-kazanova-faron-clobber/
--[General framework] http://blog.kaggle.com/2016/07/21/approaching-almost-any-machine-learning-problem-abhishek-thakur/
同时也使用了其他数据科学家的研究成果,比如说:
--[General framework] http://www.slideshare.net/OwenZhang2/tips-for-data-science-competitions
--[Ensembling] http://mlwave.com/kaggle-ensembling-guide/
当然,我们自己也编写代码,为的是进一步来提高我们的预测成绩。在此次由Kaggle公开举办的竞赛中,我们的机器学习项目目前排名前4%,而参加本次比赛的队伍大概有3000多支。
探索性数据分析
首先,我们来探索性地分析一下数据,看看我们能从数据中得到什么。下面是我们绘制的销售价格(销售价格是我们最终预测的目标)分布图。通过这张图,我们可以了解到,只有为数不多的房屋价格超过了500,000美元。
房屋住房面积也是房屋价格的一个指标。下面这张图表明,只有很少的房屋面积超过了4,000平方英尺。这类信息可以用来过滤异常值。
此外,房屋到街道的直线距离也是一个值得考虑的特征。我们将房屋分组,每组使用组内房屋直线距离的中位数来填充NA。下图表示,距离街道少于40英尺的异常数据很少。
每月的售房记录也会对我们的预测有所帮助。根据下图我们可以了解到,就售房数量而言,5月到8月是售房最火热的季节。
同样,我们也考虑了某些其他的数字特征,这些数字特征与房屋的价格密切相关。下图就是我们绘制的这些数字特征的相关矩阵图,对于判别相关属性非常有帮助。我们都知道,多重共线特性会使我们很难得出自变量与因变量之间的关系。
这就是我们关于房屋价格数据集的基本探索分析。在下一部分中,我们将运用特征工程的方法来准备机器学习的训练数据集与测试数据集。
特征工程
对于数值特征与分类特征,我们分别进行考虑。数据集的数值特征并不能直接适用于线性模型,它的某些特征违背了线性回归的某些必备条件,例如线性特征、恒定方差以及正太特性等。因此,我们选择使用log(x+1)变换来处理我们的数值特征,其中x代表的是某个数值特征。通过以上变换,数值特征将会更加符合线性回归的要求。
此外,扩展数值特征也是一个好主意。
对于分类特征,我们会做如下的变换:
-- 使用0来填充NA
-- 考虑房屋到街道的直线距离,并以此分组。使用每组房屋到街道距离的中位数来填充NA
-- 用0与1来代表房屋是否有某种特性,比如中央空调(0代表没有,1代表有)
-- 使用序数值特征来表征房屋质量
--使用独热码来编码这些特征
-- Sharan的三大策略。【在这里添加策略】
我们也引入了一些新的特性,总结如下:
-- 生成一些“Is…”或者“Has…”特征,这些特征基于属性是否为“is”或者“has”。例如,由于大多数属性都有标准断路器,于是我们创建出了“Is_SBrkr”栏来表示是否具有标准断路器。
-- 使用综合评定的方式来简化现有特征。我们大概将特征分成三大类:差、中等、好,分别用数字1、2、3来代替。
-- 生成关于时间的特征。例如,我们创建了“New_House”列,来标记房屋的建造与售出是否是在同一年。
我们过滤掉了那些面积超过4000英尺的住宅,以避免异常数据值。
同时,我们也会考虑一些镜像特性。我们分别总共有389种不同的特征,1456个训练数据集样本,1459个测试数据集样本。现在,让我们一起进行机器学习的试验。
Ensemble方法
我们使用了6种机器学习模型:XGboost、 Lasso、Ridge、Extra Trees、Random Forest、GBM。
针对每一种模型,我们使用交叉验证的方式执行网格搜索,以找到相应模型的最佳参数。
我们发现随机森林(RandomForest)、GBM与Extra Trees存在过拟合的问题。
最终,我们的集成模型包含Lasso、ridge以及 Xgboost。它们都有相同的权重。
Stacking
我们使用的是out-of-folder stacking的方式。在第一阶段,我们将XGboost、Random Forest、Lasso以及GBM作为我们的模型。在第二阶段,我们使用第一阶段的结果作为新的特征,将Xgboost作为合成器来进一步训练我们的模型。对于每个模型,我们实行交叉验证,以找到最好的参数集。
特征选择
我们根据XGboost提供的特征重要性来选择那些重要的特征。
上图展示了特征的重要性,该图表明特征重要性呈指数下降。我们应该使用最重要的特征来训练模型。
我们使用循环来训练我们的数据集。每次循环,数据集都会包含不同数量的特征,这样我们就会得到不同的分数,同时我们也会设置阈值以确定要从数据集中删除哪些特征。
结论
我们两人在大概两周内利用业余时间完成了EDA(Exploratory Data Analysis,探索性数据分析),包括特征工程、ensembling、stacking以及特征选择。我们发现,特征工程的有无对最终的结果影响巨大。其次就是ensembling,同样对结果影响很大(但是特征工程的影响更大)。而是否存在stacking,对最终结果的影响不是太大。这可能是因为模型在数字统计上已经等效过的缘故。由于数据集很小,我们可以考虑不同的特征工程,以提高最终的分数。例如,使用不同的分布创造不同的特征或者使用特征交互的方式自动生成新的特征。
本文作者 Wann-Jiun Ma 是杜克大学电气工程博士后。他的研究主要关注于数学建模,算法设计,以及大规模系统(如无线传感器网络和能量分析)的软件和实验实现。另一位作者 Sharan Naribole是莱斯大学电气与计算机工程系博士生。他的研究重点是下一代无线网络协议设计和实验。
本文由 AI100 编译,转载请联系本公众号获得授权
编译:AI100
原文链接:http://blog.nycdatascience.com/student-works/kaggle-competition-2017-house-price-prediction/