最近做了kaggle网站的zillowst竞赛,也学到了不少。这次zillows给的文件有60个变量,各种各样比如泳池,壁炉,房间数等等,一眼看过去会晕死。所以如何处理变量也是比较费心思和时间的,下面小结一下自己的一点心得。
首先把train和test合并,然后将缺失值排序。
train<-merge.data.frame(train_2016,properties_2016,by="parcelid")
res<-sapply(train,function(x) sum(is.na(x)))
miss<-sort(res,decreasing=T)
- 按照缺失值排列,看出很多id是大量缺失的,果断的删掉一些不重要的id,比如hashottuborspa。
train_left<-train_left[,names(train_left)!=c('hashottuborspa')]
查看数据的相关性
从图中可以看出,很多变量本身是彼此联系的,比如跟tax有关的,跟pool有关的,跟sqfeet有关的。根据不同因素查看彼此关系。
ie 看看几个tax变量之间的关系,用corrplot可视化
tax<- data.frame(cbind(train_left$landtaxvaluedollarcnt,train_left$structuretaxvaluedollarcnt,train_left$taxvaluedollarcnt,train_left$taxamount))
corrplot(cor(tax, use="complete.obs"), type="lower"
这里的代码我写的不太好,一个个搜索再添加笨了点。应该可以用字符串tax找出相关变量,自动形成数据框。以后查下怎么写。
这里可以看出,taxamount和其他tax变量关系密切,从lm也可以做出类似分析,所以删去taxamount以免重复。类似的不再赘述。
train_left<-train[,names(train)!=c('taxamount')]
-
线性分析补足变量的缺失值
zillows文件集里,对于bedroom和bathroom的变量也很啰嗦,有好几个来来回回的,比如'calculatedbathnbr'这个和bathroom类似,被我嫌弃的删除。然后其他有点关系又没有重复的几个变量,可以用lm函数,看看之间的关系。比如这里fullbathcnt和bathroomcnt,p值超小,R的平方值很多,而且bathroomcnt几乎没有缺失,所以可以用线性方程的系数补足fullbathcnt的缺失值。
train_left$fullbathcnt[is.na(train_left$fullbathcnt)]<-(-0.001002)+0.970993*train_left$bathroomcnt[is.na(train_left$calculatedbathnbr)]
- 某些变量用平均数或中位数补值,比如这个楼层数,以1和2层的居多,两者的平均数是1.63(虽然在现实中不存在)。
建成的年代用中位数补值。
train_left$numberofstories[is.na(train_left$numberofstories)]<-1.63
train_left$yearbuilt[is.na(train_left$yearbuilt)]<-median(train_left$fullbath,na.rm=T)
以上这些办法,也可以利用mice包等自动插值函数,或者逐步回归等自动筛选,我这样做,是感觉自己比较能有主导性,知其然也知其所以然吧。
- 部分非实际数值的类型比如fips,就是66这种zillows内部代码,所以进行因子化分类。
train_left$propertylandusetypeid<-factor(train$propertylandusetypeid)
train_left$fips<-factor(train_left$fips)
- 对于有或无的设施,根据kaggle论坛经验,设为-1比设为1更有效果。
train_left$fireplaceflag[is.na(train_left$fireplaceflag)]<-(-1)
train_left$fireplaceflag[!is.na(train_left$fireplaceflag)]<-1
- 日期也进行因子化。
train_left$transactiondate<-as.Date(train$transactiondate,format="%m%d%Y")
train_left$transactiondate<-as.factor(train_left$transactiondate)
......
忙活了半天,终于可以开始运算了。
自从xgb这个大杀器出来以后,大部分的参与者都是用了这个算法,当然调参各有千秋。我在这方面大概还算是个小白。
另外影响成绩的,还有房屋地点和交易时间的分类,这步我还没有找到好的调整方法。
另外zillows只公布了一年的数据,用来预测2016-2017共六个月的数据有点立场不足。他们的对策也很搞,在截止前两周,会再发布新的日期数据。估计到时候大家又是一场手忙脚乱。
All in all, features的取舍和补值是数据分析中重要的一步,但不是最重要的一步。最近看kaggle上面巴黎银行的竞赛复盘,把其中的变量大胆的删掉了20多个,只留下13个变量,但是接下来,按照获奖者的思路,把某个变量(他怎么找到的?)与其他变量相结合,做出了magic feature的矩阵,然后用xgb运算后,也可以得到前30名。能力,时间,运气,缺一不可呀。
个人思路,供参考。