kaggle比賽初體驗
經過一段時間的學習以後,我決定參加比賽來鍛煉一下,畢竟光說不練假把式,實踐才能加深對理論的理解,不然一切都只能是紙上談兵。
我選擇參加了kaggle上的入門比賽:房屋價格預測。經過5天的奮戰,目前我在public榜上排名53名,在2000多個隊伍中排前3%以內。
一、提交數據
剛拿到數據的時候,我先在kaggle上的kernel版塊閱讀了別的參賽者分享的代碼,了解大致的步驟,然後隨便跑了一個隨機森林模型,便提交了數據,排名1500多名。
不過此時成績不重要,重要的是弄清楚數據提交的格式,不然連成績都沒有。
二、模型融合
因為之前看書或者看博客等都看到前輩和大牛們說要ensemble learning,要模型融合。所以我又加了一個GBDT和一個LassoCV,將三個模型的結果簡單地平均了一下,便得到了第二個結果,排名900名左右。(參賽人多就是好,因為殭屍參賽者也多,輕鬆進前50%,23333)
看到成績進步了,我又一想,加了這兩個模型以後成績上升了,那剛剛的隨機森林模型拖了後腿啊,於是我又用LassoCV單模型跑了一下,結果又進步了200名,到了700多名,圖就不貼了。
三、數據處理
接下來開始認真做,先將缺失太多的數據扔掉,然後將剩下的缺失數據填充好:數值型的填充均值,字元串型的填充眾值。填充完以後對字元型數據進行one-hot編碼,再對數據進行對數化和標準化,最後用LassoCV模型進行預測,成績不錯,進了前500了。
四、數據細緻處理
進到500以後遇到瓶頸了,改動了很多次的數據處理方式,但是成績都沒有進步。無奈之下我又去kernel版塊取經去了,不得不說kaggle的這個版塊真的很好,能學習到很多。看了很多大牛的分享和自己的不斷試驗以後,功夫不負有心人,終於有了突破,到了200多名了。
這期間,我總結了以下幾點:
- 最好不扔數據,哪怕某一列數據缺失很多也不要扔。因為這樣很可能會丟失信息;
- 填充均值和眾值效果不是很好。因為這樣可能人為地增加雜訊。對於數值型數據,它很可能可以從別的特徵數據中推導出來。字元型數據填充None,將缺失作為一種特徵來進行one-hot編碼可以既不丟失信息也不增加雜訊;
- 對於可以比較的字元型數據一般都推薦進行數字編碼,比如good映射成2,average映射成1,bad映射成0,這樣就可以保留good>average>bad的信息。但是在這個比賽數據里我用這種方法的效果沒有one-hot編碼效果好,不知道是什麼原因。有知道的小夥伴可以告知我一下。
五、構造特徵
除了數據自帶的特徵以外,比賽時還常常需要人為構造新特徵。我一個特徵一個特徵地看過去,想著自己是買房者的話會考慮哪些因素,最終構造了35個新特徵,包括房齡、房屋上次出售距離現在的時間間隔、房屋總體條件等等。加上原來的79個特徵,one-hot之後一共有300多個特徵,用LassoCV和RigdeCV做了一個簡單的stacking,這下直接衝到了53名。
六、總結
- kaggle是個非常不錯的平台,裡面有適合各個不同層次的人參加的比賽,能很好地鍛煉自己的實踐能力;
- 數據預處理是個既需要細心又需要耐心的活,往往需要對數據有很深的理解和豐富的經驗才能處理的很好;
- kaggle比賽特徵為王,特徵工程決定了上限,模型和調參只是逼近這個上限;
- 後續還有參數調優、模型融合、交叉驗證、過擬合、數據降維、特徵提取等一系列工作可以做,要研究的東西還有很多很多。
接下來還要參加別的比賽,kaggle入門就告一段落。祝自己能取得好的成績。
推薦閱讀:
※如何在 Kaggle 首戰中進入前 10%?
※使用Tensorflow做Kaggle入門題之泰坦尼克
※Titanic: kaggle入門實踐-top10%(附Python代碼)
※Kaggle 的比賽在 Machine Learning 領域中屬於什麼地位?
※數據挖掘系列篇(27):Kaggle 數據挖掘比賽經驗分享