您的位置:首頁>正文

聊聊資料採擷競賽中的套路與深度學習的局限

雷鋒網按:本文原作者兔子老大, 原載於其知乎專欄——MLの玄學姿勢。 雷鋒網已獲得授權。 前言

剛好在暑假通過參加 kaggle 的 Zillow Prize 比賽來讓我在資料採擷和機器學習中完成了菜逼到 Level 1 的轉變, 借知乎的平臺總結一下比賽的經驗, 先聲明本文絕不是只列出名詞的文章, 每一點背後都會有相應的文字解說, 各位客官可以安心吃用和討論。

其次要強調的是這篇文章不承諾帶你上 kaggle top1%, 不承諾你看完後就懂資料採擷, 就懂機器學習, 這次的總結分享只針對下列有如下問題的人群。

網上其他的攻略文章看得不少, 為啥自己還是一波操作猛如虎,

一看比分 0-5?

為啥深度學習近年成績斐然, 然而一些問題上了深度學習後, 比分卻變成了 0-6?

這兩個問題會隨著介紹整個流程而和大家討論, 所以先來對一般的流程進行總結, 流程無非是

資料預處理

特徵工程

模型訓練與挑選(這裡會討論深度學習可能存在的局限性)

模型融合

接下來我對每一個進行討論。

資料預處理

這一點我不談具體的技術, 因為這些技術名詞時老生常談, 什麼歸一化, 標準化恐怕資料採擷的第一課就是談這些東東, 這裡只討論兩個問題, 你知道什麼時候該用什麼技術手段進行預處理嗎?你知道預處理的目標是什麼嗎?

按我自己的理解, 資料本身決定了模型表現的上限,

而模型和演算法只是逼近這個上限, 這和大部分資料採擷教材中的 RIRO 原則是對應的, 因此, 對資料的預處理(和特徵工程), 要幹的就是提高模型可逼近的上限, 以及提高模型魯棒性

明白這兩個目標, 在預處理階段你需要幹什麼就很容易反推出來了。

怎麼提高模型可逼近上限?

提特徵

特定領域還需要濾波和去噪

把干擾模型擬合的離群點扔掉

怎麼提高模型的魯棒性?

數值型資料中的缺失值可以花式處理, 預設值, 平均值, 中位元值, 線性插值

文本資料可以在字, 詞, 句等細微性不同進行處理

圖像資料進模型之前把圖像進行 90, 180, 270 等不同角度翻轉也是常見的處理方式了

總的來說, 在這裡就是需要在不同方面的進行資料的描述,

將一份原始資料稍作擴展。

特徵工程

特徵工程應包括兩部分特徵抽取和特徵挑選, 特徵挑選的資料網上一搜一大堆, 因此這裡只討論特徵抽取, 為什麼?因為巧婦難為無米之炊啊, 沒有特徵你挑選個寶寶嗎?

第一個方法叫做按業務常識抽取。

簡單點來說, 就是通過對你需要分類 / 預測等領域的先驗知識來進行抽取, 比方說, 要區分男生和女生, 直接使用性特徵肯定要比其他的身高體重這些資料的準確率要高。 當然, 考慮到每一個人都不可能所有知識都精通, 當面對一個陌生的業務領域時, 建議優先提取 X1/X2 這樣形式的特徵(這裡的 X1, X2 不一定是一個變數, 也可能使一個式子), 因為傳統的統計流派特別喜歡通過 X1/X2 組成一個叫做 *** 率這樣的指標,

有時可能有奇效。

第二個方法叫做抽取非線性特徵。

線性模型具有簡單, 快速等優勢, 但它的劣勢也很明顯, 他只能表達線性關係, 而一般現實問題那有這麼簡單的線性關係。 因此, 解決方案就是線性模型使用非線性特徵。

可能有些同學有有點懵逼, 什麼叫線性模型搭配非線性特徵?看完這個下面這個例子就清楚了:

假設一個回歸預測的問題, 求的 y=f(x), 那麼有如下兩種形式的表達

…… (1)

……(2)

(1) 式是線性回歸, 只能表達線性關係, (2) 式是多項式回歸, 能夠表達非線性關係。 這時我們令:

,

,

,

,

這時再回首去看 (2) 式, 就能得到

…… (3)

有些童鞋應該反應過來了, 是的, 所謂的線性模型使用非線性特徵的原理就是將非線性特徵記作新的變數 t,

然後扔進一個線性模型裡面, 這時得到的就是關於 t 的線性模型, 但卻可以表達 x 的非線性關係。

至於提取非線性特徵, 除了人工提取這種多項式來做特徵外, 也可用深度學習, SVM 等非線性模型的中間輸出來作為非線性特徵。 這些非線性模型的方法, 也大概是把低維度投影到高維度後塞進線性模型, 至於說為什麼要用非線性模型提取, 一是因為省人力, 二是因為模型往往能學習到人類常識上意識不到的特徵的, 至於為什麼不適用非線性模型直接進去端對端的工作方式, 則是因為每一個非線性模型提取非線性特徵的方法都不一樣, 那麼提取出來的非線性特徵自然也就不一樣了。

但要注意一點的是, 是否使用模型來提取非線性特徵這個決定要考慮實際情況,因為多個模型的非線性特徵組合後,或者是模型融合技術,計算量或時延是不可接受的,有些方法連工程實踐上都不一定可取(即使有分散式運算的環境),就更不要說打 kaggle 的大部分都是個人用戶,只有桌上型電腦或筆記本。

模型訓練和選擇

合理的劃分資料集和訓練集,平衡樣本,交叉驗證這些東西是老生常談,網上一找一大堆,所以本文繼續不談。

先說說的是模型的選擇,機器學習經常被稱為玄學,剛開始我以為說的是因為調包俠本根本不知道裡面演算法的原理,所以這樣造成,但後來我發現,即使你知道裡面的演算法的原理,也依然是玄學。

為什麼這麼說,我們對比一下其他的一些類型的程式出錯是怎麼解決的?print 大法?二分排查找 bug?無論是何種方法,只要 bug 可重新,你總是可以通過程式的表現而定位到錯誤,但機器學習不行,除了模型是否過擬合可以通過一些指標看出,然後調整對應得參數外,其他的一些問題,壓根無法通過現象而定位到需要修改的錯誤。

比如說,預測效果不好,我知道肯定是需要增加特徵,但需要增加一個哪些方面的特徵?這個特徵是需要引入新的資料維度,還可以從現有的資料提取出來?或者說當前的資料的價值已經被我榨幹了嗎?又或者說,你通過算特徵與預測值的相關係數,相關係數低的特徵就一定沒用了嗎?顯然不是,因為你現在只是算了單變數的,沒有算排列組合的結果,而至於算排列組合的結果,真的能算嗎?…… 諸如此類的是沒有 100% 準確的指導方案的(可能連 90% 準確的指導方案都沒)。

當然,解決方法還是有的,就是不斷的堆特徵,和堆模型,挑選後來一波融合,指望不同的模型能學到不同的方面,然後互相互補。

落實到行動,就是那句老話,大膽假設,小心求證。

說了這麼多,無非說明機器學習模型可能是理論科學,但實踐,一定是實驗性科學,既然是實現性科學,就要遵守一個原則,先簡單後複雜,過早優化是萬惡之源,無腦優化則是浪費時間。簡單是指模型的簡單,數數值型別可以先從簡單的線性回歸開始,(若是圖片領域的話,可以選取一些比較基本的 DL 模型,比如預訓練好的 vgg 系列),這樣出結果的速度肯定優於其他亂七八糟的複雜模型,出結果快,意味著你可以趁早線上下確定較為妥當的測試方式,你的 baseline,快速驗證你的其他思路,然後再慢慢優化和調參。

在這個小節最後,來說說這次比賽中關於使用深度學習的感想。

目前公認不適合使用深度學習的情況是當資料量偏少,但一般現在比賽方提供的資料量都非常可觀,所以資料量這個條件應該說是可以滿足的。

其次的一個公認不適合的地方是,資料不具有局部相關特性。意思就是像圖像 / 自然語言等領域,資料之間具有局部相關性,比如說一個圖元不能表達足夠的資訊,但一堆圖元就能表示這是小狗還是小貓,語言中由單詞組成句子,而一旦這些東西組合的次序被打亂,那麼整體所表達的資訊亦同時被打亂。這些具有局部相關特性的資料,可以通過一定的網路拓撲提取其中的局部相關特性,同時配合深度達到層次特徵的提取,從而達到較為優秀的成果。對比三層 MLP 以及 CNN 在 minst 手寫數字識別上的效果差異,就能充分說明這個觀點。而對於不具有局部相關特性的資料,沒法用特點的網路拓撲來捕捉了他的資訊,在深度學習中就只能用 MLP 來完成模型的訓練,而 MLP 的效果,一般要弱於 GDBT,RandomForest 等傳統模型。

深度學習對比傳統方法來說,最大的優勢是自動特徵的提取,但根據其他大牛分享的經驗來說,當人工特徵工程做到一定程度後,傳統模型是可以超越深度學習的,詳見 quora 相似文本匹配的比賽裡面,yesofcourse 隊伍的視頻,裡面有一段是關於深度學習和傳統機器學習模型的對比,另外亦有有人指出深度學習在面對 x 和 y 的關係是一次推理的情況時,深度學習能學到很好,如果是兩層或多層的推理的時候,相比傳統模型,深度學習卻完全處於劣勢,但深度學習結合知識圖譜可以有效的解決這個問題。

(個人猜想,這裡大牛說到的推理應該是指在邏輯上的關係,比如你爸爸的媽媽的二叔的老婆的姐姐你應該稱呼她什麼這種推理,而並非數學上 y=f(x) 這種關係)

而在這次比賽中的實際情況則比較有趣。在對資料集進行了基本處理後 (對缺失值填充,去除離群點),沒有做任何的特徵提取,分別塞進 xgboost 和 3 層 128 單元的 MLP,其中 LB 和線下的表現,兩個模型的結果非常接近,差別基本上是小數點後 6 到 7 位。但是後來我人工提取了幾個特徵,這時兩個模型的差異就開始顯露出來了。線下差別不大,但 LB 上,xgboost 讓我的排名又十分可觀的上升,但 MLP 則讓我的 LB 得分有了十分可觀的…… 下降!起初覺得是產生了過擬合,後來分別加入了 dropout 和正則項嘗試,並沒有改善,也嘗試了使用 autoencoder 進行特徵提取,然後應用到傳統模型上,效果都不盡人意,最後我決定不使用 DL 那套方法,改而採用傳統的機器學習模型 + 人工抽取特徵。但在決定放棄 DL 之前,已經浪費了太多的時間在嘗試上(因為對 DL 有盲目的信心,總覺得成績不好是自己的參數問題),沒有銀彈,具體情況具體分析,這也是以後處事應該要注意的地方。

其實通過分析我發現 DL 產生較為嚴重的誤差原因大概是,lable 其實正負數對半,但模型的輸出幾乎都是正,即使是負數,該預測值的數值也非常少,並沒有找到合適的解決方法。

但無論是 xgboost 還是線性回歸,其預測值都可以做到正負各占 50%,因此,目前的方案是對這兩個模型最後的結果取了加權平均,目前(2017.7.22)排名到達 342/1702,按照套路,接下來應該有一波模型融合,我是有自信再上升一定的名次的,但因為我還有參加今年的考研,另外這次比賽經歷我覺得已經有足夠的長進,便沒有繼續下去的打算,即使是繼續也是考研後的事了。

模型融合

關於模型融合,方法依舊在網上有一大堆,近幾年也沒有太大的創新,主要說一下的就是模型融合前應該畫一畫誤差曲線,確定模型之間是否有融合的需要,比如一個模型完爆另外一個模型,那融合價值就很低。

後話

讀萬卷書不如行萬里路;行萬里路不如閱人無數;閱人無數不如高人指路。參與到面向全社會的比賽,其實比參加學校某些我不想提名字的比賽更有意義,雖然拿獎很難,但因為能接觸到的是近似真實的流程,不同水準,不同行業背景的人,尤其是認識一個的朋友後會以認識更多牛逼的朋友,這些機會對一個人的知識技能和人脈積累都有巨大的好處,如果你還處於學生時代,這個機會的潛在價值會翻倍。

最後,因為這個比賽還在進行中,所以代碼我不會給,但你真想要當伸手黨,去 kaggle 的 kernels 上有很多排名比我高的放在了上面,如果只是問題探討,歡迎在評論區或私信留言,文字應該足夠了。

最後的最後,因為我不知道國內除了 top 的一些學校外,其餘學校關於機器學習或深度學習方向的研究水準怎麼樣 (子方向不太在意),廣東地區的考生,歡迎熱心的知友推薦學校和實驗室

,在這裡先謝謝了,我保證看在推薦的份上不吃你。:P

是否使用模型來提取非線性特徵這個決定要考慮實際情況,因為多個模型的非線性特徵組合後,或者是模型融合技術,計算量或時延是不可接受的,有些方法連工程實踐上都不一定可取(即使有分散式運算的環境),就更不要說打 kaggle 的大部分都是個人用戶,只有桌上型電腦或筆記本。

模型訓練和選擇

合理的劃分資料集和訓練集,平衡樣本,交叉驗證這些東西是老生常談,網上一找一大堆,所以本文繼續不談。

先說說的是模型的選擇,機器學習經常被稱為玄學,剛開始我以為說的是因為調包俠本根本不知道裡面演算法的原理,所以這樣造成,但後來我發現,即使你知道裡面的演算法的原理,也依然是玄學。

為什麼這麼說,我們對比一下其他的一些類型的程式出錯是怎麼解決的?print 大法?二分排查找 bug?無論是何種方法,只要 bug 可重新,你總是可以通過程式的表現而定位到錯誤,但機器學習不行,除了模型是否過擬合可以通過一些指標看出,然後調整對應得參數外,其他的一些問題,壓根無法通過現象而定位到需要修改的錯誤。

比如說,預測效果不好,我知道肯定是需要增加特徵,但需要增加一個哪些方面的特徵?這個特徵是需要引入新的資料維度,還可以從現有的資料提取出來?或者說當前的資料的價值已經被我榨幹了嗎?又或者說,你通過算特徵與預測值的相關係數,相關係數低的特徵就一定沒用了嗎?顯然不是,因為你現在只是算了單變數的,沒有算排列組合的結果,而至於算排列組合的結果,真的能算嗎?…… 諸如此類的是沒有 100% 準確的指導方案的(可能連 90% 準確的指導方案都沒)。

當然,解決方法還是有的,就是不斷的堆特徵,和堆模型,挑選後來一波融合,指望不同的模型能學到不同的方面,然後互相互補。

落實到行動,就是那句老話,大膽假設,小心求證。

說了這麼多,無非說明機器學習模型可能是理論科學,但實踐,一定是實驗性科學,既然是實現性科學,就要遵守一個原則,先簡單後複雜,過早優化是萬惡之源,無腦優化則是浪費時間。簡單是指模型的簡單,數數值型別可以先從簡單的線性回歸開始,(若是圖片領域的話,可以選取一些比較基本的 DL 模型,比如預訓練好的 vgg 系列),這樣出結果的速度肯定優於其他亂七八糟的複雜模型,出結果快,意味著你可以趁早線上下確定較為妥當的測試方式,你的 baseline,快速驗證你的其他思路,然後再慢慢優化和調參。

在這個小節最後,來說說這次比賽中關於使用深度學習的感想。

目前公認不適合使用深度學習的情況是當資料量偏少,但一般現在比賽方提供的資料量都非常可觀,所以資料量這個條件應該說是可以滿足的。

其次的一個公認不適合的地方是,資料不具有局部相關特性。意思就是像圖像 / 自然語言等領域,資料之間具有局部相關性,比如說一個圖元不能表達足夠的資訊,但一堆圖元就能表示這是小狗還是小貓,語言中由單詞組成句子,而一旦這些東西組合的次序被打亂,那麼整體所表達的資訊亦同時被打亂。這些具有局部相關特性的資料,可以通過一定的網路拓撲提取其中的局部相關特性,同時配合深度達到層次特徵的提取,從而達到較為優秀的成果。對比三層 MLP 以及 CNN 在 minst 手寫數字識別上的效果差異,就能充分說明這個觀點。而對於不具有局部相關特性的資料,沒法用特點的網路拓撲來捕捉了他的資訊,在深度學習中就只能用 MLP 來完成模型的訓練,而 MLP 的效果,一般要弱於 GDBT,RandomForest 等傳統模型。

