標籤:

kaggle-zillows競賽的變數分析

最近做了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,比如architecturalstyleid。

train_left<-train_left[,names(train_left)!=c(architecturalstyletypeid)] train_left<-train_left[,names(train_left)!=c(hashottuborspa)]

2. 查看數據的相關性從上圖中可以看出,很多變數本身是彼此聯繫的,比如跟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)]

3. 線性分析補足變數的缺失值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)]

4. 某些變數用平均數或中位數補值,比如這個樓層數,以1和2層的居多,兩者的平均數是1.63(雖然在現實中不存在)。建成的年代用中位數補值。

train_left$numberofstories[is.na(train_left$numberofstories)]<-1.63train_left$yearbuilt[is.na(train_left$yearbuilt)]<-median(train_left$fullbath,na.rm=T)

以上這些辦法,也可以利用mice包等自動插值函數,或者逐步回歸等自動篩選,我這樣做,是感覺自己比較能有主導性,知其然也知其所以然吧。

5. 部分非實際數值的類型比如fips,就是66這種zillows內部代碼,所以進行因子化分類。

train_left$propertylandusetypeid<-factor(train$propertylandusetypeid)train_left$fips<-factor(train_left$fips

6. 對於有或無的設施,根據kaggle論壇經驗,設為-1比設為1更有效果。

train_left$fireplaceflag[is.na(train_left$fireplaceflag)]<-(-1)train_left$fireplaceflag[!is.na(train_left$fireplaceflag)]<-1

7. 日期也進行因子化。

train_left$transactiondate<-as.Date(train$transactiondate,format="%m%d%Y")train_left$transactiondate<-as.factor(train_left$transactiondate)

......忙活了半天,終於可以開始運算了。自從xgb這個大殺器出來以後,大部分的參與者都是用了這個演算法,當然調參各有千秋。我在這方面大概還算是個小白,只會使用,不會活用。

另外影響成績的,還有房屋地點和交易時間的分類,這步我還沒有調整。因為zillows只公布了一年的數據,用來預測兩年六個月的數據有點立場不足。他們的做法也很搞,在截止前兩周,會再發布新的日期數據。估計到時候大家又是一場手忙腳亂。

All in all, features的取捨和補值是數據分析中重要的一步,但不是最重要的一步。最近看kaggle上面巴黎銀行的競賽復盤,把其中的變數大膽的刪掉了20多個,只留下13個變數,但是接下來,按照獲獎者的思路,把某個變數(他怎麼找到的?)與其他變數相結合,做出了magic feature的矩陣,然後用xgb運算後,也可以得到前30名。能力,時間,運氣,缺一不可呀。

個人思路,供參考。誰真的得到了獎金,我要見者有份。:)


推薦閱讀:

LikeU | 真心話·大冒險 第1期
呦呵~數據上圖新功能:圖標、紋理、更多分享方式
大數據Hadoop常見異常處理,初學的你要看看
sqoop簡單介紹
知識分享 | 不超3分鐘看懂「PHM」!

TAG:大數據 |