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