機器學(xué)習(xí)性能改善備忘單:32個幫你做出更好預(yù)測模型的技巧和竅門
機器學(xué)習(xí)最有價值(實際應(yīng)用最廣)的部分是預(yù)測性建模。也就是在歷史數(shù)據(jù)上進行訓(xùn)練,在新數(shù)據(jù)上做出預(yù)測。
而預(yù)測性建模的首要問題是:
如何才能得到更好的結(jié)果?
這個備忘單基于本人多年的實踐,以及我對***機器學(xué)習(xí)專家和大賽優(yōu)勝者的研究。
有了這份指南,你不但不會再掉進坑里,而且會提升性能,甚至在你自己的一些預(yù)測難題中取得***水平的結(jié)果。
讓我們一起來看看吧!
概述
本備忘單的目的是為你提供一些提升機器學(xué)習(xí)性能的想法。要獲得突破,你所需要的可能就是其中的一個。找到你要的那個,然后回來,再找下一個再提升。
我把這份清單分為4個子主題:
1、基于數(shù)據(jù)改善性能
2、借助算法改善性能
3、用算法調(diào)參改善性能
4、借助模型融合改善性能
清單越往下,你獲得的增益可能越小。比如,對問題場景重新設(shè)立框架或者更多的數(shù)據(jù)通常比對***的算法進行調(diào)參得到收益要多。
不總是這樣,但通常如此。
1.基于數(shù)據(jù)改善性能
改變你的訓(xùn)練集數(shù)據(jù)以及問題定義方式,你能夠得到很大提升,也許是***的提升。
策略:從新的、不同的角度透視你的數(shù)據(jù),以便將潛藏的問題結(jié)構(gòu)充分暴露給算法。
數(shù)據(jù)策略
• 獲得更多的數(shù)據(jù):你能夠拿到更多或者更高質(zhì)量的數(shù)據(jù)么?對現(xiàn)代非線性機器學(xué)習(xí)模型如深度學(xué)習(xí)而言,數(shù)據(jù)越多,改進越多。
• 創(chuàng)造更多數(shù)據(jù):如果你不能拿到更多數(shù)據(jù),那么,你能創(chuàng)造出新的數(shù)據(jù)么?也許你可以填充或者重新排列現(xiàn)有數(shù)據(jù),或者利用概率模型來產(chǎn)生新的數(shù)據(jù)。
• 清潔你的數(shù)據(jù)。你能否改善數(shù)據(jù)中的信號?也許可以糾正或刪除一些缺失或錯誤的觀測值,或者在合理范圍外的離群點,從而提升數(shù)據(jù)質(zhì)量。
• 數(shù)據(jù)重新取樣。你能否對數(shù)據(jù)重新取樣,以改變其大小或者分布?也許你可以用一個小得多的數(shù)據(jù)來實驗,以提高實驗的速度;或?qū)δ硞€特殊類型的觀察值進行過采樣/欠采樣以使得它們更好地代表整個數(shù)據(jù)集。
• 重新界定問題:你能否改變你正試圖解決的問題類型?重構(gòu)數(shù)據(jù),如回歸,二項或多項分類,時間序列,異常檢測,評分,推薦等問題類型。
• 重新縮放數(shù)據(jù)。你能否對數(shù)值型變量進行縮放處理?輸入數(shù)據(jù)的歸一化和標(biāo)準(zhǔn)化處理可以提升使用加權(quán)或距離度量的算法性能。
• 轉(zhuǎn)化數(shù)據(jù)。你能否改變數(shù)據(jù)的分布形態(tài)?使得數(shù)據(jù)更服從高斯分布,或進行指數(shù)變換可能會暴露出數(shù)據(jù)更多的特征供算法學(xué)習(xí)。
• 數(shù)據(jù)投影(映射):你能否將數(shù)據(jù)投影到一個更低維的空間?你可以用無監(jiān)督的聚類或投影方法,創(chuàng)造一個新的壓縮數(shù)據(jù)集代表。
• 特征選擇。所有的輸入變量是否同等重要?使用特征選擇和衡量特征重要性的方法,可以創(chuàng)造出數(shù)據(jù)的新視角,供模型算法探索。
• 特征工程。 你能夠創(chuàng)造或者增加新的特征?也許有的屬性可以分解為多個新的值(比如類別,日期或字符串)或者屬性可以聚集起來代表一個事件(如一個計數(shù),二進制標(biāo)志或統(tǒng)計信息)
上面這些工作的期待結(jié)果是:你應(yīng)該得到數(shù)據(jù)集的一批新視角和新版本。
下一步:你可以用預(yù)測性模型算法評估它們每一個的價值。
2.借助算法改善性能
機器學(xué)習(xí)無外乎算法。
調(diào)整的策略:找出那些性能高于基線水平,比平均水平要好的算法和數(shù)據(jù)呈現(xiàn)方式。對結(jié)果保持懷疑態(tài)度,設(shè)計實驗,使得它很難愚弄你。
算法策略
• 重采樣方法。要用什么樣的重采樣方法來估計其在新數(shù)據(jù)上的能力?使用一種能夠***地利用現(xiàn)有數(shù)據(jù)的方法和參數(shù)設(shè)置。K折交叉驗證法,利用其中的一折作為驗證集可能是***操作。
• 評價指標(biāo)。用什么樣的指標(biāo)來評價預(yù)測能力?選擇能夠***地體現(xiàn)問題和專業(yè)需求的指標(biāo)。不要任何問題一上來就看分類準(zhǔn)確率。
• 基線性能。比較算法時,什么是基線性能?通過隨機算法或零規(guī)則算法(預(yù)測均值或眾數(shù))來建立一個基線,并以此對所有算法進行排序。
• 抽檢線性算法。什么樣的線性算法能有好結(jié)果?線性方法通常更容易產(chǎn)生偏倚,也易于理解,能快速訓(xùn)練。如果能達到好效果,則更容易被選中。評估多個不同的線性方法。
• 抽檢非線性算法。哪些非線性算法能有好結(jié)果?非線性算法通常要求更多數(shù)據(jù),有更高的復(fù)雜性,但是能獲得更好的性能。評估多個不同的非線性方法。
• 從文獻中偷師學(xué)藝。哪些文獻報導(dǎo)的方法能很好地解決你的問題?也許你能從算法類型或傳統(tǒng)方法的延伸中獲取解決自己問題的靈感。
• 標(biāo)準(zhǔn)參數(shù)設(shè)置。評估算法時,什么是標(biāo)準(zhǔn)的參數(shù)設(shè)置?每一個算法都有機會解決你的問題,這不是說在現(xiàn)有基礎(chǔ)上死磕調(diào)參,而是說,每一種算法都需要把參數(shù)調(diào)好,才能在算法“大賽”中有勝出的機會。
上面這些工作的期待結(jié)果是:你應(yīng)該會得到性能良好的候選算法和數(shù)據(jù)呈現(xiàn)候選方法清單(不太長的有限個方法)。
下一步:通過算法調(diào)參改善性能
3.用算法調(diào)參改善性能
算法調(diào)參可能是你花時間最多的地方。它可能非常耗時間,從算法抽檢中很快能挖掘出一兩個性能不錯的算法,而把這一兩個算法的潛力充分挖掘出來可能需要好幾天,幾周甚至幾個月的時間。
調(diào)整的策略:充分挖掘性能良好的算法的潛力。
調(diào)參策略
• 診斷。對算法要做哪些診斷和回顧?也許可以回顧一下學(xué)習(xí)曲線,了解目前模型的狀態(tài)是過擬合還是欠擬合,然后糾正它。不同的算法可能提供不同的可視化結(jié)果和診斷。檢視算法得到正確預(yù)測結(jié)果和錯誤預(yù)測結(jié)果的樣本。
• 試試直覺。你的直覺是什么?如果你琢磨參數(shù)的時間足夠長,而反饋回路又很短,那么你會得到怎么調(diào)參的直覺。試一試,看看你遇到更大的難題時能不能再得到新的參數(shù)設(shè)置靈感。
• 學(xué)習(xí)文獻。文獻中用到了哪些參數(shù),范圍是多少?評估標(biāo)準(zhǔn)參數(shù)性能是調(diào)參的良好開端。
• 隨機搜索。哪些參數(shù)可以用隨機搜索?也許你可使用算法超參數(shù)的隨機搜索,來發(fā)現(xiàn)那些你永遠也想不到的參數(shù)設(shè)置。
• 網(wǎng)格搜索。哪些參數(shù)可以使用網(wǎng)格搜索?也許有一些標(biāo)準(zhǔn)超參數(shù)網(wǎng)格值,你可以拿來賦值,從而發(fā)現(xiàn)好的參數(shù)設(shè)置,重復(fù)這一過程,不斷精調(diào)網(wǎng)格。
• ***化。那些參數(shù)可以優(yōu)化?也許有一些參數(shù),如結(jié)構(gòu)或者學(xué)習(xí)率,可以用直接搜索程序(如模式搜索)或隨機優(yōu)化(如遺傳算法)來調(diào)整。
• 交替實施。算法有哪些其他的實施?也許其中的一個交替實施方法可以在同樣的數(shù)據(jù)上得到更好的結(jié)果。每個算法都有無數(shù)的微決定由算法的使用者做出,其中的一些可能會影響到問題的解決。
• 算法延伸。哪些是常見的算法延伸?也許你可以通過評估常見的或標(biāo)準(zhǔn)的算法延伸而提高性能。這可能需要一些實施工作。
• 算法定制。對你的個案而言,需要做哪些算法定制?也許你可以為你的數(shù)據(jù)修飾算法,從損失函數(shù),內(nèi)部優(yōu)化方法到算法的具體決定。
• 聯(lián)系專家。對你的個案,專家們有什么算法推薦?給一個或多個算法領(lǐng)域的學(xué)術(shù)界專家寫封簡單的郵件,概述你的預(yù)測問題,以及你已經(jīng)做出的嘗試。這可能會讓你獲悉前沿工作,或者學(xué)術(shù)界不為你所知的新想法。
上面這些工作的期待結(jié)果是:你應(yīng)該可以得到一個很短的清單,上面是經(jīng)過精調(diào)的算法。也許甚至只剩下一個。
下一步:到這一步,對剩下的一個或多個模型進行***的收尾,做出預(yù)測或者投放到產(chǎn)品中。更進一步的性能提升可以通過多個模型的融合來達到。
4. 借助模型融合改善性能
你可以組合多個模型的預(yù)測。在算法調(diào)參之后,這是下一個大的改善空間。實際上,組合多個“夠用”的模型,而不是多個精調(diào)(同時也非常脆弱,可能嚴(yán)重overfitting)的模型通??梢赃_到很好的性能提升。
策略:組合多個性能良好的模型預(yù)測結(jié)果。
組裝策略
• 混合模型預(yù)測結(jié)果。 你是否可以直接組合多個模型的預(yù)測結(jié)果?也許你可以使用同樣的或不同的算法來搭建多個模型。對各自的預(yù)測結(jié)果取均值,或者眾數(shù)。
• 混合數(shù)據(jù)呈現(xiàn)方式。你是否可以組合用不同數(shù)據(jù)呈現(xiàn)方法得到的模型預(yù)測結(jié)果?也許你使用了不同的問題投射方法,來訓(xùn)練性能良好的的算法,那么這些預(yù)測結(jié)果可以組合起來。
• 混合數(shù)據(jù)樣本。你是否可以組合不同數(shù)據(jù)角度(特征)訓(xùn)練的模型?也許你可以創(chuàng)造訓(xùn)練樣本的多個子樣本來訓(xùn)練一個性能良好的算法,然后把結(jié)果組合起來。這叫做自助聚集(bootstrap aggregation)或者bagging,當(dāng)各個模型的預(yù)測都很高明而方法各異(不相關(guān))時,效果***。
• 糾正預(yù)測。你是否可以糾正性能良好模型的預(yù)測?也許你可以明確地糾正預(yù)測結(jié)果,或者通過像boosting這樣的方法來學(xué)習(xí)如何糾正預(yù)測錯誤。
• 學(xué)習(xí)組合。你能否使用新的模型,學(xué)習(xí)如何將多個性能良好的預(yù)測結(jié)果以***方式組合起來?這叫做堆棧(stacked generalization or stacking),當(dāng)各子模型都很高明而方法各異時,通常能產(chǎn)生不錯的結(jié)果,聚集模型就是各預(yù)測結(jié)果的簡單加權(quán)線性模型。這個過程可以在多個層面上重復(fù)進行。
上面這些工作的期待結(jié)果是:你應(yīng)該可以得到一個或多個性能良好的模型的組裝結(jié)果,比任何單一模型的結(jié)果都好。
下一步:可以把一個或多個組裝***定下來,進行預(yù)測,投入產(chǎn)品中。
結(jié)語
本備忘單密集打包了各種改善性能的想法。如果你覺得這里提到的要點太多,你不必樣樣都做。提升性能,你只需要一個好的想法。你可以依照下序的建議試試:
1、選擇一個組
• 數(shù)據(jù)
• 算法
• 調(diào)參
• 組裝
2、從組中選擇一個方法
3、從選擇的方法中挑一個去試
4、比較結(jié)果,如果有改進則留下
5、重復(fù)上述過程




























