Kaggle 比赛 学习 作业 (二)

Emmm...很尴尬,拖了这么多天才来补Kaggle房价预测,主要中途好朋友结婚,回去参加了一趟婚礼,加上以前的老板Mr.Simon回国想见我一面,又去了趟青岛,中间一顿折腾,在火车上和闲暇时间到处找KFC断断续续的写,最后在旅途中完成了,回来又赶上交各种期末大作业,这才耽搁了,下面直接附上我的word(图片都不见了是什么鬼???)

然后继续干活完成老师的任务。

Exploratory Data Analysis and Predictions

of House Price

 

作业完成工具与环境:win10+anaconda3+pycharm2018+jupyter notebook(Python3)

前言:

刚接触python不久,之前在国科大接触过模式识别,对一些机器学习知识有一个概念,现在回所后在做基于相关滤波的传统方法的目标跟踪,其中判别式的一个算法,也是我现在刚刚完成改进的一个算法,对于数据特征的处理中使用到了岭回归,PCA特征降维+QR分解,随机森林等知识,碰巧老师的作业与这些都有关系,相当于老师给我们提供了新的锻炼机会,看了Pedro Marcelino大神的思路与评论的交流,赶紧注册Kaggle下载了训练与验证数据,开始体验机器学习方法在房价预测中的使用,同时也是站在巨人的肩膀上一边学习一边思考这些数据处理筛选与模型建立训练过程中,机器学习方法的使用与融合处理,以及效果的提升。

虽然没有做过之类的练习,但是通过老师给的例程也大概了解到,机器学习的任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类。我也是依据传统机器学习的流程,看看在每一步流程中都有哪些常用的函数以及它们的用法是怎么样的,通过显示的图片效果,算法处理,Cross Validation等思想,来体会学习如何得到想要的结果。

下图简述一下本作业主要的思路:

代码+分析

扫描二维码关注公众号,回复: 3047902 查看本文章

1、数据理解与概览(可视化):

首先导入需要的模块与读路径找到需要的数据(训练集与测试集)

代码中显示一下前五个数据,大致浏览了解一下具体影响房价的因素,(可以看到有多少个因素影响房价,ID+Price is included,实际上79个),然后在操作前了解一下数据的size,

了解数据类型:(可以看到有object,float64,int64等类型)

了解数据的分布情况:

描述性数据总结直方图:

之前代码没有加,但是数据可视化比较有启发性,现在根据数据类型加个指令观察一下数据与sale price的关系:

上图是CentraAir,应该是中央空调的意思,看起来有无中央空调还是影响房价的;

上图是OverallQual,我感觉应该是整体Quality?,那么显然是与房价正相关的;

上图YearBuilt,显然修建时间也与房价有很大的关系;

把箱形图换成散点图观察一下:

数据观察起来就是这个样子,不赘述了。

2、数据清洗:

移除Id列以便于处理数据:

下面处理重要的数据特征,这里统计一下null数据的Frequency:

接下来整合数据以便下一步计算,把sale price拿出来,可以看到剩下的79个影响房价的因素,显示一部分观察一下:

接下来清洗掉缺失数据了,因为有的特征因素(PoolQC, Alley, MiscFeature, Fence)缺失的数据很多,对房价预测没有帮助也没有参考意义,还有一些离群点或者噪点,剩下的就是有缺失但是有参考意义的因素,不能简单删除,不然最后做出的这个房价预测模型泛化性能肯定受影响很大,一些情况单独定义或者作处理,如下:

 

3、特征工程

相关性分析:

以上处理完数据,我们要看一下很重要的数据相关性了,这个之前用PCA给图片多通道特征降维的时候用到过,就像周老师第9节课上讲的,我们可以用协方差矩阵观察数据的相关性,其间要对数据进行归一化均值处理,现在都比较方便了,Python可以一步到位:

尝试不同的颜色"Spectral":

下面是训练数据的相关度,颜色还是用"jet"更形象,毕竟红色hot表示相关度高,蓝色cold表示相关度低:(协方差矩阵热度图真是太形象了!amazing!)

 

下面是测试集的,换个颜色观察一下:

协方差矩阵必然是对称的,我们找上三角部分,其中相关度大于0.75的找出来:

由上图以及找出的数据思考分析,GarageYrBlt与Years Blt有较高的相关性是合理的。因为车库大多是在建房子的时候建的。GarageArea和GarageCars具有很高的相关性,因为如果能停更多的车,那么就会有更多的车库空间,反之亦然。 '1stFlrSF', 'TotalBsmtSF' 是相关的,这也是有意义的,因为通常地下室通常就在一楼的下面,而且大部分的面积都是相似的。TotRmsAbvGrd与GrlivArea相关。这也是有意义的,因为在这两列中,地下室是不被考虑的。所以使用数据预测时,for计算的需要,这些数据要被drop掉。

异常值处理:

当然数据中也有前面提到的离群点,特别是GrLivArea,这里需要观察找出并移除:

在上面的图中,右下角有很明显的两个点,面积在4000平方英尺以上,但销量却很低,与其他点趋势普遍性不符,这两个就是典型的离群点了,会在训练中影响模型,在模型匹配时会引起较大的误差,所以应该删去,其他的虽有偏差但是还是有参考意义的,所以先保留着。

删除离群点后,更新训练数据的indexes:

特征转换:

接着将类别数据做一下处理,进行转换,也就是正确化变量属性(MSSubClass 的值其实应该是一个Category,但是Pandas是不会懂这些事儿的。使用df的时候,这类数字符号会被默认记成数字。这种东西很有误导性,需要把它变回成string,这里使用了LabelEncoder可以简单地将 categorical labels 转换为不同的数字):

以上数据中存在一些偏差离群数据,一般的经验法则,绝对偏态值 >thresh 被认为是倾斜严重,为了减少倾斜异常值的影响,更好的处理它们,对它们作log处理,代码就是apply(ny.log1p)也就是作log(1+x)处理,可以让data平滑化:

再次赘述一下,把Category的变量转变成numerical表达形式:当用numerical来表达categorical的时候,因为数字本身有大小的含义,所以乱用数字会给后面的模型学习带来麻烦。可以用One-Hot的方法来表达Category,与刚刚使用的LabelEncoder不同,这里使用pandas自带的get_dummies方法,一键One-Hot。

接着进行数据标准化,继续使用log变换处理后的数据,把源数据给放在一个标准分布内,不让数据间的差距太大,不然会严重影响regression的性能:

以上处理后的数据做成训练集和测试集:

 

4、算法模型选择与评估:

最后就是使用回归算法了,这里调用强大的sklearn机器学习库,选择不同的方法加上Cross Validation验证算法效果,来使泛化性能更好:

最上面两行代码,先是将系数向量的L2范数添加到了损失函数,然后就是平方误差项。引入L2范数系数向量正则项,就是课上老师讲的,正则项也就是规则项、约束项,对优化的系数w加上constraint,同样是防止过拟合并提高泛化能力,我的理解是把MSE加上S.t.项写成拉格朗日形式就是常见的回归模型了,又因为范数的不同有一些有了不同的名字。比如正则项采用1范数,也就是所谓的Lasso Regression,倾向于完全消除不重要的权重,但是丢失的信息也更多,得到的结果更稀疏,但是一定程度上有利于处理速度,感觉就是缺点与优点都很明显;决策树我的理解就是设置不同的树的数目与深度,在节点处作判断,最后依据概率模型做回归分析。

上面的是分别使用ElasticNet、岭回归和随机森林的方法,加上交叉验证之后的结果,很明显ElasticNet的综合效果最佳,我的理解是ElasticNet算法就是最简单的朴素线性回归MSE加上正则项组成代价函数,只不过代价函数是一个combination of Lasso回归和岭回归,也就是同时利用两者的优点吧:(因为影响房价的因素有79个,但真正有较大影响的肯定没有那么多)

很明显:r=0:ElasticNet变成岭回归,r=1:ElasticNet就变成了Lasso回归。

5、生成结果,提交:

下面生成结果,准备submit my predictions:

查看几个预测的结果:

在Kaggle网站上提交测试

这个结果大概在Top18%左右,这里使用的一些算法,岭回归虽然一定程度上可以拟合模型,但容易导致回归结果失真;Lasso回归虽然能刻画模型代表的现实情况,但是模型过于简单,不符合实际。弹性网回归(ElasticNet)结果表明,一方面达到了岭回归对重要特征选择的目的,另一方面又像Lasso回归那样,删除了对因变量影响较小的特征,所以取得了更好的效果。

我觉得使用更多的优化算法,融合他们的特点,并进一步对缺失数据和数据筛选等做一些优化,还有更多的进步空间。

体会总结:

首先感觉Kaggle比赛是 Feature为主,参数调整和Ensemble为辅。当发现一个变量从直觉上来说对所要完成的目标有帮助,就可以将其作为 Feature,总之应该生成尽量多的 Feature,然后 Model 能够挑出最有用的 Feature。Feature Engineering 能做到什么程度,取决于对数据领域的了解程度,这一方面我倒基本是门外汉了,如何构造有用的 Feature,也是一个不断学习和提高的过程。(哈哈做完作业有种要转行的冲动……)

然后感觉Python用起来和其他语言有很多相似的地方,不过Python用起来真的是方便,各种完善的封装好的包直接调用,尤其是Sklearn,真的很强大,调用简单粗暴,包含了大部分的机器学习算法。

作业对变量进行了哲(玄)学(学)分(调)析(参),不仅对 SalePrice 进行了单独分析,还结合了相关程度最高的变量进行分析。先后处理了缺失数据和异常值,验证了一些基础统计假设,并且将类别变量转换为虚拟变量,并对数据进行了归一化等处理。

但是,模型提交后,还是有一些思考,因为学习的算法有限,看了看很多大牛们的kernels和下面的comments,感觉房价预测模型肯定不能只是简单的线性回归加正则化,而且虽然组合方法显示了比较好的性能,但不一定组和方法就是最优的,希望以后接触到更多的算法与思想,有更多的思路来回味房价预测问题吧。

 

 

Acknowledgement:

    Thanks for our teacher professor Chou ! In particular , we really appreciate that you provide us with a chance of sharing advanced machine learning knowledge in class ! We all like having you as our teacher , and you have our sincere respect and gratefulness !

 

 

References:

 

Xiaofeng Chou,Course of Machine Learning PPT;

---2thpart Liner Regression

---3thpart Decision Tree -- adaboosting -- Random Forest

---9thpart Dimensionality reduction technique

 

Data Description,Kaggle official data description;

( https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data )

Ames data defintion ,美帝爱荷华州房价数据因素参考;

( http://ww2.amstat.org/publications/jse/v19n3/Decock/DataDocumentation.txt )

 

Pedro Marcelino,Comprehensive data exploration with Python;

(https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python)

 

_____________________________________________分割线_________________________________________________

 

更新一下,老师成绩给了很高的分,应该没有比我高的,仓促下学习,得这个分已经很好了,希望以后学习了数据处理的知识,再继续回来思考这个问题,很有意思。

 

 

猜你喜欢

转载自blog.csdn.net/skywalker_123/article/details/81220291
今日推荐