天天看點

機器學習性能改善備忘單:32個幫你做出更好預測模型的技巧和竅門

機器學習性能改善備忘單:32個幫你做出更好預測模型的技巧和竅門

機器學習最有價值(實際應用最廣)的部分是預測性模組化。也就是在曆史資料上進行訓練,在新資料上做出預測。 

而預測性模組化的首要問題是:

如何才能得到更好的結果?

這個備忘單基于本人多年的實踐,以及我對頂級機器學習專家和大賽優勝者的研究。

有了這份指南,你不但不會再掉進坑裡,而且會提升性能,甚至在你自己的一些預測難題中取得世界領先水準的結果。

讓我們一起來看看吧!

注意:本文的結構基于早些時候另一篇關于改善深度學習性能的指南——《如何改善深度學習性能》

機器學習性能改善備忘單:32個幫你做出更好預測模型的技巧和竅門

◆ ◆ ◆

概述

本備忘單的目的是為你提供一些提升機器學習性能的想法。要獲得突破,你所需要的可能就是其中的一個。找到你要的那個,然後回來,再找下一個再提升。

我把這份清單分為4個子主題:

基于資料改善性能

借助算法改善性能

用算法調參改善性能

借助模型融合改善性能

清單越往下,你獲得的增益可能越小。比如,對問題場景重新設立架構或者更多的資料通常比對最好的算法進行調參得到收益要多。 

不總是這樣,但通常如此。

1.基于資料改善性能

改變你的訓練集資料以及問題定義方式,你能夠得到很大提升,也許是最大的提升。

政策:從新的、不同的角度透視你的資料,以便将潛藏的問題結構充分暴露給算法。

獲得更多的資料:你能夠拿到更多或者更高品質的資料麼?對現代非線性機器學習模型如深度學習而言,資料越多,改進越多。

創造更多資料:如果你不能拿到更多資料,那麼,你能創造出新的資料麼?也許你可以填充或者重新排列現有資料,或者利用機率模型來産生新的資料。

清潔你的資料。你能否改善資料中的信号?也許可以糾正或删除一些缺失或錯誤的觀測值,或者在合理範圍外的離群點,進而提升資料品質。

資料重新取樣。你能否對資料重新取樣,以改變其大小或者分布?也許你可以用一個小得多的資料來實驗,以提高實驗的速度;或對某個特殊類型的觀察值進行過采樣/欠采樣以使得它們更好地代表整個資料集。

重新界定問題:你能否改變你正試圖解決的問題類型?重構資料,如回歸,二項或多項分類,時間序列,異常檢測,評分,推薦等問題類型。

重新縮放資料。你能否對數值型變量進行縮放處理?輸入資料的歸一化和标準化處理可以提升使用權重或距離度量的算法性能。

轉化資料。你能否改變資料的分布形态?使得資料更服從高斯分布,或進行指數變換可能會暴露出資料更多的特征供算法學習。

資料投影(映射):你能否将資料投影到一個更低維的空間?你可以用無監督的聚類或投影方法,創造一個新的壓縮資料集代表。

特征選擇。所有的輸入變量是否同等重要?使用特征選擇和衡量特征重要性的方法,可以創造出資料的新視角,供模型算法探索。

特征工程。 你能夠創造或者增加新的特征?也許有的屬性可以分解為多個新的值(比如類别,日期或字元串)或者屬性可以聚集起來代表一個事件(如一個計數,二進制标志或統計資訊)

上面這些工作的期待結果是:你應該得到資料集的一批新視角和新版本。

下一步:你可以用預測性模型算法評估它們每一個的價值。

2.借助算法改善性能

機器學習無外乎算法。 

調整的政策:找出那些性能高于基線水準,比平均水準要好的算法和資料呈現方式。對結果保持懷疑态度,設計實驗,使得它很難愚弄你。

重采樣方法。要用什麼樣的重采樣方法來估計其在新資料上的能力?使用一種能夠最好地利用現有資料的方法和參數設定。k折交叉驗證法,利用其中的一折作為驗證集可能是最佳操作。

評價名額。用什麼樣的名額來評價預測能力?選擇能夠最好地展現問題和專業需求的名額。不要任何問題一上來就看分類準确率。

基線性能。比較算法時,什麼是基線性能?通過随機算法或零規則算法(預測均值或衆數)來建立一個基線,并以此對所有算法進行排序。

抽檢線性算法。什麼樣的線性算法能有好結果?線性方法通常更容易産生偏倚,也易于了解,能快速訓練。如果能達到好效果,則更容易被選中。評估多個不同的線性方法。

抽檢非線性算法。哪些非線性算法能有好結果?非線性算法通常要求更多資料,有更高的複雜性,但是能獲得更好的性能。評估多個不同的非線性方法。

從文獻中偷師學藝。哪些文獻報導的方法能很好地解決你的問題?也許你能從算法類型或傳統方法的延伸中擷取解決自己問題的靈感。

标準參數設定。評估算法時,什麼是标準的參數設定?每一個算法都有機會解決你的問題,這不是說在現有基礎上死磕調參,而是說,每一種算法都需要把參數調好,才能在算法“大賽”中有勝出的機會。

