機器學習篇-評估機器學習的模型
原文地址:
https://www.oreilly.com.cn/ideas/wp-content/uploads/2016/03/evaluating-machine-learning-models-all.pdf評估指標
評價指標是機器學習任務中非常重要的一環。不同的機器學習任務, 如分類(classification)、回歸(regression)、排序(ranking)、聚類(clustering)、主題模型(topic modeling),有著不同的評價指標。而有些指標可以對多種不同的機器學習模型進行評價,如精確率-召回率(precision-recall),可以用在分類、推薦、排序等任務中。機器學習應用的很大一類是監督式機器學習,像分類、回歸、排序。因此本報告的重點是介紹監督式機器學習的一些評價指標。
分類的評估指標
分類是指對給定的數據項預測該數據所屬的類別。在二元分類中,結果包括兩個類別。在多元分類中,結果是兩個以上的類別。這裡我將主要關注二元分類,但是所有的評估參數都可以被用於多元分類。
二元分類的一個例子便是垃圾郵件檢測。分類器的輸入可以包括郵件的文字內容以及元數據(比如發件人、發送時間等),而輸出則是一個標籤,表明郵件是「垃圾」還是「正常」,如圖2-1所示。有時也用一些更一般的名稱來定義這兩個類,如「負"(negative)與「正」
(positive),或者「類1」和「類0」。
評估分類的好壞有很多指標。準確率、混淆矩陣、ROC曲線下面積是最常用的指標。
準確率(Accuracy)
準確率是計算分類器做出正確分類的頻度。它是指在分類中,使用測試集對模型進行分類,分類正確的記錄個數佔總記錄個數的比例。
準確率=正確分類的個數/總記錄的個數
混淆矩陣(Confusion Matrix)
準確率看起來非常簡單。然而,準確率沒有對不同類別進行區分,即其平等對待每個類別的正確結果。但是這種評價有時是不夠的,比如有時要看類別0與類別1下分類錯誤的各自個數。因為不同類別下分類錯誤的代價不同,或者某一個類別下的樣本遠多於另外一個類別。例如在疾病診斷中,醫生診斷成患有癌症而實際上卻未患癌症(即假正,False Positive),與診斷成未患有癌症而實際上卻患有癌症(假負,False Negative)的這兩種情況的結果會截然不同。混淆矩陣(或叫混淆表) 是對分類的結果進行詳細描述的一個表。列出了每一個類別下面分類結果正確和錯誤的數值。矩陣的行對應著真正的分類事實。矩陣的列裡面對應的是分類器分的結果。
平均類準確率(Per-class Accuracy)
準確率的一個變形是平均類準確率,即計算每個類別下的準確率,然後再計算它們的平均值。準確率是宏觀平均,而平均類準確率則是一個微觀的平均。在上述的例子里,平均準確率為(80%+97.5%)/2=88.75%。這和準確率值(91.7%)的區別還是很大的。
通常情況下,當每個類別下類別的樣本個數不一樣,則平均準確率不等於準確率(有興趣的讀者可以自己證明一下)。為什麼這點會重要?當某一個類別下的樣本遠多於另外的類別,準確率會給出一個扭曲的結論,因為 數量多的那個類的結果會很強地影響準確率。這種情況下, 就應該檢查一下每一類別的準確率和平均類準確率。
平均準確率也有自己的缺點,比如,如果某個類別的樣本個數很少,那麼可能造成該類的準確率的方差過大,意味著該類的準確率可靠性比其他類要差。使用平均類準確率就會遮蓋了這個類的問題。
對數損失函數(Log-loss)
對數損失函數(Log-loss,或者全拼是Logarithmic loss)能對分類器的表現進行更細微的觀察。尤其是如果分類輸出輸出不再是0或1,而是數值,即屬於每個類別的概率,那麼可以使用Log-loss對分類結果進行評價。這個概率可以理解為某樣本對所屬的的類別的置信度。
對數損失函數的美妙之處在於它和資訊理論緊密的關聯。對數損失函數就是真實分類分布和分類器預測分布的交叉熵。它和相對熵,或者叫Kullback-Leibler散度,非常的相關。熵度量事物的不確定性。交叉熵結合了真實分類分布的熵,再加上當預測假定了一個不同的分布後帶來的不確定性。所以對數損失函數是基於資訊理論對「額外雜訊」的衡量,這個雜訊是由於預測分類和真實分類不一致所產生的。通過最小化交叉熵,我們就可以最大化分類準確性。
AUC
AUC的全拼是Area under the Curve,即曲線下的面積。這裡的曲線是指ROC曲線(Receiver Operating Characteristic Curve)。
ROC曲線不是一個數,它是一整條線。它能展現出分類器行為的細微變化,但同時也很難快速地比較出不同ROC曲線的好壞。在實際項目中,如果使用某些自動超參數調優的方法(第四章中會詳細介紹)產生了不同的結果,那麼就需要一個量化的指標來比較結果,而不是依賴於人工來看所產生的不同的ROC曲線。AUC就是其中一個量化ROC曲線的方法,它把ROC曲線轉換成曲線下的面積這一數字,從而方便了自動比對。一個好的ROC曲線下面積應該很大(這樣真正率會很快趨近於100%),而不好的ROC曲線下面積就比較小。因此AUC越大越好。
排序的評估指標
下面我們來看看排序的評估指標。但是在繼續前,我們還是要再看一看分類的指標。因為排序所用的最主要的評估指標之一,精確度-召回率,也是非常流行的分類評估指標。
排序有些類似於分類。以互聯網搜索為例,搜索引擎充當了排序器。用戶輸入一個(或多個)查詢關鍵詞,搜索引擎返回一系列它認為和用戶的查詢關鍵詞相關連的網頁,同時按照相關關係對這些網頁進行排序。概念上來說,可以認為搜索引擎的第一步就是一個二元分類(與查詢相關或者不相關),然後才是排序的過程來把最相關的放到列表的開始。在實際實現的時候,搜索引擎就不是簡單的分類,而是給出一個數值型的相關度評分,然後再按照這個數字來進行排序(簡單的情況下)。
另外一個排序問題的例子就是個性化推薦。推薦器或者是一個排序器,也可能是一個評分預測器。第一種情況下,輸出就是對應於每個用戶的一個排序過的推薦物品項的列表;而第二種情況下,推薦器需要返回一個用戶—物品項的對應,每一對應都有一個預測的評分。這樣就變成了一個回歸的模型,後面會詳細討論。
精確率—召回率(Precision-Recall)
精確率—召回率其實是兩個評價指標。但是它們一般都是同時使用。精確率回答這樣的問題:「在排序器或者分類器給出的相關的返回集里,到底有多少是真正的相關項?」。而召回率則是回答「在所有真正相關的項里,排序器或者分類器找到了多少個?」
精確率和召回率的數學定義是:
精確率=回答正確的結果數/排序器返回集的總結果數召回率=回答正確的結果數/相關的項目總數
常見的情況是,我們只看排序器返回的那K個最前面的項,如K=5,
10,20,100等。精確率和召回率則會表示成精確率@k和召回率@k。
對於推薦的場景,則輸入的查詢關鍵詞有多個,每個用戶對應於所有的推薦項目就是一個關鍵詞。對於每個用戶,我們都可以給出一個精確率和召回率的平均,即平均精確率@k和平均召回率@k(這一點和準確率與平均類準確率的關係有些類似)
精確率—召回率曲線和F1值
改變排序器返回的答案的個數,即k值,相應的精確率—召回率也會發生改變。如果畫一張圖,精確率和召回率分別是x和y軸,而數值點是不同k的時候的精確率和召回率,則我們就得到了一條精確率—召回率曲線。這個曲線和ROC曲線是相關聯的(有興趣的讀者可以自己研究一下,精確率和假正率的關係是什麼?和召回率的關係是什麼?)
如ROC曲線一下,比較不同的精確率—召回率曲線也是很困難的。因此也需要一個數字的度量來表徵精確率—召回率曲線中某個固定值, F1值就是其中之一。F1值是精確率和召回率的調和平均值。
F1=2×(精確率×召回率)/(精確率+召回率)
與算術平均值不同,調和平均值受兩個變數里小的那個影響更大。因此精確率或召回率中的某一個比較小,則F1值也會小。
歸一化折損累積增益(NDCG)
在精確率與召回率中,返回集中每個項目的地位(權值)是一樣,即位置k處的項目與位置1處的項目地位一樣。但用戶對返回結果的理解卻不是這樣。對於搜索引擎給出的排序結果,最前面的答案會遠比排在後面的答案重要。
歸一化折損累積增益(NDCG,Normalized Discounted Cumulative G a i n) 便考慮了這種情況。N D C C包含了3 個遞進的指標: 累積增益(CG,Cumulative Gain),折損累積增益(DCG,Discounted Cumulative Gain),進而得到歸一化折損累積增益。CG是對排序返回的最前面k個項目的相關性得分求和,而DCG在每個項目的得分乘上一個權值,該權值與位置成反關係,即位置越靠前,權值越大。NDCG則對每項的帶權值得分先進行歸一化(把每個項目的得分除以最好的那個項目的得分),這樣得分總是落在0.0和1.0之間。維基百科上的相關文章有更詳細的數學公式。
DCG或NDCG在信息檢索中或者那些對項目的返回位置關心的模型方法找中用的比較多。
回歸的評估指標
回歸模型的輸出不是分類的標籤,而是一個連續型的數值。例如使用某公司的歷史股票價格和市場的一些信息來預測未來的股票價格,這就是一個回歸模型的任務。另外一個例子就是在個性化推薦中,對於某個用戶對某個項目,給出具體的評分值(因此推薦器可以相應的對排序進行優化)。
平方根誤差(RMSE)
最常用的回歸評估指標就是平方根誤差(RMSE,Root Mean Square Error,也叫RMSD,Root Mean Square Deviation)。它計算所有的預測值和真實值偏差的平方之和的均值,再求平方根。
平均絕對百分比誤差(MAPE)
對每個預測值如下計算 MAPE:
- 預測值與歷史實際值進行比較。
- 該差計算為實際值的百分比。即誤差。
- 取該誤差的絕對值,使負值取正。
區間範圍的 MAPE(平均絕對百分比誤差)是觀測到的所有值的 MAPE 的均值,是模型的質量指標。MAPE 為零表示完美模型,MAPE 大於 1 則表示劣質模型。例如,MAPE 為 0.12 表示預測誤差為 12%。即平均來算,88% 的預測值可以由模型解釋。
「幾乎正確」的預測
可能最容易理解的指標就是預測值與真實值的誤差小於X%的比例,這裡X的大小可以根據實際問題來決定。比如計算和真實值之差小於10% 的數據比例,就可以先找出|(yi- i)/yi)|<0.1的樣本的數量,然後求它們在總體中的百分比即可。這個指標給出了回歸模型預測精度的一個定義。
注意:訓練指標和評估指標的區別
有時,模型訓練的過程所使用的評估指標(也叫做損失函數)和真正評估時使用的指標不一樣。這可能會發生在我們把一個設計用來做A事情的模型去解決B問題時。例如,對於個性化推薦器,我們可能是通過最小化預測值與真實值的比率來訓練的,但卻被用來生成推薦的排序列表。這就不是一個最優的結果,讓模型去做它不擅長的事情。盡量避免這種情況!最好是用評估的指標來訓練和優化模型。不過有些特定的評估指標則不容易這樣做(如直接優化AUC就非常困難)。建議總是去找恰當的評估指標,並直接用於模型的訓練和優化。
注意:偏態的數據集—類別不均衡、異常值和罕見值
寫下評估指標的公式很容易,但是如何去解釋指標在實際數據里的意義就不容易了。紙上得來終覺淺,絕知此事要躬行!
需要時刻謹記的是數據的分布是什麼樣的,以及這會對評估指標產生什麼樣的影響,尤其是要檢查數據的偏態的情況。這裡所說的偏態是指的一種類別的數據遠少於其他的類別,或者存在過多的異常值,而這些異常值會大幅度地改變評估指標的值。
前文里,我們已經看到了類別不均衡所造成的一個坑,它會影響每類準確率。這是數據偏態的一個例子,即某個分類的樣本相對於其他分類而言太少了。這不僅僅對每類準確率有影響,對於所有的把數據樣本同等對待的評估而言,這種數據偏態都會有影響。例如正類樣本的數量僅佔總樣本的很少一點,比如1%,這在實際數據中也很常見,比如網頁廣告的點擊率、推薦器所用的用戶—項目交互訓練數據、惡意軟體檢測等。這時,一個相當「傻」的基準分類器通過把所有的數據都標為「負」就能獲得高達99%的準確率。而一個好的分類器的準確率應當遠遠高於99%。類似的,對於ROC曲線而言,真正重要的區域其實是曲線上的左上角。因此為了打敗這個基準分類器,AUC值就必須非常的高才行。圖2-4表明了這個坑。
任何給予每個類別里的樣本同樣權重的評估指標在處理類別不均衡的時候都會有問題。因為根據他們的定義,這些指標都會偏向於那些佔據大多數的類別。同時,不僅在評估階段會有問題,甚至模型本身的訓練也會有問題。如果沒有很好的處理類別不均衡,那麼訓練出來的分類器可能根本就不知道如何來預測那些罕見的類別。
數據的偏態對個性化推薦器也有影響。真實的用戶—項目交互數據一般都是有很多用戶,他們很少會對項目來打分。同時很多項目也基本沒有被評分過。稀缺的(打過分的)用戶和(有評分的)項目給推薦器帶來了問題,包括模型訓練和評估。當訓練數據沒有足夠的有效樣本,推薦器就無法學慣用戶的偏好,或者與罕見項目類似的項目。評估數據中缺乏有效的用戶和項目樣本則會對推薦器的性能評分很低,這樣又進一步導致無法獲得高質量的推薦器。
異常值是另外一類數據偏態。異常的大值會對回歸模型造成很大的影響。例如,在百萬首歌數據集(Million Song Dataset)中,用戶對一首歌曲的評分為該用戶聽這首歌曲的次數。而最高的評分竟達到了
16000。如果回歸模型對這一數據點的預測值出了問題,那麼由這一個點所產生的誤差就會幾乎超過所有其他點產生的誤差的總和。我們可以使用誤差的中位數來減少這個異常點所帶來的影響,從而增加魯棒性。但是還是不能根本解決模型訓練階段的這個問題。有效的解決方案是對數據進行清洗,或者重新定義問題,從而使模型對於異常值不再敏感。
離線評估的方法:
保留部分數據做驗證、交叉驗證和自助法
上文討論了各種評估指標,在開始本章之前,讓我們再回顧一下圖1-1 里所展示的機器學習的工作流程。我們依然是在原型產生階段。這一階段我們調整很多的東西,包括特徵、模型的類別、訓練方法等。首先我們先看一下模型的選擇。
原型產生階段:模型訓練、驗證和模型選擇
我們每調整一些東西,就產生了一個新的模型。模型選擇是指從多個備選模型中找到一個合適的模型去擬合數據。而這個過程基於驗證的結果
(不是訓練的結果)來完成的。圖3-1展示了這個過程的一個簡化版。
在圖3-1里,超參數調優被解釋成了一個控制訓練過程的「元」過程。我們會在第四章里詳細解釋它的工作機制。這裡需要記住的是,手頭的歷史數據集被分成了兩個部分:訓練數據和驗證數據。模型驗證的結果被反饋給了超參數調優器,來幫助後者進一步調整參數來訓練模型。
這裡的問題是:為什麼需要分兩個不同的數據集來評估模型?
在統計模型的領域裡,所有的事情都被假定為平穩的,即它們是服從隨機分布的。從隨機的數據集學習出來的模型也被認為是隨機的。並且這個學習的模型需要被一個隨機的已觀察到的數據集進行測試評估,因此測試結果也是隨機的。為了確保公平性,需要使用一個與訓練數據不同的數據集對模型進行驗證,從而可以得到模型的泛化誤差(即模型對新數據的泛化能力如何)。
在離線階段,我們只有一套歷史數據集合。那麼如何去獲得另一個獨立的數據集呢?因此就需要一種機制去產生另一套數據集。我們可以保留一部分數據來作為驗證集,或者使用重採樣技術,如交叉驗證和自助法。
保留部分數據做驗證
保留部分數據做驗證相對簡單。假定所有數據樣本都是互相獨立和均勻分布的,我們只要簡單地隨機抽取一小部分數據做為驗證數據即可。用其餘大部分數據來訓練模型,再用這個保留的小數據集來評估驗證指標。
從計算角度來看,保留部分數據做驗證編程實現起來簡單,運行速度也快。它的缺點是缺乏統計特性。驗證的結果是基於一個小的驗證集,所以驗證模型的泛化能力的可靠性較低。同時對於單個驗證集,就沒法計算出方差信息和置信區間。
如果已有數據集大到可以保留足夠多的數據來確保可靠性的時候,就使用保留部分數據做驗證的方法。
交叉驗證
交叉驗證是另外一種驗證技術。它並不是唯一的驗證技術,也不是超參數調優。所以小心別把這三個概念(模型驗證、交叉驗證和超參數調優)弄混淆了。交叉驗證其實是產生訓練數據集和驗證數據集的方法。產生的數據可以為超參數調優所使用。同樣,保留部分數據做驗證和其他的驗證技術也可以產生數據為超參數調優所用,同時計算角度來說更加便宜。
交叉驗證方法有很多的變形。最常見的是k折交叉驗證。它的過程是, 先將數據集劃分成k個數據集(如圖3-2所示)。對於每一種超參數, 依次使用其中的k-1個數據集來訓練數據,並用保留的驗證集來驗證模型。模型的總體表現取所有k次驗證的平均值。對於所有的超參數,重複這一過程。然後選者均值表現最好的那個超參數集來配置模型。
另外一種交叉驗證的變形是留一個樣本交叉驗證(leave-one-out cross validation)。本質上這和k折交叉驗證是一樣的,即k就是數據集里的樣本總數。
當數據集太小,以至於不能保留足夠的數據做驗證時,交叉驗證就很有用了。
自助法(Bootstrap)和Jackknife方法
自助法是一種重採樣技術,它通過對原有數據集進行重新採樣來獲得多個「新的」數據集。每個這樣的新集可以用來估計參數。因為有多個數
據集,所以就可以得到多個估計,由此就可以得到估計的方差和置信區間。
自助法和交叉驗證緊密相關。它的靈感是來自於另外一種重採樣技術—Jackknife。Jackknife本質上和留一個樣本交叉驗證一樣,即他們把數據分成k個數據集的動作是一個無放回重採樣的過程。一旦某個數據樣本被放到某個數據集,它就不能再被其他數據集所選擇。
與之相反,自助法是有放回的重採樣。給定數據集包含N個樣本點,自助法隨機地選取一個樣本放入新的集合(bootstrapped dataset),然後把樣本在放回去,再重複同樣的採樣過程。
為什麼要把樣本放回去?每一個樣本都可以用一個真實的分布進行描述,但是這個真實的分布我們並不知道。我們只有一個數據集去代表該分布,即經驗分布。自助法假設新的樣本都是從該經驗分布中得到的,即新的數據集應該服從這個經驗分布。如果每次採樣後不進行放回,那麼這個經驗分布會一直改變。因此需要樣本放回去以保證經驗分布不變。
很明顯,用自助法產生的新數據集中,可能存在重複的數據點,並且可能會重複多次(如圖3-2所示)。如果對包含N個樣本的數據集隨機重採樣次,新產生的數據集里,唯一的樣本點的比例是1-1/e≈63.2%。換一種說法就是,大約有2/3的樣本會在新的數據集里,同時還有一些重複的樣本。
使用自助法數據集來做驗證的一種方法是使用其中的唯一的樣本數據集來訓練模型,用其餘的樣本來驗證模型。這樣效果和交叉驗證的效果很類似。
注意:模型驗證和測試的區別
到目前為止,我一直小心地不去使用「測試」這個詞。這是因為模型驗 證和模型測試是兩個不同的步驟。讓我花點時間解釋一下這裡的微妙區別。
原型產生階段主要解決的是模型選擇。這就要求對一個或多個備選模型用驗證數據進行性能評估。當我們找到了一個滿意的模型類型和超參數組合,原型產生階段的最後一步是用整個已有的數據集(包括前面對模
型進行驗證的驗證集),按照滿意的模型類型和最優的超參數組合,重新訓練一個模型。這個最終的模型將會被部署到生產系統上去。
測試則是發生在原型產生階段之後,或者是在生產系統上在行測試,或者是在檢測分布漂移的離線環境里測試。
永遠不要混淆了訓練數據和評估數據。訓練、驗證和測試應該使用不同的數據集。如果驗證或測試數據與訓練數據有重疊,就會導致模型的泛化能力變差,會讓你追悔莫及。
在不久之前的Image Net競賽中曾傳出了欺詐醜聞。一個參賽隊伍通過大量的向測試過程發送模型來獲得提升結果。本質上說,他們是在用不斷地調優超參數來擬合測試數據。擬合特定的測試數據而獲得的模型也許能幫你贏得一次競賽,卻無法產生真正的好的機器學習的模型或者帶來科技進步。
總結
回顧總結一下離線評估和模型驗證的重點:
- 模型產生階段里,我們需要選擇模型。這既包括超參數調優也包括訓練模型。每個新的模型都必須通過它在獨立的數據集上的表現來評估,這叫做模型驗證。
- 交叉驗證不同於超參數調優。交叉驗證是一種生成訓練數據集與驗證數據集的機制。而超參數調優則是選擇適合一個模型的最好的超參數的機制。它可以使用交叉驗證來評估模型。
- 保留部分數據做驗證是交叉驗證的一個備選項。它使用簡單,計算量也小。因此我建議只要數據足夠,就是用保留部分數據做驗證。
- 交叉驗證對小數據集特別有用。
- 自助法是一種重採樣技術。它和k折交叉驗證的重採樣技術很類似。兩種方法都不僅可以評估模型的質量,還能夠給出評估的方差和置信區間。
超參數調優
在機器學習領域,超參數調優是機器學習的「元」(meta)任務。這是我很喜歡的一個題目,因為超參數調優顯得像是黑魔法而無法看透。本章將會詳細的介紹超參數調優的內容:為什麼超參數調優很難,以及有什麼樣的自動化的調優方法可以使用。
模型的參數與超參數的對比
首先讓我們來定義什麼是超參數,以及它與模型正常的參數有什麼不同。
機器學習的模型本質上是一個數學公式。它代表了數據的不同方面的聯繫。例如:在線性回歸模型中,使用一條線表示特徵與目標之間的關係,數學公式為:
wTx = y
其中x是代表不同特徵的向量。y是一個數值型變數, 代表了目標值
(即那些我們希望能預測的數量)。
這個模型假設特徵與目標之間是線性關聯的。w表示每個特徵的權重向量,決定著這條線的斜率。它就是通常所說的模型的參數,是需要在訓練階段從數據中學習的。「訓練模型」其實就是使用一種優化的過程來找到擬合數據的最優的模型參數。
另外的一套參數則是模型超參數,有時也叫做「微差別參數」。他們的值不是在模型訓練階段獲得的。普通的線性回歸是沒有超參數的, 但是有些線性回歸的變形是有的。比如嶺回歸(Ridge regression)和LASSO回歸都會在線性模型上增加一個正則項,而這些正則項的權重就是「正則參數」。決策樹模型也有超參數,如樹的深度、葉子節點數等。支持向量(SVM)要有一個對應於分類錯誤的懲罰因子,而使用核函數的SVM需要為核函數設置超參數,比如RBF徑向基函數的寬度等。
超參數有什麼作用?
如正則化因子是來控制模型的能力,模型擬合數據的自由度(degrees of freedom)決定了模型的靈活度。合理的控制模型的能力能夠有效地防止過擬合。過擬合一般會發生在當模型太過靈活以及訓練模型的過程過於去匹配訓練數據。過擬合會導致模型對新測試數據的預測精度低。因此合理的設置模型的超參數則非常重要。
另一種類型的超參數來自於模型訓練的過程本身。模型訓練是一個使損失函數(訓練階段的評估指標)最小化的過程,有很多的優化方法可以使用。這些優化方法本身又有參數需要設置。比如隨機梯度降低(SGD,stochastic gradient descent)方法裡面需要設定一個學習速率參數。另外, 有些優化方法需要一個收斂的閾值。比如隨機森林(Random Forests)和自助提升決策樹(Boosted decision trees)需要設置樹的個數的參數(儘管這個可以歸為正規化超參數)等。這些超參數需要被合理地設置以找到一個好的模型。
超參數調優的演算法
概念上講,與模型訓練一樣,超參數調優也是一個優化的任務。但是這兩個任務的過程差別很大。模型訓練時,備選的模型參數的好壞是可以用數學公式來表示的(一般叫損失函數)。但是調優超參數時,備選的超參數的好壞很難用一個數學公式來衡量,因為它們依賴於模型訓練這個黑盒子的產出來判斷。
這就是為什麼超參數調優較為困難。直到幾年之前,可用的調優方法還僅限于格搜索和隨機搜索。在近幾年中,自動調優的方法得到了廣泛的關注,研究人員對這個問題進行了深入的探索,發表論文並提供了相關的工具。
格搜索
顧名思義,格搜索就是把超參數的可能取值劃分成一個一個的格子區
間,然後按順序去用每個網格內的值來進行調優,並找到最好的值。例如,假定決策樹的葉子數目是一個超參數,則可以把數目劃分成10、
20、30到100的格子。對於正規化因子,常用的格子區間是指數區間, 比如1e-5,1e-4,1e-3直到1。有時還需要去估計超參數的可能最大和最小值來確定格子的大小。因此有些時候,需要人工指定一個小區間(去劃分格子),然後檢查優化的方向是哪一端,再向那一端來擴大區間範圍。這種方法叫人工格搜索。
格搜索的方法很簡單,而且容易被並行化。從計算時間上來看,它是最昂貴的方法。但是如果能很好的並行化,整體的運行時間會很短。
隨機搜索
我喜歡那種 絲最終逆襲的電影,更喜歡用簡單的方法能取得意外效果的機器學習論文。那麼伯格斯塔(Bergstra)和本吉奧(Bengio)的論文《Random Search for Hyper Parameter Optimization》就是這樣的一篇。隨機搜索是格搜索方法的一個變形。相比於遍歷整個格空間的所有選擇,隨機搜索只對隨機抽取的那些格進行評估。這使得隨機搜索比格搜索的代價要低很多。因為隨機搜索有可能會不去檢查最優的超參數組合那個格子,這樣就會找不到最優,所以很長時間內隨機搜索都不受重視。但是這篇論文證明,在絕大多數情況下,隨機搜索的表現和格搜索差不多。只要隨機採樣60個超參數格,就能夠取得足夠好的超參數組合。這背後其實是有一個簡單的概率解釋的。對任何有限的樣本空間,隨機採樣60次中有至少一次能採樣到前5%的最優格的最大可能概率是95%。這看起來可能很繞,不過很容易解釋。對於前5%的最優格,我們做隨機採樣,然後觀察採樣點是否是來自於這5%內。每次採樣都有5%的可能性會落在裡面。如果我們獨立採樣n次。那麼這n 次都沒有落到最大5%中的概率是(1-0.05)n。所以至少有一次能夠進入這5%的區間的概率就是1減去這個值。假定我們希望有至少95%的成功概率,那麼找到最少採樣次數的值就只需要求解下面的不等式中的n即可。
1-(1-0.05)n>0.95
求解可得n>=60。哈哈!
這個故事的寓意是,如果至少有5%的格點可以取得近似於最優解的超
參數組合,那麼隨機搜索60次就能夠有很高的概率採樣到這5%。這裡的如果這個句話是很重要的。它需要或者格空間里近似於最優的那個區域夠大,抑或格空間里有一個高密度的近似於最優的區域。前者比較常見,因為好的機器學習模型不應該對於超參數過於敏感,換句話說就是它的近似於最優的區域應該夠大。
由於其極度的簡單和意外的有效,隨機搜索是我最喜歡的超參數調優的方法。和格搜索一樣,並行化隨機搜索是很簡單的。但它需要的運行次數更少,而且絕大多數時候表現都不錯。
智能超參數調優
更智能的調優方法是有的。不像這些比較「傻」的格搜索和隨機搜索,智能超參數調優不容易並行化。它並不是去先產生所有可能的備選超參數組合,再挨個(並行地)進行評估。相反的,智能調優技術先挑選一小部分候選組合,評估他們,然後決定下一個要評估的候選組合。這就是一個序列化的處理過程,所以很少能並行化。智能化的目標是儘可能的少做評估,從而能從總體上節省調優的計算時間。鑒於此,如果你關注的是總體調優的時間,並且能夠負擔起並行化的開銷,我建議你還是採用隨機搜索的方法。
需要買家注意的是,智能化調優演算法需要較多的計算時間來判斷下一次採樣的目標,有些演算法會需要非常的多時間。因此這個方法對於那些內部的模型訓練過程需要很長時間(相比於超參數調優而言)的建模才有意義。同時智能調優也會有自己的參數需要設置(超—超參數?)。有時,只有恰當地設置這些超—超參數才能保證智能調優的速度比隨機搜索要快。
前面說過, 超參數調優之所以很難是因為沒法用一個數學公式來定義出需要優化的函數( 這個需要優化的函數的技術辭彙是「響應曲面」),從而無法獲得其導數。相應的,目前可用的許多優化函數的工具,例如牛頓優化法、隨機梯度降低法,都沒有辦法使用。
這裡我重點介紹近年來出現的三種智能調優方法: 無導數優化(derivative-free optimization),貝葉斯優化( Bayesian optimization)和隨機森林調優(random forest smart tuning)。
嵌套交叉校驗
在結束本章之前,讓我們從一個更高的層級來聊聊嵌套交叉驗證,或是嵌套超參數調優(我暫且稱之為元-元-訓練任務)。
模型選擇和超參數調優之間有一些細微的差別。模型選擇不僅包括為某個特定的模型族(例如,決策樹的高度)調優參數,還包括選擇不同的模型族(例如,我是應該使用決策樹還是線性支持向量機?)。某些先進的超參數調優方法宣稱可以適用於不同的模型族。但大部分情況下,都不建議這麼做。對應於不同的模型族的超參數相互之間的重疊部分很少,所以最好不要交叉混用。
在不同的模型族中做選擇,這又給我們的原型產生的蛋糕加上了一層。還記得之前強調的不要混用訓練數據集和評估數據集。這意味著現在我們必須單獨再為超參數調優器準備驗證數據(或者是做交叉驗證)。
推薦閱讀:
※【最優化】無約束優化方法-阻尼牛頓法
※十分種讀懂KNN
※鋼鐵直男的救世主來了!讓AI告訴你妹子到底是啥意思
※2-1 Model Representation
※機器學習入門之泰坦尼克號案例
TAG:機器學習 |