數(shù)據(jù)科學(xué)經(jīng)驗(yàn)談:這三點(diǎn)你在書里找不到
如果你還沒有聽說過數(shù)據(jù)科學(xué),那一定是我瘋了。各種培訓(xùn)、崗位、學(xué)校課程像雨后春筍一樣遍地開花。每次我看到這些東西的樣品時,我總是格外關(guān)注他們學(xué)習(xí)算法的細(xì)節(jié)。當(dāng)然,了解回歸、深度學(xué)習(xí)的工作原理是件很酷的事情,但是當(dāng)你真正動手處理數(shù)據(jù)的時候你就會發(fā)現(xiàn),可能有些其他的事情也同樣重要,甚至更重要。
我真的不是在說這些課程的壞話。我在大學(xué)教了很多年的機(jī)器學(xué)習(xí),教的東西始終都圍繞著那些非常具體的算法模型。你可能非常了解支持向量機(jī),高斯混合模型, K-均值聚類等等,但是只有當(dāng)你開始準(zhǔn)備碩士論文的時候,你才真的學(xué)會了如何正確的處理數(shù)據(jù)。
什么樣的處理才算是正確的處理呢?為了目的不擇手段?只要得到好的預(yù)測性能就萬事大吉?事實(shí)確實(shí)如此,但是這么做的關(guān)鍵在于,你能確保未知數(shù)據(jù)也能有個不錯的表現(xiàn)。就像我經(jīng)常說的那樣,你很容易就會受到它的蒙蔽,在分析訓(xùn)練結(jié)果的時候,輕易地就相信了你選擇的方法。
因此,在這里我要分享我的三點(diǎn)經(jīng)驗(yàn),因?yàn)槲野l(fā)現(xiàn)書里很少會提到這些,但是他們真的很重要。
1.模型評價是關(guān)鍵
數(shù)據(jù)分析/機(jī)器學(xué)習(xí)/數(shù)據(jù)科學(xué)(或任何你能想到的領(lǐng)域)的主要目標(biāo),就是建立一個系統(tǒng),要求它在預(yù)測未知數(shù)據(jù)上有良好的表現(xiàn)。區(qū)分監(jiān)督學(xué)習(xí)(像分類)和無監(jiān)督學(xué)習(xí)(如聚合)其實(shí)沒有太大的意義,因?yàn)闊o論如何你總會找到辦法來構(gòu)建和設(shè)計你的數(shù)據(jù)集。方法行不行***還是得看它在未知數(shù)據(jù)上的表現(xiàn),你得保證它能得出同你過去的訓(xùn)練集一樣的結(jié)果。
初學(xué)者最常犯一個錯誤就是看到已知數(shù)據(jù)的表現(xiàn),就想當(dāng)然的認(rèn)為未知數(shù)據(jù)也會一樣。通常你會發(fā)現(xiàn),現(xiàn)實(shí)是很骨感的。這里我們就只說監(jiān)督學(xué)習(xí),任務(wù)就是根據(jù)你的輸入預(yù)測輸出,例如把電子郵件分成垃圾郵件和非垃圾郵件。
如果你只考慮訓(xùn)練數(shù)據(jù),通過讓機(jī)器記住一切,很輕松的就能得到***的預(yù)測結(jié)果(除非這些數(shù)據(jù)自相矛盾)。這并不是什么新鮮事兒,人類自己就是這樣的。還記得你學(xué)外語背單詞的苦逼時光么,你必須檢查單詞字母的順序,因?yàn)槟愕拇竽X需要按正確的順序記住他們。
機(jī)器在存儲和檢索大量數(shù)據(jù)上的優(yōu)勢是人類拍馬不及的。但這也帶來了過擬合和泛化能力差的問題。
所以,一個好的評價方法是模擬未知數(shù)據(jù)的影響來分割數(shù)據(jù),一部分用來訓(xùn)練,一部分用來檢測效果。通常,用較大的訓(xùn)練集建模,然后用小的那部分進(jìn)行預(yù)測,經(jīng)過多次迭代來得到一個較穩(wěn)定的模型。這個過程就是我們常說的交叉驗(yàn)證。
為了模擬未知數(shù)據(jù)的表現(xiàn),把數(shù)據(jù)集分為兩個部分,一部分用于訓(xùn)練,一部分用于預(yù)測。
就算我們這么做了,還是很有可能出問題,特別是在數(shù)據(jù)非平穩(wěn)的時候,數(shù)據(jù)的潛在分布會隨著時間變來變?nèi)?。利用真?shí)數(shù)據(jù)預(yù)測時經(jīng)常會碰到這種情況,同樣是銷售數(shù)據(jù),六月和七月的就可能差別巨大。
還有數(shù)據(jù)點(diǎn)間的相關(guān)性,如果你知道了一個數(shù)據(jù)點(diǎn)那么你肯定對另一個數(shù)據(jù)點(diǎn)也有了一些了解。好比股票價格,他們通常不會在兩天之間任意的大幅波動,因此如果你胡亂的拆分訓(xùn)練/預(yù)測數(shù)據(jù),就會破壞這種相關(guān)性。
每當(dāng)出現(xiàn)這種情況,你得到的結(jié)果就會過于樂觀,而你的模型似乎不打算在現(xiàn)實(shí)應(yīng)用中也這么給你面子。最糟糕的情況就是,你千辛萬苦終于說服人們認(rèn)可你的方法,結(jié)果下水一試,它當(dāng)?shù)袅?hellip;…
所以學(xué)習(xí)如何正確的進(jìn)行模型評價是關(guān)鍵!
2.特征提取是天
學(xué)習(xí)一種新的算法感覺總是很棒,但現(xiàn)實(shí)是,最復(fù)雜的算法執(zhí)行起來和那些老辦法 幾乎沒什么兩樣,真正的區(qū)別在于原始數(shù)據(jù)的特征學(xué)習(xí)。
現(xiàn)在的模型功能看起來非常強(qiáng)大,隨隨便便就能處理成千上萬的特征和數(shù)據(jù)點(diǎn),其 實(shí)本質(zhì)上并沒聰明到哪里。特別是線性模型(像logistic回歸或線性支持向量機(jī)),就是個傻乎乎的計算器。
這些模型確實(shí)很擅長在數(shù)據(jù)充足的情況下識別信息的特征,但是如果信息不充足,或者不能按線性組合的特征來表示,那基本就沒什么可玩了。同樣這些模型也不能通過“洞察”自行簡化數(shù)據(jù)。
換句話說,你可以通過尋找合適的特征,來大量簡化數(shù)據(jù)。坦白來講,如果你能為想做預(yù)測的功能簡化掉所有特征,那還有什么需要學(xué)習(xí)的呢?!這就是多么強(qiáng)大的特征提取啊!
這意味著兩件事情:首先,你應(yīng)該確保你確實(shí)掌握了這些幾乎相同的方法中的一種,并且始終不拋棄它。你真的不需要同時掌握邏輯回歸和線性支持向量機(jī),你只要選擇一個就夠了。這些方法幾乎都是相似的,關(guān)鍵的不同就在于底層模型。深度學(xué)習(xí)還有些特別的東西,但線性模型在表現(xiàn)能力上幾乎都是相同的。雖然,訓(xùn)練時間、解決方案的稀疏度等可能會有些不同,但在大多數(shù)情況下你會得到相同的預(yù)測性能。
其次,你應(yīng)該了解所有的特征工程。這是一門藝術(shù),不幸的是,幾乎所有的教科書都沒有涵蓋這一點(diǎn),因?yàn)殛P(guān)于它的理論太少了。它的常規(guī)化就像我們的霧霾一樣,還有很長的路要走。有時,特征需要取對數(shù)。每當(dāng)降低一定的自由度,就是擺脫那些與預(yù)測任務(wù)不相關(guān)的數(shù)據(jù),可以顯著降低你所需的訓(xùn)練集數(shù)量。
有些情況下這種類型的轉(zhuǎn)化會不可思議的簡單。例如,如果你正在做手寫字體識別,你就會發(fā)現(xiàn)有沒有一個識別度高的顏色并不重要,你只要有一個背景和前景就OK了。
我知道,教科書往往將算法模型描述的異常強(qiáng)大,好像只要你把數(shù)據(jù)扔給模型,他們就會把一些都做了。從理論和***的數(shù)據(jù)源上看它可能是對的。但很遺憾,我們的時間和數(shù)據(jù)都是有限的,所以尋找包含信息大的特征是絕對有必要的。
3.最耗神的是模型選擇,而不是數(shù)據(jù)集的大小
在大數(shù)據(jù)時代,很多你不想被人知道的事情都被你的主內(nèi)存以數(shù)據(jù)集的方式***的記錄下來。你的模型可能不需要花太多時間就能跑完這些數(shù)據(jù),但是卻要花費(fèi)非常多的時間從原始數(shù)據(jù)中提取特征,利用交叉驗(yàn)證的方法來比較不同學(xué)習(xí)模型的渠道和參數(shù)。
為了選擇合適的模型,你需要大量的組合參數(shù),再利用備份數(shù)據(jù)來評估它的表現(xiàn)。
問題來了,組合參數(shù)的爆發(fā)式增長。如果你只有兩個參數(shù),可能只需要花費(fèi)1分鐘就能完成訓(xùn)練,并且得到性能的評估結(jié)果(用合適的評估像我上面說的那樣)。但如果每個參數(shù)有5個候選值,那就需要執(zhí)行5倍的交叉驗(yàn)證(把數(shù)據(jù)集分成5份,每個測試都跑5遍,在每一次迭代中用不同的數(shù)據(jù)測試),這意味著你需要把上面的步驟重復(fù)125次去找到一個好的模型,你要等待的就不是1分鐘,而是兩小時。
好消息是,在多參數(shù)的情況下你可以并行操作,因?yàn)槊總€部分都是獨(dú)立運(yùn)行的。這 種對每個獨(dú)立數(shù)據(jù)集進(jìn)行相同操作(分割,提取,轉(zhuǎn)換等)的過程,被稱為“密集并行”(沒錯,這是一個技術(shù)術(shù)語)。
這里的壞消息大多針對大數(shù)據(jù),因?yàn)檫@些都意味著很少需要復(fù)雜模型的可擴(kuò)展實(shí)現(xiàn)。在大多數(shù)情況下,僅僅通過對內(nèi)存中的數(shù)據(jù)執(zhí)行相同的非分布式算法,再把這種方法并行化就足夠了。
當(dāng)然,像用于TB級日志數(shù)據(jù)的廣告優(yōu)化和面向百萬用戶推薦的 learning global models這樣的應(yīng)用也是存在的,但是最常見的用例都是這里描述的類型。
***,擁有很多數(shù)據(jù)并不意味著你都需要他們。***的問題在于底層學(xué)習(xí)的復(fù)雜性。如果這個問題能被一個簡單的模型解決,你就不需要用這么多的數(shù)據(jù)來檢驗(yàn)?zāi)P?,也許一個隨機(jī)的數(shù)據(jù)子集就可以解決問題了。像我上面說的,一個好的特征表現(xiàn)能幫助你急劇的降低所需要數(shù)據(jù)點(diǎn)的量。
綜上所述
總之,知道如何正確的評估,對降低你的模型在面對未知數(shù)據(jù)時的風(fēng)險是非常有幫助的。掌握合適的特征提取方法,可能是幫助你取得一個好的結(jié)果的***方法,***,并沒有那么多大數(shù)據(jù),通過分布式計算可以降低訓(xùn)練時間。