--- title: 訓練集、驗證集、測試集的定義與劃分 date: 2021-03-10 is_modified: true disqus: cynthiahackmd categories: - "智慧計算 › 人工智慧" tags: - "AI/ML" - "煉丹常識" - "模型評估" - "Published" --- {%hackmd @CynthiaChuang/Github-Page-Theme %} <br> 在機器學習,我們所搜集到資料並不能全拿來做訓練,必須保留一些當作測試資料來評估模型的最終表現。 最偷懶的狀況下,我會把資料會被切分成測試集(training)跟訓練集(test)兩種。不過一般來說,標準的資料劃分會分成三種,分別是:訓練集(training)、驗證集(validation)和測試集(test)。 <!--more--> ## 資料集定義 先舉個例來描述三個數據集: - **訓練集(training)** 舉例來說就是上課學習。 - **驗證集(validation)** 舉例來說就是模擬考,你會根據模擬考的成績繼續學習、或調整學習方式重新學習。 - **測試集(test)** 就像是學測,用來評估你最終的學習結果。 使用**學測**來比喻,是因為==測試集不應該做為參數調整、選擇特徵等依據==。這些選擇與調整可以想像成學習方式的調整,但學測已經考完,你不能時光倒轉回到最初調整學習方式。 ### 訓練集(Training Set) 訓練集(Training Set)主要用在訓練階段,用於模型擬合,直接參與了==模型參數調整的過程==。 ### 驗證集(Validation Set) 驗證集(Validation Set)是在訓練過程中,用於評估模型的初步能力與==超參數調整的依據==。 不過驗證集是非必需的,不像訓練集和測試集。如果不需要調整超參數,就可以不使用驗證集。 ### 測試集(Test Set) 用來評估模型最終的泛化能力。為了能評估模型真正的能力,測試集==不應該==為參數調整、選擇特徵等依據。 ## 資料劃分 我個人較常用來劃分資料的方法有兩種:==留出法== 與 ==k-fold== ### 留出法(Holdout method) Holdout 驗證是按照==固定比例==將資料集劃分爲訓練集、驗證集、測試集,屬於==靜態的==劃分方法。 不過其劃分比例並沒有明確的規定,但有些經驗法則可供參考: 1. **對於小資料量** 可遵循 60%、20%、20% 的比例下去劃分。另一種常見的比例是 80%、10%、10%,比例的選擇由你資料集大小來決定。 2. **對於大資料量** 只要驗證集和測試集的數量足夠即可,如有 100 萬筆數據,那麼可分 1 萬當驗證集、 1 萬當測試集,其餘皆可作為訓練集。 另外若是需調整超參數量少,可以適當減少驗證集的資料量,分配更多給訓練集。 <p class="illustration"> <img src="https://i.imgur.com/EzCJTJV.png" alt="留出法"> 留出法(圖片來源: <a href="https://blog.csdn.net/lanchunhui/article/details/50522424">CSDN博客</a>) </p> :::info :information_source: **Holdout cross validation / Holdout method** 之前,在這邊我是將留出法的英文是用 Holdout cross validation,但我覺得留出法並不算一種交叉驗證,畢竟當測試集劃分後並沒有被交叉使用,它比較像是一種簡單驗證方式,所以我改用了維基百科中 Holdout method。 另外說到維基百科,在 Holdout method 的中文翻譯是直接翻成 Holdout 驗證,不過我覺得留出法這個名字非常的形象,因此我這邊還是保留了這個翻譯。 ::: ### k 折交叉驗證(k-fold cross validation) 另一個常用的是==動態的== k-fold 劃分方法,這種方式可以降低數據劃分帶來的影響。雖說是動態,不過測試集仍要事前先切出來,通常會保留 60%~80% 當作訓練資料,其餘作測試集。 而訓練資料會在訓練過程中被化分成 k 份,每次使用 k 份中的 1 份作爲驗證集,其他 k-1 份作爲訓練集,算出一個 Validation Error。交叉驗證重複 k 次,每個子樣本驗證一次,算出 K 個 Validation Error,最後我們再將這 k 個 Validation Error 做平均,用他們的平均分數來做為我們評斷模型好壞的指標。 <p class="illustration"> <img src="https://i.imgur.com/4ubxxws.png" alt="k 折交叉驗證"> k 折交叉驗證(圖片來源: <a href="https://blog.csdn.net/lanchunhui/article/details/50522424">CSDN博客</a>) </p> ## 參考資料 1. CHEN TSU PEI (2019-12-17)。[機器學習怎麼切分資料:訓練、驗證、測試集. 訓練集、驗證集、測試集分別代表什麼含義,又該怎麼劃分](https://medium.com/nlp-tsupei/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E6%80%8E%E9%BA%BC%E5%88%87%E5%88%86%E8%B3%87%E6%96%99-%E8%A8%93%E7%B7%B4-%E9%A9%97%E8%AD%89-%E6%B8%AC%E8%A9%A6%E9%9B%86-f5a92576d1aa)。檢自 NLP-trend-and-review|Medium (2020-06-30)。 2. 區塊鏈遊戲研究院區塊鏈 (2019-12-20)。[一文看懂 AI 訓練集、驗證集、測試集(附:分割方法+交叉驗證](https://www.chainnews.com/zh-hant/articles/879556443394.htm)。檢自 鏈聞 ChainNews (2020-06-30)。 3. 程序員小新人學習 (2018-08-12)。[訓練集、驗證集、測試集以及交驗驗證的理解](https://kknews.cc/zh-tw/code/jbm8ray.html)。檢自 每日頭條 (2020-06-30)。 4. 清文 (2018-08-11)。[求解神经网络做十字交叉验证k=10,这种方法到底是得到十个模型还是一个模型](https://www.zhihu.com/question/29350545/answer/466060995)。檢自 知乎 (2020-06-30)。 5. 協同撰寫。[交叉驗證](https://zh.wikipedia.org/wiki/%E4%BA%A4%E5%8F%89%E9%A9%97%E8%AD%89)。檢自 維基百科 (2021-03-10)。 6. 協同撰寫。[Cross-validation (statistics)](https://en.wikipedia.org/wiki/Cross-validation_(statistics))。檢自 Wikipedia (2021-03-10)。 7. Inside_Zhang (2016-01-15)。[cross-validation:从 holdout validation 到 k-fold validation](https://blog.csdn.net/lanchunhui/article/details/50522424)。檢自 鏈聞 CSDN博客 (2021-03-10)。 ## 更新紀錄 :::spoiler 最後更新日期:2021-03-10 - 2021-03-10 更新:新增圖片、改動留出法英文 - 2020-08-10 發布 - 2020-07-09 完稿 - 2020-06-30 起稿 ::: {%hackmd @CynthiaChuang/Github-Page-Footer %}