什么是評估機器學習模型
機器學習的目的是得到可以泛化(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 的數據不被訓練而可以作為測試集。
缺點是這樣產生的訓練集的數據分布和原數據集的不一樣了,會引入估計偏差。