評估機器學習模型的幾種方法(驗證集的重要性)

什麼是評估機器學習模型    app

  機器學習的目的是獲得能夠泛化(generalize)的模型,即在前所未見的數據上表現很好的模型,而過擬合則是核心難點。你只能控制能夠觀察的事情,因此可以可靠地衡量模型的泛化能力很是重要。  機器學習

如何衡量泛化能力,即如何評估機器學習模型。性能

評估模型的重點是將數據劃分爲三個集合:訓練集、驗證集和測試集。在訓練數據上訓練模型,在驗證數據上評估模型。一旦找到了最佳參數,就在測試數據上最後測試一次。學習

爲何須要驗證集測試

 

  緣由在於開發模型時老是須要調節模型配置,好比選擇層數或每層大小[這叫做模型的超參數(hyperparameter),以便與模型參數(即權重)區分開]。這個調節過程須要使用模型在驗證數據上的性能做爲反饋信號。這個調節過程本質上就是一種學習:在某個參數空間中尋找良好的模型配置。所以,若是基於模型在驗證集上的性能來調節模型配置,會很快致使模型在驗證集上過擬合,即便你並無在驗證集上直接訓練模型也會如此。
  形成這一現象的關鍵在於信息泄露(information leak)。每次基於模型在驗證集上的性能來調節模型超參數,都會有一些關於驗證數據的信息泄露到模型中。若是對每一個參數只調節一次,那麼泄露的信息不多,驗證集仍然能夠可靠地評估模型。但若是你屢次重複這一過程(運行一次實驗,在驗證集上評估,而後據此修改模型),那麼將會有愈來愈多的關於驗證集的信息泄露到模型中。
  最後,你獲得的模型在驗證集上的性能很是好(人爲形成的),由於這正是你優化的目的。你關心的是模型在全新數據上的性能,而不是在驗證數據上的性能,所以你須要使用一個徹底不一樣的、前所未見的數據集來評估模型,它就是測試集。你的模型必定不能讀取與測試集有關的任何信息,既使間接讀取也不行。若是基於測試集性能來調節模型,那麼對泛化能力的衡量是不許確的。
將數據劃分爲訓練集、驗證集和測試集可能看起來很簡單,但若是可用數據不多,還有幾種高級方法能夠派上用場。優化

咱們先來介紹三種經典的評估方法:簡單的留出驗證、K 折驗證,以及帶有打亂數據的重複 K 折驗證。lua

1. 簡單的留出驗證
留出必定比例的數據做爲測試集。在剩餘的數據上訓練模型,而後在測試集上評估模型。
如前所述,爲了防止信息泄露,你不能基於測試集來調節模型,因此還應該保留一個驗證集。spa

留出驗證的僞代碼:code

1、將原有數據集打亂順序shuffle_data
二、將打亂的數據集的一部分(通常爲10%-20%)定義爲驗證集valify_data
3、剩餘的數據定義爲訓練數據train_data
4、根據需求建模 model
5、訓練模型model.train(train_data)
6、在驗證集上評估模型model.evaluate(valify_data)
7、調節模型
八、重複五、6、7直到模型在驗證集上表現良好
九、在測試集上測試模型

  這是最簡單的評估方法,但有一個缺點:若是可用的數據不多,那麼可能驗證集和測試集包含的樣本就太少,從而沒法在統計學上表明數據。這個問題很容易發現:若是在劃分數據前進行不一樣的隨機打亂,最終獲得的模型性能差異很大,那麼就存在這個問題。orm

2. K 折驗證
  K 折驗證(K-fold validation)將數據劃分爲大小相同的 K 個分區。對於每一個分區 i ,在剩餘的 K-1 個分區上訓練模型,而後在分區 i 上評估模型。最終分數等於 K 個分數的平均值。對於不一樣的訓練集 - 測試集劃分,若是模型性能的變化很大,那麼這種方法頗有用。與留出驗證同樣,這種方法也須要獨立的驗證集進行模型校訂。

僞代碼

將原來的數據平均k份
根據需求建模 model
for i in range(k)
    將第 i 份數據做爲驗證集,其餘k-1份數據做爲訓練集
    在訓練集上訓練模型
    在驗證集上【】評估模型
在測試集上測試模型

數據量小的時候,k 能夠設大一點,這樣訓練集佔總體比例就比較大,不過同時訓練的模型個數也增多。 
數據量大的時候,k 能夠設小一點。

三、帶有打亂數據的重複 K 折驗證

  若是可用的數據相對較少,而你又須要儘量精確地評估模型,那麼能夠選擇帶有打亂數據的重複 K 折驗證(iterated K-fold validation with shuffling)。具體作法是屢次使用 K 折驗證,在每次將數據劃分爲 K 個分區以前都先將數據打亂。最終分數是屢次 k 折交叉驗證再求均值,例如:10 次 10 折交叉驗證,以求更精確一點。注意,這種方法一共要訓練和評估 P×K 個模型(P是重複次數),計算代價很大。


 

  除此以外還有一種比較特殊的交叉驗證方法,有人將其叫作Bootstrapping。經過又放回的抽樣,抽取與train_data相同數量的數據做爲新的訓練集。即在含有 m 個樣本的數據集中,每次隨機挑選一個樣本,再放回到數據集中,再隨機挑選一個樣本,這樣有放回地進行抽樣 m 次,組成了新的數據集做爲訓練集。

優勢是訓練集的樣本總數和原數據集同樣都是 m,而且仍有約 1/3 的數據不被訓練而能夠做爲測試集。 缺點是這樣產生的訓練集的數據分佈和原數據集的不同了,會引入估計誤差。 

相關文章
相關標籤/搜索