本文作者指出了關(guān)于數(shù)據(jù)科學(xué)書上很少提及的三點經(jīng)驗:模型評價方法是關(guān)鍵,特征提取是根本,模型選擇而非數(shù)據(jù)集規(guī)模最費時間。文章指出,處理上萬維的特征和幾十萬的樣本的現(xiàn)代算法是愚蠢的,而特征工程理論還不完善,更像是一門藝術(shù)。
這是數(shù)據(jù)科學(xué)大行其道的時代。各類課程、博客、培訓(xùn)學(xué)校如雨后春筍般出現(xiàn)。然而,每次我瀏覽這些學(xué)習(xí)資料時,我發(fā)現(xiàn)它們過于強調(diào)一些具體的算法。理解邏輯回歸或者深度學(xué)習(xí)的原理當(dāng)然很酷,可是一旦從事數(shù)據(jù)相關(guān)工作,你會發(fā)現(xiàn)還有其它一些同樣重要的事情,甚至更為重要的。
我真不應(yīng)該去責(zé)備這些課程。我在大學(xué)任教機器學(xué)習(xí)課程很多年了,課堂上主要是講解具體算法。你掌握了支持向量機(SVM)、高斯混合模型(GMM)、k均值(k-Means)聚類等算法的細(xì)枝末節(jié),但是直到寫碩士論文的時候才學(xué)會如何正確地處理數(shù)據(jù)。
那么何謂正確?最終結(jié)果難道不能驗證處理方法嗎?得到出色的預(yù)測效果是否意味著一切順利呢?顯然沒錯,但關(guān)鍵是確保算法在未來數(shù)據(jù)上仍舊得到出色的效果。我在別處也寫過,如果僅憑著訓(xùn)練數(shù)據(jù)的表現(xiàn)就輕信自己的算法,實在是太自欺欺人了。
那么下面是我的三個主要見解,其它書本里很少提及。
1、評價方法是關(guān)鍵
數(shù)據(jù)分析/機器學(xué)習(xí)/數(shù)據(jù)科學(xué)(或者無論你如何稱呼它)的主要目標(biāo)就是搭建一套系統(tǒng)并且將來在測試數(shù)據(jù)上效果好。監(jiān)督式學(xué)習(xí)(例如分類)和非監(jiān)督式學(xué)習(xí)(例如聚類)的差異導(dǎo)致很難籠統(tǒng)地解釋它,但無非都是你收集一個數(shù)據(jù)集合,在其之上搭建系統(tǒng)和設(shè)計算法。但最終你需要將這種算法應(yīng)用于未來的數(shù)據(jù),同時希望確保在新數(shù)據(jù)上的表現(xiàn)和在原始數(shù)據(jù)集上的表現(xiàn)幾乎一樣好。
初學(xué)者常犯的錯誤就是僅僅關(guān)注手頭數(shù)據(jù)集上的表現(xiàn)效果,然后認(rèn)為在未來數(shù)據(jù)上同樣奏效。不幸的是這種情況非常稀罕。我們暫且以監(jiān)督式學(xué)習(xí)為例,它的目標(biāo)是根據(jù)你的輸入預(yù)測輸出結(jié)果,比如把郵件分為垃圾郵件和正常郵件兩類。
如果你只考慮訓(xùn)練集數(shù)據(jù),那么機器很容易記住整個訓(xùn)練集,然后返回完美的測試結(jié)果(除非數(shù)據(jù)自相矛盾)。事實上,對人來說這種情況也很正常。還記得你在學(xué)外語背單詞的時候,總是把單詞順序打亂來測試嗎?因為否則大腦就會憑著之前單詞的順序來回憶。
機器憑借它們存儲和讀取大量數(shù)據(jù)的強大能力,輕而易舉地完成同類的任務(wù)。這就造成過擬合現(xiàn)象,還缺乏泛化能力。
因此合適的評價方法是模擬有未來數(shù)據(jù)的場景,把數(shù)據(jù)集一分為二,一部分做訓(xùn)練集,然后在另一部分測試集數(shù)據(jù)上做預(yù)測。通常,訓(xùn)練集被分得大一些,這個過程也會重復(fù)很多遍以得到一系列測試結(jié)果,來觀察算法的穩(wěn)定性。這整個過程就稱為交叉驗證。
為了模擬在未來數(shù)據(jù)上的性能,,你需要把現(xiàn)有的數(shù)據(jù)一分為二,一份用來訓(xùn)練模型,另一份僅用于模型評估。
然而,差錯還是會時常發(fā)生,尤其當(dāng)數(shù)據(jù)集是非靜態(tài)的,也就是說,數(shù)據(jù)的分布隨著時間而發(fā)生變化。現(xiàn)實世界的數(shù)據(jù)往往如此。一月份的銷售圖表和六月份的看上去會迥然不同。
或者數(shù)據(jù)點之間相關(guān)性很高,就是說若你知道一個數(shù)據(jù)點,那另一個樣本數(shù)據(jù)的信息也八九不離十了。打個比方,拿股票價格來說,天與天的波動并不劇烈,那么以天為單位隨機切分訓(xùn)練/測試數(shù)據(jù)集會導(dǎo)致訓(xùn)練集和測試集的數(shù)據(jù)高度相關(guān)。
上述情況一旦發(fā)生了,你就會得到過度優(yōu)化的結(jié)果,而這個算法在真實測試數(shù)據(jù)上的表現(xiàn)并不盡如人意。在最壞的情況下,你費盡精力說服別人采用你的算法,而算法卻失效了,因此學(xué)會正確地評估模型是關(guān)鍵!
2、特征提取是根本
學(xué)習(xí)一種新算法令人激動,可事實上大多數(shù)復(fù)雜算法的效果大同小異,真正造成差異的是原始數(shù)據(jù)如何轉(zhuǎn)化為用以學(xué)習(xí)的特征這個步驟。
現(xiàn)代學(xué)習(xí)算法十分強大,處理上萬維的特征和幾十萬的樣本都是小菜一碟,然而事實卻是這些算法最后來看都是愚蠢的。尤其是那些學(xué)習(xí)線性模型的算法(如邏輯回歸,線性支持向量機)簡直和計算器一般簡陋。
它們從足夠的數(shù)據(jù)樣本里鑒別出有效信息的本領(lǐng)很強大,但如果有效信息并不被包含其中,或者不能用輸入特征的線性組合所表示,它們就沒有了用武之地。它們本身也無法通過“洞察”數(shù)據(jù)來完成數(shù)據(jù)精簡這一環(huán)節(jié)。
換句話說,如果找到合適的特征,數(shù)據(jù)量就能被大大縮減。理想情況下,如果把所有特征縮減到只剩下你想預(yù)測的方程,那就沒什么可學(xué)習(xí)的了,對吧?這就是特征提取的強大之處!
需要提醒兩點:首先,你必須確保完全理解這些等價算法中的一種,然后就可以一直用下去了。因此你并不真的需要邏輯回歸加上線性SVM,選一種就夠了。這還包括明白哪些算法幾乎是等價的,使用這些模型的關(guān)鍵點在哪里。深度學(xué)習(xí)有些區(qū)別,但是各種線性模型的表達(dá)能力幾乎一樣。盡管,訓(xùn)練時間、解的稀疏性等會有差別,但大多數(shù)情況下它們的預(yù)測能力是相近的。
其次,你必須完全掌握特征工程。不幸的是,這更像是一門藝術(shù),而且因為理論不完善書本里很少提及。特征值歸一化是一條捷徑。有時候,特征值需要取對數(shù)計算。若是能夠降低一部分自由度,也就是說去掉數(shù)據(jù)中對預(yù)測結(jié)果沒影響的那部分變量,你所需要訓(xùn)練的數(shù)據(jù)量將會大大降低。
有時候這些轉(zhuǎn)換很容易被發(fā)現(xiàn)。例如,如果你要做手寫字符識別,只要有前景和背景的區(qū)分,那么字符的顏色對識別顯然是不重要的。
我知道課本總是推銷一些看起來很強大的算法,似乎只要你把數(shù)據(jù)扔給它們就萬事大吉了。從理論觀點和無窮的數(shù)據(jù)來源角度來說,這也許是正確的。但現(xiàn)實中,數(shù)據(jù)和我們的時間是有限的,尋找高信息量的特征絕對是至關(guān)重要的。
3、時間瓶頸是模型選擇,而非數(shù)據(jù)集規(guī)模
這是個在大數(shù)據(jù)時代你不愿大肆提及的事物,可是大多數(shù)數(shù)據(jù)集都能被完全加載到主存里。你的算法同樣可能也不需要消耗太多時間計算。但你需要花費大量時間從原始數(shù)據(jù)中提取特征,通過交叉驗證來比較不同特征提取方法和不同算法參數(shù)的效果差異。
在選擇模型時,你嘗試無數(shù)次各種參數(shù)的組合,并在相同的數(shù)據(jù)集上評價效果差異。
問題歸根結(jié)底在于組合項的爆發(fā)式增長。假設(shè)現(xiàn)在只有兩個參數(shù),并且訓(xùn)練模型和在測試集上評價效果(按照上述正確的評價方式)需要大約一分鐘時間。如果每個參數(shù)有5個候選值,采取5折交叉驗證(把數(shù)據(jù)集分成5份,重復(fù)訓(xùn)練測試過程5次,每次用不同的一份數(shù)據(jù)作為測試集),這意味著你需要125輪計算來確定哪種算法效果最好,你的等待時間也將是大約2小時而不是1分鐘。
一個好消息是上述過程很容易并行化,因為每輪計算都是相互獨立的。特征提取也是如此,通常也是對每個數(shù)據(jù)集獨立地進(jìn)行相同操作(解析、提取、轉(zhuǎn)換等),導(dǎo)致了所謂的“密集并行”(沒錯,這是個專業(yè)術(shù)語)。
一個壞消息主要針對大數(shù)據(jù)而言,因為所有的這些意味著對大規(guī)模實現(xiàn)復(fù)雜算法的需求很少,然而多數(shù)情況下目前用非分布式算法并行計算內(nèi)存中的數(shù)據(jù)已經(jīng)很有幫助了。
當(dāng)然,也存在一些應(yīng)用,比如針對廣告優(yōu)化的TB級日志的全局模型和百萬用戶級推薦系統(tǒng),但常規(guī)的使用案例都是這里羅列的那些類型。
最后,擁有大量數(shù)據(jù)也不意味著你真的需要這么多。關(guān)鍵在于學(xué)習(xí)過程的復(fù)雜度。如果問題用簡單的模型可以解決,就不要用過多的數(shù)據(jù)來訓(xùn)練模型參數(shù)。那樣的話,隨機抽樣數(shù)據(jù)集的一部分就足夠用了。另外如我在上文中提到的那樣,有時候準(zhǔn)確的特征表達(dá)也能大幅度削減需要的數(shù)據(jù)量。
總結(jié)
總之,知道如何正確評價結(jié)果能降低算法在未來測試數(shù)據(jù)上失敗的風(fēng)險。特征提取準(zhǔn)確也許是提升效果的最佳途徑,最后,大數(shù)據(jù)并不總是需要,盡管分布式計算能幫助減少訓(xùn)練時間。