机器学习中数据集的拆分
轉自:https://feisky.xyz/machine-learning/basic/datasets.html
通常將數據集分為三類,分為倆類的是留出法。
在機器學習中,通常將所有的數據劃分為三份:訓練數據集、驗證數據集和測試數據集。它們的功能分別為
- 訓練數據集(train dataset):用來構建機器學習模型
- 驗證數據集(validation dataset):輔助構建模型,用于在構建過程中評估模型,為模型提供無偏估計,進而調整模型超參數
- 測試數據集(test dataset):用來評估訓練好的最終模型的性能
不斷使用測試集和驗證集會使其逐漸失去效果。也就是說使用相同數據來決定超參數設置或其他模型改進的次數越多,對于這些結果能夠真正泛化到未見過的新數據的信心就越低。請注意,驗證集的失效速度通常比測試集緩慢。如果可能的話,建議收集更多數據來“刷新”測試集和驗證集。重新開始是一種很好的重置方式。
為了劃分這幾種數據集,可以選擇采用留出法、K-折交叉驗證法或者自助法等多種方法。這些方法都對數據集有一些基本的假設,包括
- 數據集是隨機抽取且獨立同分布的
- 分布是平穩的,不會隨時間發生變化
- 始終從同一個分布中抽取樣本
陷阱:請勿對測試數據集進行訓練。
留出法
留出法(hold-out)直接將數據集劃分為互斥的集合,如通常選擇 70% 數據作為訓練集,30% 作為測試集。
需要注意的是保持劃分后集合數據分布的一致性,避免劃分過程中引入額外的偏差而對最終結果產生影響。通常來說,單次使用留出法得到的結果往往不夠穩定可靠,一般采用若干次隨機劃分、重復進行實驗評估后取平均值作為留出法的評估結果。
K-折交叉驗證法
Kuhn 和 Johnson 在「Data Splitting Recommendations」中指出使用單獨的「測試集」(或驗證集)具有一定的局限性,包括
- 測試集是對模型的單次評估,無法完全展現評估結果的不確定性。
- 將大的測試集劃分成測試集和驗證集會增加模型性能評估的偏差。
- 分割的測試集樣本規模太小。
- 模型可能需要每一個可能存在的數據點來確定模型值。
- 不同測試集生成的結果不同,這造成測試集具備極大的不確定性。
- 重采樣方法可對模型在未來樣本上的性能進行更合理的預測。
所以在實際應用中,可以選擇 K-折交叉驗證(k-fold cross-validation)的方式來評估模型,其偏差低、性能評估變化小。
K-折交叉驗證法將數據集劃分為?k?個大小相似的互斥子集,并且盡量保證每個子集數據分布的一致性。這樣,就可以獲取?k?組訓練 - 測試集,從而進行?k?次訓練和測試。
k?通常取值 10,此時稱為 10 折交叉驗證。其他常用的?k?值還有 5、20 等。
自助法
自助法(bootstrap method)以自助采樣法為基礎:每次隨機的從初始數據 $D$ 中選擇一個樣本拷貝到結果數據集 $D'$ 中,樣本再放回初始數據 $D$ 中;這樣重復 $m$ 次,就得到了含有 $m$ 個樣本的數據集 $D'$。這樣就可以把 $D'$ 作為訓練集,而?D\D'?作為測試集。這樣,樣本在?m?次采樣中始終不被采集到的概率為
\lim_{m\to\infty} (1-\frac{1}{m})^{m} = 1/e = 0.368lim?m→∞??(1??m??1??)?m??=1/e=0.368
自助法的性能評估變化小,在數據集小、難以有效劃分數據集時很有用。另外,自助法也可以從初始數據中產生多個不同的訓練集,對集成學習等方法有好處。
然而,自助法產生的數據集改變了初始數據的分布,會引入估計偏差。因而,數據量足夠時,建議使用留出法和交叉驗證法。
?
總結
以上是生活随笔為你收集整理的机器学习中数据集的拆分的全部內容,希望文章能夠幫你解決所遇到的問題。