上面這些工作的期待結果是:你應該會得到性能良好的候選算法和資料呈現候選方法清單(不太長的有限個方法)。

下一步:通過算法調參改善性能

3.用算法調參改善性能

算法調參可能是你花時間最多的地方。它可能非常耗時間,從算法抽檢中很快能挖掘出一兩個性能不錯的算法,而把這一兩個算法的潛力充分挖掘出來可能需要好幾天,幾周甚至幾個月的時間。

調整的政策:充分挖掘性能良好的算法的潛力。

機器學習性能改善備忘單:32個幫你做出更好預測模型的技巧和竅門

診斷。對算法要做哪些診斷和回顧?也許可以回顧一下學習曲線,了解目前模型的狀态是過拟合還是欠拟合,然後糾正它。不同的算法可能提供不同的可視化結果和診斷。檢視算法得到正确預測結果和錯誤預測結果的樣本。

試試直覺。你的直覺是什麼?如果你琢磨參數的時間足夠長,而回報回路又很短,那麼你會得到怎麼調參的直覺。試一試,看看你遇到更大的難題時能不能再得到新的參數設定靈感。

學習文獻。文獻中用到了哪些參數,範圍是多少?評估标準參數性能是調參的良好開端。

随機搜尋。哪些參數可以用随機搜尋?也許你可使用算法超參數的随機搜尋,來發現那些你永遠也想不到的參數設定。

網格搜尋。哪些參數可以使用網格搜尋?也許有一些标準超參數網格值,你可以拿來指派,進而發現好的參數設定,重複這一過程,不斷精調網格。

最優化。那些參數可以優化?也許有一些參數,如結構或者學習率,可以用直接搜尋程式(如模式搜尋)或随機優化(如遺傳算法)來調整。

交替實施。算法有哪些其他的實施?也許其中的一個交替實施方法可以在同樣的資料上得到更好的結果。每個算法都有無數的微決定由算法的使用者做出,其中的一些可能會影響到問題的解決。

算法延伸。哪些是常見的算法延伸?也許你可以通過評估常見的或标準的算法延伸而提高性能。這可能需要一些實施工作。

算法定制。對你的個案而言,需要做哪些算法定制?也許你可以為你的資料修飾算法,從損失函數,内部優化方法到算法的具體決定。

聯系專家。對你的個案,專家們有什麼算法推薦?給一個或多個算法領域的學術界專家寫封簡單的郵件,概述你的預測問題,以及你已經做出的嘗試。這可能會讓你獲悉前沿工作,或者學術界不為你所知的新想法。

上面這些工作的期待結果是:你應該可以得到一個很短的清單,上面是經過精調的算法。也許甚至隻剩下一個。

下一步:到這一步,對剩下的一個或多個模型進行最後的收尾,做出預測或者投放到産品中。更進一步的性能提升可以通過多個模型的融合來達到。

4. 借助模型融合改善性能

你可以組合多個模型的預測。在算法調參之後,這是下一個大的改善空間。實際上,組合多個“夠用”的模型,而不是多個精調(同時也非常脆弱,可能嚴重overfitting)的模型通常可以達到很好的性能提升。

政策:組合多個性能良好的模型預測結果。

混合模型預測結果。 你是否可以直接組合多個模型的預測結果?也許你可以使用同樣的或不同的算法來搭建多個模型。對各自的預測結果取均值,或者衆數。

混合資料呈現方式。你是否可以組合用不同資料呈現方法得到的模型預測結果?也許你使用了不同的問題投射方法,來訓練性能良好的的算法,那麼這些預測結果可以組合起來。

混合資料樣本。你是否可以組合不同資料角度(特征)訓練的模型?也許你可以創造訓練樣本的多個子樣本來訓練一個性能良好的算法,然後把結果組合起來。這叫做自助聚集(bootstrap aggregation)或者bagging,當各個模型的預測都很高明而方法各異(不相關)時,效果最好。

糾正預測。你是否可以糾正性能良好模型的預測?也許你可以明确地糾正預測結果,或者通過像boosting這樣的方法來學習如何糾正預測錯誤。

學習組合。你能否使用新的模型,學習如何将多個性能良好的預測結果以最佳方式組合起來?這叫做堆棧(stacked generalization or stacking),當各子模型都很高明而方法各異時,通常能産生不錯的結果,聚集模型就是各預測結果的簡單權重線性模型。這個過程可以在多個層面上重複進行。

上面這些工作的期待結果是:你應該可以得到一個或多個性能良好的模型的組裝結果,比任何單一模型的結果都好。

下一步:可以把一個或多個組裝最後定下來,進行預測,投入産品中。

結語

本備忘單密集打包了各種改善性能的想法。如果你覺得這裡提到的要點太多,你不必樣樣都做。提升性能,你隻需要一個好的想法。你可以依照下序的建議試試:

選擇一個組 

資料

算法

調參

組裝

從組中選擇一個方法

從選擇的方法中挑一個去試

比較結果,如果有改進則留下

重複上述過程

原文釋出時間為:2016-12-05

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