Kaggle 比賽中如何劃分數據集?

劃分數據集,是為了得到在實際數據上表現最優的模型,也就是要進行 validation。

Kaggle 比賽中如何劃分數據集?

https://scikit-learn.org/stable/modules/cross_vali

什麼是 validation ?

當我們訓練好一個模型後,並不能直接應用於實際的生產,因為在訓練模型時,用的是歷史數據,而真正應用模型時,是要用來預測未來的數據,所以需要做一些檢查,看模型是否能夠應用在未來,檢查這個模型在未來不可見的數據上是否是表現最好的,這些 checks 就是 validation。

具體做法,就是要把數據集分成三部分,訓練集,驗證集,測試集:


Kaggle 比賽中如何劃分數據集?


  • 在訓練集上訓練模型,
  • 在驗證集上檢查模型的質量,
  • 在測試集上應用模型。

此外,在 kaggle 的比賽中,組織者會將測試集進一步劃分為 public 和 private 兩部分,在比賽過程中提交拿到的分數,是在 public 測試集上的結果,當比賽結束時,會顯示 private 測試集上的結果。

如果一個模型在 public 的分數比較高,但是在 private 的分數很低,那麼說明模型過擬合了。


什麼是過擬合?

我們訓練模型時,本質是希望模型可以識別數據中的模式。

如果模型太簡單了,就沒辦法捕捉到數據中的模式,這個叫做欠擬合。

欠擬合的話,我們就增加模型的複雜度,提高訓練集的質量。

可以如果模型太複雜了,它雖然可以將訓練集的數據描述的非常好,但是卻無法很好地捕捉到測試集的模式,這個叫做過擬合。


Kaggle 比賽中如何劃分數據集?


比賽中的過擬合和一般的過擬合還不太一樣:

一般的過擬合指的是,模型捕捉到了模式但卻不適用於測試集,

比賽中的過擬合指的是,模型在 private 測試集上的質量很差,而這卻並沒有通過 validation score 檢查出來,也就是 public 測試集上表現還挺好。


所以,比賽要拿高分,有個問題需要明確,就是組織者是如何劃分訓練集和測試集的,public 和 private 是如何劃分的。

那麼訓練集和驗證集要如何劃分呢?

主要有下面幾種劃分方法:

  • Holdout:

就是將數據集簡單地分成訓練集和驗證集兩部分,當數據足夠多的時候適合用這個方法,或者在不同的劃分下,模型的參數和分數差不多時。


Kaggle 比賽中如何劃分數據集?


  • K-fold:

相當於是做多次 Holdout,取訓練集中不同的部分作為驗證集,最後再取平均。它和簡單地重複多次 Holdout 的區別是,簡單重複的話,有些樣本可能一直都無法被選中作為驗證集,但是在 K-fold 中每個樣本都可以作為驗證集。這個方法適用於數據量中等的情況,或者對於不同的劃分,模型的分數和參數會很不相同時。在 shuffle 數據上,常用 Holdout 和 K-fold。


Kaggle 比賽中如何劃分數據集?


  • Leave-one-out:

是 K-fold 的特殊情況,就是當 K 等於樣本數量時。這意味著要迭代數據集中的每個樣本,每一次都是有一個樣本作為驗證集,另外 K-1 個樣本作為訓練集。這個方法適用於數據量非常少的情況,或者模型非常快的時候。

它們主要的區別就是劃分的次數是多少。

注意在劃分時,一個樣本只能被分到一個集合中,不能同時在訓練集和驗證集中,否則模型在驗證集上的表現可能會和測試集上面一樣好,那就無法檢查出模型真正的質量了。

  • stratification:

它是一種讓 validation 更加穩定的方法。

例如有一個二分類問題,數據集只有 8 個樣本,4 個類別是 0,4 個類別是 1,

然後將數據集分成 4 folds,

這裡有個問題是,例如用第二份作為驗證集,那麼目標值的平均會是 2/3,而不是 1/2,這就會影響我們模型的預測,

所以要用到 stratification 分層來應對這個問題。

這個方法是為了保證在不同的 folds 上,目標的分佈是相似的,

在應用 stratification 後,每個 folds 上的平均值差不多都是 1/2.

stratification 常用於小數據集,不平衡的數據集,或者多分類問題上。


不同的劃分方法對模型有什麼影響?

不同的劃分策略,會對下面三點有很大的影響:

  • 生成的特徵
  • 模型依賴特徵的方式
  • target leak


Kaggle 比賽中如何劃分數據集?


例如,我們要處理一個時間序列問題,時間序列數據要如何劃分訓練集和驗證集呢?

一種是隨機選擇一些樣本作為驗證集,

一種是保持時間的順序,以某個日期為節點,之前的作為訓練集,之後的作為驗證集。

如果我們的目標是要要預測未來連續幾天的若干個值,那麼用第二種方法好一些。

此時如果我們用了第一種劃分方法,那麼在這種方法下訓練出來的模型,在預測未來連續幾天的問題上,表現不會很好。

而且,模型的預測值會比較靠近目標的平均值,

左圖是用隨機的方法選擇驗證集的,如果驗證集的數據比較靠近這個平均值,驗證集的分數就會比測試集的分數好一些。

而在第二種情況,驗證集的點和測試集的點都離平均值比較遠,驗證集的分數就會和測試集的分數差不多。

總之,為了更好地生成模型,並且不斷地改進模型,我們最好可以識別組織者是如何劃分訓練集和測試集的。


劃分方法有哪些角度?

一般可以分為三類:

  • 按照行隨機劃分

當數據是互相獨立的時候使用。

  • 按照時間劃分

如果要預測未來連續幾周的數據,那麼劃分時候也是以某個日期為節點去劃分。

  • 按照 ID 劃分

當數據涉及到用戶等個體時,需要根據 ID 劃分,使得訓練集和驗證集中沒有重合的部分。

  • 混合方法

如果一個比賽包括以上多個特徵,那麼劃分時候可以考慮混合應用各個策略。

比如 Home Depot Product Search Relevance 這個比賽中,參賽者需要估計出搜索的關聯性。

訓練集數據包括搜索的項目和搜索的結果,但測試集只有搜索的項目,所以不能直接用隨機劃分,因為這個需要比較複雜的模型,容易過擬合;也不能用基於搜索條目的劃分,這種方法容易欠擬合,比較好的做法是在劃分時,要模擬出新出現的搜索條目所佔的比例。

總之,不同的比賽,不同的數據特點,需要用不同的劃分策略,有一個很重要的規則是,在劃分訓練集和驗證集的時候,要儘量模仿出比賽組織者所劃分的訓練集和測試集的狀態,這樣驗證後的模型才更可信,才能在測試集上表現優秀。


學習資料:

https://youtu.be/L2BlnCF4fJM

https://youtu.be/pA6uXzrDSUs

https://youtu.be/mc1pZrubdno

https://www.quora.com/What-is-validation-in-data-science


分享到:


相關文章: