聊聊數(shù)據(jù)挖掘競(jìng)賽中的套路與深度學(xué)習(xí)的局限
前言
剛好在暑假通過(guò)參加 kaggle 的 Zillow Prize 比賽來(lái)讓我在數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)中完成了菜逼到 Level 1 的轉(zhuǎn)變,借知乎的平臺(tái)總結(jié)一下比賽的經(jīng)驗(yàn),先聲明本文絕不是只列出名詞的文章,每一點(diǎn)背后都會(huì)有相應(yīng)的文字解說(shuō),各位客官可以安心吃用和討論。
其次要強(qiáng)調(diào)的是這篇文章不承諾帶你上 kaggle top1%,不承諾你看完后就懂?dāng)?shù)據(jù)挖掘,就懂機(jī)器學(xué)習(xí),這次的總結(jié)分享只針對(duì)下列有如下問(wèn)題的人群。
-
網(wǎng)上其他的攻略文章看得不少,為啥自己還是一波操作猛如虎,一看比分 0-5?
-
為啥深度學(xué)習(xí)近年成績(jī)斐然,然而一些問(wèn)題上了深度學(xué)習(xí)后,比分卻變成了 0-6?
這兩個(gè)問(wèn)題會(huì)隨著介紹整個(gè)流程而和大家討論,所以先來(lái)對(duì)一般的流程進(jìn)行總結(jié),流程無(wú)非是
-
數(shù)據(jù)預(yù)處理
-
特征工程
-
模型訓(xùn)練與挑選(這里會(huì)討論深度學(xué)習(xí)可能存在的局限性)
-
模型融合
接下來(lái)我對(duì)每一個(gè)進(jìn)行討論。
數(shù)據(jù)預(yù)處理
這一點(diǎn)我不談具體的技術(shù),因?yàn)檫@些技術(shù)名詞時(shí)老生常談,什么歸一化,標(biāo)準(zhǔn)化恐怕數(shù)據(jù)挖掘的第一課就是談這些東東,這里只討論兩個(gè)問(wèn)題,你知道什么時(shí)候該用什么技術(shù)手段進(jìn)行預(yù)處理嗎?你知道預(yù)處理的目標(biāo)是什么嗎?
按我自己的理解,數(shù)據(jù)本身決定了模型表現(xiàn)的上限,而模型和算法只是逼近這個(gè)上限,這和大部分?jǐn)?shù)據(jù)挖掘教材中的 RIRO 原則是對(duì)應(yīng)的,因此,對(duì)數(shù)據(jù)的預(yù)處理(和特征工程),要干的就是提高模型可逼近的上限,以及提高模型魯棒性
明白這兩個(gè)目標(biāo),在預(yù)處理階段你需要干什么就很容易反推出來(lái)了。
怎么提高模型可逼近上限?
-
提特征
-
特定領(lǐng)域還需要濾波和去噪
-
把干擾模型擬合的離群點(diǎn)扔掉
怎么提高模型的魯棒性?
-
數(shù)值型數(shù)據(jù)中的缺失值可以花式處理,默認(rèn)值,平均值,中位值,線(xiàn)性插值
-
文本數(shù)據(jù)可以在字,詞,句等粒度不同進(jìn)行處理
-
圖像數(shù)據(jù)進(jìn)模型之前把圖像進(jìn)行 90,180,270 等不同角度翻轉(zhuǎn)也是常見(jiàn)的處理方式了
總的來(lái)說(shuō),在這里就是需要在不同方面的進(jìn)行數(shù)據(jù)的描述,將一份原始數(shù)據(jù)稍作擴(kuò)展。
特征工程
特征工程應(yīng)包括兩部分特征抽取和特征挑選,特征挑選的資料網(wǎng)上一搜一大堆,因此這里只討論特征抽取,為什么?因?yàn)榍蓩D難為無(wú)米之炊啊,沒(méi)有特征你挑選個(gè)寶寶嗎?
-
第一個(gè)方法叫做按業(yè)務(wù)常識(shí)抽取。
簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是通過(guò)對(duì)你需要分類(lèi) / 預(yù)測(cè)等領(lǐng)域的先驗(yàn)知識(shí)來(lái)進(jìn)行抽取,比方說(shuō),要區(qū)分男生和女生,直接使用性特征肯定要比其他的身高體重這些數(shù)據(jù)的準(zhǔn)確率要高。當(dāng)然,考慮到每一個(gè)人都不可能所有知識(shí)都精通,當(dāng)面對(duì)一個(gè)陌生的業(yè)務(wù)領(lǐng)域時(shí),建議優(yōu)先提取 X1/X2 這樣形式的特征(這里的 X1,X2 不一定是一個(gè)變量,也可能使一個(gè)式子),因?yàn)閭鹘y(tǒng)的統(tǒng)計(jì)流派特別喜歡通過(guò) X1/X2 組成一個(gè)叫做 *** 率這樣的指標(biāo),有時(shí)可能有奇效。
-
第二個(gè)方法叫做抽取非線(xiàn)性特征。
線(xiàn)性模型具有簡(jiǎn)單,快速等優(yōu)勢(shì),但它的劣勢(shì)也很明顯,他只能表達(dá)線(xiàn)性關(guān)系,而一般現(xiàn)實(shí)問(wèn)題那有這么簡(jiǎn)單的線(xiàn)性關(guān)系。因此,解決方案就是線(xiàn)性模型使用非線(xiàn)性特征。
可能有些同學(xué)有有點(diǎn)懵逼,什么叫線(xiàn)性模型搭配非線(xiàn)性特征?看完這個(gè)下面這個(gè)例子就清楚了:
假設(shè)一個(gè)回歸預(yù)測(cè)的問(wèn)題,求的 y=f(x),那么有如下兩種形式的表達(dá)
…… (1)
……(2)
(1) 式是線(xiàn)性回歸,只能表達(dá)線(xiàn)性關(guān)系,(2) 式是多項(xiàng)式回歸,能夠表達(dá)非線(xiàn)性關(guān)系。這時(shí)我們令:
,
,
,
,
這時(shí)再回首去看 (2) 式,就能得到
…… (3)
有些童鞋應(yīng)該反應(yīng)過(guò)來(lái)了,是的,所謂的線(xiàn)性模型使用非線(xiàn)性特征的原理就是將非線(xiàn)性特征記作新的變量 t,然后扔進(jìn)一個(gè)線(xiàn)性模型里面,這時(shí)得到的就是關(guān)于 t 的線(xiàn)性模型,但卻可以表達(dá) x 的非線(xiàn)性關(guān)系。
至于提取非線(xiàn)性特征,除了人工提取這種多項(xiàng)式來(lái)做特征外,也可用深度學(xué)習(xí),SVM 等非線(xiàn)性模型的中間輸出來(lái)作為非線(xiàn)性特征。這些非線(xiàn)性模型的方法,也大概是把低維度投影到高維度后塞進(jìn)線(xiàn)性模型,至于說(shuō)為什么要用非線(xiàn)性模型提取,一是因?yàn)槭∪肆Γ且驗(yàn)槟P屯軐W(xué)習(xí)到人類(lèi)常識(shí)上意識(shí)不到的特征的,至于為什么不適用非線(xiàn)性模型直接進(jìn)去端對(duì)端的工作方式,則是因?yàn)槊恳粋€(gè)非線(xiàn)性模型提取非線(xiàn)性特征的方法都不一樣,那么提取出來(lái)的非線(xiàn)性特征自然也就不一樣了。
但要注意一點(diǎn)的是,是否使用模型來(lái)提取非線(xiàn)性特征這個(gè)決定要考慮實(shí)際情況,因?yàn)槎鄠€(gè)模型的非線(xiàn)性特征組合后,或者是模型融合技術(shù),計(jì)算量或時(shí)延是不可接受的,有些方法連工程實(shí)踐上都不一定可?。词褂蟹植际接?jì)算的環(huán)境),就更不要說(shuō)打 kaggle 的大部分都是個(gè)人用戶(hù),只有臺(tái)式機(jī)或筆記本。
模型訓(xùn)練和選擇
合理的劃分?jǐn)?shù)據(jù)集和訓(xùn)練集,平衡樣本,交叉驗(yàn)證這些東西是老生常談,網(wǎng)上一找一大堆,所以本文繼續(xù)不談。
先說(shuō)說(shuō)的是模型的選擇,機(jī)器學(xué)習(xí)經(jīng)常被稱(chēng)為玄學(xué),剛開(kāi)始我以為說(shuō)的是因?yàn)檎{(diào)包俠本根本不知道里面算法的原理,所以這樣造成,但后來(lái)我發(fā)現(xiàn),即使你知道里面的算法的原理,也依然是玄學(xué)。
為什么這么說(shuō),我們對(duì)比一下其他的一些類(lèi)型的程序出錯(cuò)是怎么解決的?print 大法?二分排查找 bug?無(wú)論是何種方法,只要 bug 可重新,你總是可以通過(guò)程序的表現(xiàn)而定位到錯(cuò)誤,但機(jī)器學(xué)習(xí)不行,除了模型是否過(guò)擬合可以通過(guò)一些指標(biāo)看出,然后調(diào)整對(duì)應(yīng)得參數(shù)外,其他的一些問(wèn)題,壓根無(wú)法通過(guò)現(xiàn)象而定位到需要修改的錯(cuò)誤。
比如說(shuō),預(yù)測(cè)效果不好,我知道肯定是需要增加特征,但需要增加一個(gè)哪些方面的特征?這個(gè)特征是需要引入新的數(shù)據(jù)維度,還可以從現(xiàn)有的數(shù)據(jù)提取出來(lái)?或者說(shuō)當(dāng)前的數(shù)據(jù)的價(jià)值已經(jīng)被我榨干了嗎?又或者說(shuō),你通過(guò)算特征與預(yù)測(cè)值的相關(guān)系數(shù),相關(guān)系數(shù)低的特征就一定沒(méi)用了嗎?顯然不是,因?yàn)槟悻F(xiàn)在只是算了單變量的,沒(méi)有算排列組合的結(jié)果,而至于算排列組合的結(jié)果,真的能算嗎?…… 諸如此類(lèi)的是沒(méi)有 100% 準(zhǔn)確的指導(dǎo)方案的(可能連 90% 準(zhǔn)確的指導(dǎo)方案都沒(méi))。
當(dāng)然,解決方法還是有的,就是不斷的堆特征,和堆模型,挑選后來(lái)一波融合,指望不同的模型能學(xué)到不同的方面,然后互相互補(bǔ)。
落實(shí)到行動(dòng),就是那句老話(huà),大膽假設(shè),小心求證。
說(shuō)了這么多,無(wú)非說(shuō)明機(jī)器學(xué)習(xí)模型可能是理論科學(xué),但實(shí)踐,一定是實(shí)驗(yàn)性科學(xué),既然是實(shí)現(xiàn)性科學(xué),就要遵守一個(gè)原則,先簡(jiǎn)單后復(fù)雜,過(guò)早優(yōu)化是萬(wàn)惡之源,無(wú)腦優(yōu)化則是浪費(fèi)時(shí)間。簡(jiǎn)單是指模型的簡(jiǎn)單,數(shù)值類(lèi)型可以先從簡(jiǎn)單的線(xiàn)性回歸開(kāi)始,(若是圖片領(lǐng)域的話(huà),可以選取一些比較基本的 DL 模型,比如預(yù)訓(xùn)練好的 vgg 系列),這樣出結(jié)果的速度肯定優(yōu)于其他亂七八糟的復(fù)雜模型,出結(jié)果快,意味著你可以趁早在線(xiàn)下確定較為妥當(dāng)?shù)臏y(cè)試方式,你的 baseline,快速驗(yàn)證你的其他思路,然后再慢慢優(yōu)化和調(diào)參。
在這個(gè)小節(jié)最后,來(lái)說(shuō)說(shuō)這次比賽中關(guān)于使用深度學(xué)習(xí)的感想。
目前公認(rèn)不適合使用深度學(xué)習(xí)的情況是當(dāng)數(shù)據(jù)量偏少,但一般現(xiàn)在比賽方提供的數(shù)據(jù)量都非常可觀(guān),所以數(shù)據(jù)量這個(gè)條件應(yīng)該說(shuō)是可以滿(mǎn)足的。
其次的一個(gè)公認(rèn)不適合的地方是,數(shù)據(jù)不具有局部相關(guān)特性。意思就是像圖像 / 自然語(yǔ)言等領(lǐng)域,數(shù)據(jù)之間具有局部相關(guān)性,比如說(shuō)一個(gè)像素不能表達(dá)足夠的信息,但一堆像素就能表示這是小狗還是小貓,語(yǔ)言中由單詞組成句子,而一旦這些東西組合的次序被打亂,那么整體所表達(dá)的信息亦同時(shí)被打亂。這些具有局部相關(guān)特性的數(shù)據(jù),可以通過(guò)一定的網(wǎng)絡(luò)拓?fù)涮崛∑渲械木植肯嚓P(guān)特性,同時(shí)配合深度達(dá)到層次特征的提取,從而達(dá)到較為優(yōu)秀的成果。對(duì)比三層 MLP 以及 CNN 在 minst 手寫(xiě)數(shù)字識(shí)別上的效果差異,就能充分說(shuō)明這個(gè)觀(guān)點(diǎn)。而對(duì)于不具有局部相關(guān)特性的數(shù)據(jù),沒(méi)法用特點(diǎn)的網(wǎng)絡(luò)拓?fù)鋪?lái)捕捉了他的信息,在深度學(xué)習(xí)中就只能用 MLP 來(lái)完成模型的訓(xùn)練,而 MLP 的效果,一般要弱于 GDBT,RandomForest 等傳統(tǒng)模型。
深度學(xué)習(xí)對(duì)比傳統(tǒng)方法來(lái)說(shuō),最大的優(yōu)勢(shì)是自動(dòng)特征的提取,但根據(jù)其他大牛分享的經(jīng)驗(yàn)來(lái)說(shuō),當(dāng)人工特征工程做到一定程度后,傳統(tǒng)模型是可以超越深度學(xué)習(xí)的,詳見(jiàn) quora 相似文本匹配的比賽里面,yesofcourse 隊(duì)伍的視頻,里面有一段是關(guān)于深度學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)模型的對(duì)比,另外亦有有人指出深度學(xué)習(xí)在面對(duì) x 和 y 的關(guān)系是一次推理的情況時(shí),深度學(xué)習(xí)能學(xué)到很好,如果是兩層或多層的推理的時(shí)候,相比傳統(tǒng)模型,深度學(xué)習(xí)卻完全處于劣勢(shì),但深度學(xué)習(xí)結(jié)合知識(shí)圖譜可以有效的解決這個(gè)問(wèn)題。
(個(gè)人猜想,這里大牛說(shuō)到的推理應(yīng)該是指在邏輯上的關(guān)系,比如你爸爸的媽媽的二叔的老婆的姐姐你應(yīng)該稱(chēng)呼她什么這種推理,而并非數(shù)學(xué)上 y=f(x) 這種關(guān)系)
而在這次比賽中的實(shí)際情況則比較有趣。在對(duì)數(shù)據(jù)集進(jìn)行了基本處理后 (對(duì)缺失值填充,去除離群點(diǎn)),沒(méi)有做任何的特征提取,分別塞進(jìn) xgboost 和 3 層 128 單元的 MLP,其中 LB 和線(xiàn)下的表現(xiàn),兩個(gè)模型的結(jié)果非常接近,差別基本上是小數(shù)點(diǎn)后 6 到 7 位。但是后來(lái)我人工提取了幾個(gè)特征,這時(shí)兩個(gè)模型的差異就開(kāi)始顯露出來(lái)了。線(xiàn)下差別不大,但 LB 上,xgboost 讓我的排名又十分可觀(guān)的上升,但 MLP 則讓我的 LB 得分有了十分可觀(guān)的…… 下降!起初覺(jué)得是產(chǎn)生了過(guò)擬合,后來(lái)分別加入了 dropout 和正則項(xiàng)嘗試,并沒(méi)有改善,也嘗試了使用 autoencoder 進(jìn)行特征提取,然后應(yīng)用到傳統(tǒng)模型上,效果都不盡人意,最后我決定不使用 DL 那套方法,改而采用傳統(tǒng)的機(jī)器學(xué)習(xí)模型 + 人工抽取特征。但在決定放棄 DL 之前,已經(jīng)浪費(fèi)了太多的時(shí)間在嘗試上(因?yàn)閷?duì) DL 有盲目的信心,總覺(jué)得成績(jī)不好是自己的參數(shù)問(wèn)題),沒(méi)有銀彈,具體情況具體分析,這也是以后處事應(yīng)該要注意的地方。
其實(shí)通過(guò)分析我發(fā)現(xiàn) DL 產(chǎn)生較為嚴(yán)重的誤差原因大概是,lable 其實(shí)正負(fù)數(shù)對(duì)半,但模型的輸出幾乎都是正,即使是負(fù)數(shù),該預(yù)測(cè)值的數(shù)值也非常少,并沒(méi)有找到合適的解決方法。
但無(wú)論是 xgboost 還是線(xiàn)性回歸,其預(yù)測(cè)值都可以做到正負(fù)各占 50%,因此,目前的方案是對(duì)這兩個(gè)模型最后的結(jié)果取了加權(quán)平均,目前(2017.7.22)排名到達(dá) 342/1702,按照套路,接下來(lái)應(yīng)該有一波模型融合,我是有自信再上升一定的名次的,但因?yàn)槲疫€有參加今年的考研,另外這次比賽經(jīng)歷我覺(jué)得已經(jīng)有足夠的長(zhǎng)進(jìn),便沒(méi)有繼續(xù)下去的打算,即使是繼續(xù)也是考研后的事了。
模型融合
關(guān)于模型融合,方法依舊在網(wǎng)上有一大堆,近幾年也沒(méi)有太大的創(chuàng)新,主要說(shuō)一下的就是模型融合前應(yīng)該畫(huà)一畫(huà)誤差曲線(xiàn),確定模型之間是否有融合的需要,比如一個(gè)模型完爆另外一個(gè)模型,那融合價(jià)值就很低。
后話(huà)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路;行萬(wàn)里路不如閱人無(wú)數(shù);閱人無(wú)數(shù)不如高人指路。參與到面向全社會(huì)的比賽,其實(shí)比參加學(xué)校某些我不想提名字的比賽更有意義,雖然拿獎(jiǎng)很難,但因?yàn)槟芙佑|到的是近似真實(shí)的流程,不同水平,不同行業(yè)背景的人,尤其是認(rèn)識(shí)一個(gè)的朋友后會(huì)以認(rèn)識(shí)更多牛逼的朋友,這些機(jī)會(huì)對(duì)一個(gè)人的知識(shí)技能和人脈積累都有巨大的好處,如果你還處于學(xué)生時(shí)代,這個(gè)機(jī)會(huì)的潛在價(jià)值會(huì)翻倍。
最后,因?yàn)檫@個(gè)比賽還在進(jìn)行中,所以代碼我不會(huì)給,但你真想要當(dāng)伸手黨,去 kaggle 的 kernels 上有很多排名比我高的放在了上面,如果只是問(wèn)題探討,歡迎在評(píng)論區(qū)或私信留言,文字應(yīng)該足夠了。
最后的最后,因?yàn)槲也恢绹?guó)內(nèi)除了 top 的一些學(xué)校外,其余學(xué)校關(guān)于機(jī)器學(xué)習(xí)或深度學(xué)習(xí)方向的研究水平怎么樣 (子方向不太在意),廣東地區(qū)的考生,歡迎熱心的知友推薦學(xué)校和實(shí)驗(yàn)室
,在這里先謝謝了,我保證看在推薦的份上不吃你。:P