1. 程式人生 > >機器不學習:一種提升預測能力的方法-機器學習模型

機器不學習:一種提升預測能力的方法-機器學習模型

範圍 和集 最重要的 機器 免費 現實 良好的 例子 永恒

機器不學習 jqbxx.com -機器學習好網站

沒有哪個機器學習模型可以常勝,如何找到當前問題的最優解是一個永恒的問題。

幸運的是,結合/融合/整合 (integration/ combination/ fusion)多個機器學習模型往往可以提高整體的預測能力。這是一種非常有效的提升手段,在多分類器系統(multi-classifier system)和集成學習(ensemble learning)中,融合都是最重要的一個步驟。

一般來說,模型融合或多或少都能提高的最終的預測能力,且一般不會比最優子模型差。舉個實用的例子,Kaggle比賽中常用的stacking方法就是模型融合,通過結合多個各有所長的子學習器,我們實現了更好的預測結果。基本的理論假設是:不同的子模型在不同的數據上有不同的表達能力,我們可以結合他們擅長的部分,得到一個在各個方面都很“準確”的模型。當然,最基本的假設是子模型的誤差是互相獨立的,這個一般是不現實的。但即使子模型間的誤差有相關性,適當的結合方法依然可以各取其長,從而達到提升效果。

我們今天介紹幾種簡單、有效的模型結合方法。

1. 案例分析

讓我們給出一個簡單的分析。假設我們有天氣數據X和對應的標簽y,現在希望實現一個可以預測明天天氣的模型$ 。但我們並不知道用什麽算法效果最好,於是嘗試了十種算法,包括

  • 算法1: 邏輯回歸 - C1

  • 算法2:支持向量機(SVM)- C2

  • ...
  • 算法10:隨機森林 - C10

結果發現他們表現都一般,在驗證集上的誤分率比較高。我們現在期待找到一種方法,可以有效提高最終預測結果。

2. 平均法/投票法

一種比較直白的方法就是對讓10個算法模型同時對需要預測的數據進行預測,並對結果取平均數/眾數。假設10個分類器對於測試數據Xt的預測結果是[C1(Xt),C2(Xt),C3(Xt).....,C10(Xt)]=[0,1,1,1,1,1,1,0,1,1,0] ,那很顯然少數服從多數,我們應該選擇1作為Xt的預測結果。如果取平均值的話也可以那麽會得到0.7,高於閾值0.5,因此是等價的。

但這個時候需要有幾個註意的地方:

首先,不同分類器的輸出結果取值範圍不同,不一定是[0,1],而可以是無限定範圍的值。舉例,邏輯回歸的輸出範圍是0-1(概率),而k-近鄰的輸出結果可以是大於0的任意實數,其他算法的輸出範圍可能是負數。因此整合多個分類器時,需要註意不同分類器的輸出範圍,並統一這個取值範圍。

  • 比如可以先轉化為如二分類結果,把輸出的範圍統一後再進行整合。但這種方法的問題在於我們丟失了很多信息,0.5和0.99都會被轉化為1,但明顯其可靠程度差別很大。

  • 也可以轉化為排序(ranking),再對不同的ranking進行求平均。

  • 更加穩妥的方法是對每個分類器的輸出結果做標準化,也就是調整到正態分布上去。之後就可以對多個調整後的結果進行整合。同理,用歸一化也可以有類似的效果。

其次,就是整合穩定性的問題。采用平均法的另一個風險在於可能被極值所影響。正態分布的取值是 [-無窮,+無窮] ,在少數情況下平均值會受到少數極值的影響。一個常見的解決方法是,用中位數(median)來代替平均數進行整合。

同時,模型整合面臨的另一個問題是子模型良莠不齊。如果10個模型中有1個表現非常差,那麽會拖累最終的效果,適得其反。因此,簡單、粗暴的把所有子模型通過平均法整合起來效果往往一般。

3. 尋找優秀的子模型

不難看出,一個較差的子模型會拖累整體的集成表現,那麽這就涉及到另一個問題?什麽樣的子模型是優秀的。

一般來說,我們希望子模型:準而不同 -> accurate but diversified。好的子模型應該首先是準確的,這樣才會有所幫助。其次不同子模型間應該有差別,比如獨立的誤差,這樣作為一個整體才能起到互補作用。

因此,如果想實現良好的結合效果,就必須對子模型進行篩選,去粗取精。在這裏我們需要做出一點解釋,我們今天說的融合方法和bagging還有boosting中的思路不大相同。bagging和boosting中的子模型都是很簡單的且基數龐大,而我們今天的模型融合是結合少量但較為復雜的模型。

4. 篩選方法:賦予不同子模型不同的權重

因此我們不能再簡單的取平均了,而應該給優秀的子模型更大的權重。在這種前提下,一個比較直白的方法就是根據子模型的準確率給出一個參考權重 w,子模型越準確那麽它的權重就更大,對於最終預測的影響就更強: wi=Acc(Ci)/sum(Acc(Cj)) 。簡單取平均是這個方法的一個特例,即假設子模型準確率一致。

5. 更進一步:學習分類器權重

在4中提到的方法在一定程度上可以緩解問題,但效果有限。那麽另一個思路是,我們是否可以學習每個分類器的權重呢?

答案是肯定,這也就是Stacking的核心思路。通過增加一層來學習子模型的權重。

技術分享圖片

圖片來源:https://www.quora.com/What-is-stacking-in-machine-learning

更多有關於stacking的討論可以參考我最近的文章:「Stacking」與「神經網絡」。簡單來說,就是加一層邏輯回歸或者SVM,把子模型的輸出結果當做訓練數據,來自動賦予不同子模型不同的權重。

一般來看,這種方法只要使用得當,效果應該比簡單取平均值、或者根據準確度計算權重的效果會更好。

6. 再進一步:挖掘局部關系

上面提到的方法,都有一個不可避免的問題,那就是對於問題處理是全局的(global)。一個分類器不一定在每個局部上表現都好,而我們賦予的全局權重會無差別的認為:”一個子模型在全局的表現上一致“,這是不現實的。

因此,另一個非常有效的融合方法就是:動態分類器選擇(Dynamic Classifier Selection),簡稱DCS。DCS的思路是,當我們遇到一個新的數據需要去預測時,我們首先找到訓練數據中和新數據臨近的k個數據,一般這個搜尋可以通過k-近鄰來實現。找到以後,我們只需要找到在k個相鄰的訓練數據構成的局部空間上,選擇表現最好的分類器。它可能是邏輯回歸,也可能是SVM,但思路是找到最好的那一個即可。

這種做法的最大優點是考慮到了不同分類器在不同局部的表現能力可能有差異,不該默認分類器的全局表現一樣。在這個基礎上,研究人員還提出 動態集成選擇(Dynamic Ensemble Selection),DES的區別在於目標是找到局部上表現較好的幾個子模型來共同預測,可以理解為集成上的集成。

當然,天下沒有免費的午餐,使用DCS和DES的最大弊端就是運算開銷。與簡單的平均相比,這種繁復的方法有很高的時間復雜度。

7. 總結

模型融合的重要意義在於:我們可以在有限的數據上提高最終的預測能力。雖然我們身處深度學習的時代,但很多問題並不具備深度學習所需要的數據量。在這種情況下,良好的挖掘特征,結合不同的子模型的長處,就是一種人工的表示學習。

機器不學習:一種提升預測能力的方法-機器學習模型