深度學習對比傳統方法來說,最大的優勢是自動特徵的提取,但根據其他大牛分享的經驗來說,當人工特徵工程做到一定程度後,傳統模型是可以超越深度學習的,詳見 quora 相似文本匹配的比賽裡面,yesofcourse 隊伍的視頻,裡面有一段是關於深度學習和傳統機器學習模型的對比,另外亦有有人指出深度學習在面對 x 和 y 的關係是一次推理的情況時,深度學習能學到很好,如果是兩層或多層的推理的時候,相比傳統模型,深度學習卻完全處於劣勢,但深度學習結合知識圖譜可以有效的解決這個問題。

(個人猜想,這裡大牛說到的推理應該是指在邏輯上的關係,比如你爸爸的媽媽的二叔的老婆的姐姐你應該稱呼她什麼這種推理,而並非數學上 y=f(x) 這種關係)

而在這次比賽中的實際情況則比較有趣。在對資料集進行了基本處理後 (對缺失值填充,去除離群點),沒有做任何的特徵提取,分別塞進 xgboost 和 3 層 128 單元的 MLP,其中 LB 和線下的表現,兩個模型的結果非常接近,差別基本上是小數點後 6 到 7 位。但是後來我人工提取了幾個特徵,這時兩個模型的差異就開始顯露出來了。線下差別不大,但 LB 上,xgboost 讓我的排名又十分可觀的上升,但 MLP 則讓我的 LB 得分有了十分可觀的…… 下降!起初覺得是產生了過擬合,後來分別加入了 dropout 和正則項嘗試,並沒有改善,也嘗試了使用 autoencoder 進行特徵提取,然後應用到傳統模型上,效果都不盡人意,最後我決定不使用 DL 那套方法,改而採用傳統的機器學習模型 + 人工抽取特徵。但在決定放棄 DL 之前,已經浪費了太多的時間在嘗試上(因為對 DL 有盲目的信心,總覺得成績不好是自己的參數問題),沒有銀彈,具體情況具體分析,這也是以後處事應該要注意的地方。

其實通過分析我發現 DL 產生較為嚴重的誤差原因大概是,lable 其實正負數對半,但模型的輸出幾乎都是正,即使是負數,該預測值的數值也非常少,並沒有找到合適的解決方法。

但無論是 xgboost 還是線性回歸,其預測值都可以做到正負各占 50%,因此,目前的方案是對這兩個模型最後的結果取了加權平均,目前(2017.7.22)排名到達 342/1702,按照套路,接下來應該有一波模型融合,我是有自信再上升一定的名次的,但因為我還有參加今年的考研,另外這次比賽經歷我覺得已經有足夠的長進,便沒有繼續下去的打算,即使是繼續也是考研後的事了。

模型融合

關於模型融合,方法依舊在網上有一大堆,近幾年也沒有太大的創新,主要說一下的就是模型融合前應該畫一畫誤差曲線,確定模型之間是否有融合的需要,比如一個模型完爆另外一個模型,那融合價值就很低。

後話

讀萬卷書不如行萬里路;行萬里路不如閱人無數;閱人無數不如高人指路。參與到面向全社會的比賽,其實比參加學校某些我不想提名字的比賽更有意義,雖然拿獎很難,但因為能接觸到的是近似真實的流程,不同水準,不同行業背景的人,尤其是認識一個的朋友後會以認識更多牛逼的朋友,這些機會對一個人的知識技能和人脈積累都有巨大的好處,如果你還處於學生時代,這個機會的潛在價值會翻倍。

最後,因為這個比賽還在進行中,所以代碼我不會給,但你真想要當伸手黨,去 kaggle 的 kernels 上有很多排名比我高的放在了上面,如果只是問題探討,歡迎在評論區或私信留言,文字應該足夠了。

最後的最後,因為我不知道國內除了 top 的一些學校外,其餘學校關於機器學習或深度學習方向的研究水準怎麼樣 (子方向不太在意),廣東地區的考生,歡迎熱心的知友推薦學校和實驗室

,在這裡先謝謝了,我保證看在推薦的份上不吃你。:P

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示