1. 程式人生 > >評估機器學習模型的幾種方法(驗證集的重要性)

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

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

什麼是評估機器學習模型    

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

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

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

為什麼需要驗證集

 

  原因在於開發模型時總是需要調節模型配置,比如選擇層數或每層大小[這叫作模型的超引數(hyperparameter),以便與模型引數(即權重)區分開]。這個調節過程需要使用模型在驗證資料上的效能作為反饋訊號。這個調節過程本質上就是一種學習:在某個引數空間中尋找良好的模型配置。因此,如果基於模型在驗證集上的效能來調節模型配置,會很快導致模型在驗證集上過擬合,即使你並沒有在驗證集上直接訓練模型也會如此。
  造成這一現象的關鍵在於資訊洩露(information leak)。每次基於模型在驗證集上的效能來調節模型超引數,都會有一些關於驗證資料的資訊洩露到模型中。如果對每個引數只調節一次,那麼洩露的資訊很少,驗證集仍然可以可靠地評估模型。但如果你多次重複這一過程(執行一次實驗,在驗證集上評估,然後據此修改模型),那麼將會有越來越多的關於驗證集的資訊洩露到模型中。
  最後,你得到的模型在驗證集上的效能非常好(人為造成的),因為這正是你優化的目的。你關心的是模型在全新資料上的效能,而不是在驗證資料上的效能,因此你需要使用一個完全不同的、前所未見的資料集來評估模型,它就是測試集。你的模型一定不能讀取與測試集有關的任何資訊,既使間接讀取也不行。如果基於測試集效能來調節模型,那麼對泛化能力的衡量是不準確的。
將資料劃分為訓練集、驗證集和測試集可能看起來很簡單,但如果可用資料很少,還有幾種高階方法可以派上用場。

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

1. 簡單的留出驗證
留出一定比例的資料作為測試集。在剩餘的資料上訓練模型,然後在測試集上評估模型。
如前所述,為了防止資訊洩露,你不能基於測試集來調節模型,所以還應該保留一個驗證集。

留出驗證的虛擬碼:

複製程式碼

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

複製程式碼

  這是最簡單的評估方法,但有一個缺點:如果可用的資料很少,那麼可能驗證集和測試集包含的樣本就太少,從而無法在統計學上代表資料。這個問題很容易發現:如果在劃分資料前進行不同的隨機打亂,最終得到的模型效能差別很大,那麼就存在這個問題。

2. K 折驗證
  K 折驗證(K-fold validation)將資料劃分為大小相同的 K 個分割槽。對於每個分割槽 i ,在剩餘的 K-1 個分割槽上訓練模型,然後在分割槽 i 上評估模型。最終分數等於 K 個分數的平均值。對於不同的訓練集 - 測試集劃分,如果模型效能的變化很大,那麼這種方法很有用。與留出驗證一樣,這種方法也需要獨立的驗證集進行模型校正。

虛擬碼

複製程式碼

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

複製程式碼

資料量小的時候,k 可以設大一點,這樣訓練集佔整體比例就比較大,不過同時訓練的模型個數也增多。 
資料量大的時候,k 可以設小一點。

3、帶有打亂資料的重複 K 折驗證

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


 

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

優點是訓練集的樣本總數和原資料集一樣都是 m,並且仍有約 1/3 的資料不被訓練而可以作為測試集。 
缺點是這樣產生的訓練集的資料分佈和原資料集的不一樣了,會引入估計偏差。