設置訓練集 (training)、開發集 (dev/development) 和測試集 (test) 的方式 對於打造機器學習應用的速度 會造成很大的影響 即使是大公司裡面的團隊 設計這些資料集設定的不好 也會拖慢團隊的進度 讓我們看看要怎麼去設置 這些資料集,來增加你團隊的效率 在這部影片,我想把重點放在設定「開發集」和「測試集」 Dev set (開發集) 也稱作 development set 有時會叫 holdout 交叉驗證集。 機器學習的工作流程是:你嘗試很多點子 用訓練集訓練各種模型 然後用開發集來評估這些點子,從中挑一個 一直重複這過程,改善在開發集的成效 直到做出了你滿意的分類器,然後你再用測試集評估 舉個例子,假設 你在做一個貓貓分類器 會用在這些地區:美國、 英國、其他歐洲國家、南美 印度、中國、其他亞洲國家、和澳洲 那麼,你要怎麼設置開發集和測試集呢? 一個方法是,你可以挑這四個地區 在這裡我用這四個,但可以是任意四個地區 假設把這四個地區的資料當作開發集 然後另外的四個地區 — 也可以是隨意的四個 把那些放入測試集 不過呢,這方法其實很爛。因為在這例子 你的開發集和測試集有著不同的分布 相反地,我會建議想辦法讓開發集和訓練集 從同樣的資料分佈而來。讓我來解釋一下 你可以想像一個畫面: 設置你的開發集,以及 單一衡量指標 這如同放一個靶, 和大家說這就是我們要瞄準的紅心。 因為設定好開發集和指標後, 大家可以很快地反覆試不同的想法、 跑實驗、很快地拿開發集 用你的指標來評估分類器的好壞,挑一個最好的 做機器學習的人很擅長的是,用不同的方式射靶 逐漸越來越靠近紅心 也就是,在開發集的指標上表現好 然而,以左邊這個例子而言 這樣設定開發和測試集的問題在於 大家花了幾個月,想辦法讓開發集表現好,然後發現 真的拿測試集來測試成效時 下半部這四個地區的資料 很可能和開發集的長得完全不一樣 然後你才很驚恐地發現 這些日子對開發集努力作到最好 並不能讓你在測試集上也表現好 所以開發集和測試集如果有不同的分布,就好比 設定了一個目標,告訴大家瞄準紅心 大家努力了好幾個月,你才發現 「喔等等,要測試的話 我要將靶心移到另一邊」 大家會說「呃... 為什麼我們花了這麼久瞄準紅心 標靶突然被移到了另一個地方?」 要避免這樣 我的建議是 你拿這邊所有的資料,隨機分成開發集和測試集 這樣的話,開發和測試都會有八個地區的資料 開發集和測試集會從同一種分布取出來 也就是所有資料混合起來的這個分布。 還有另一個例子 改編自真實案例 我聽過某個機器學習的團隊 花了好幾個月把開發集做到好 開發集是中產階級的貸款狀況 這個題目是這樣的: 「給定一個貸款申請的輸入 X 你能不能預測 他會不會償還貸款呢?」 這能幫你決定要不要批准某個貸款 那麼,開發集是貸款申請 蒐集中收入地區所得到的資料 zip code 是美國的郵遞區號 不過努力了幾個月後,這團隊 忽然決定要測試在 低收入地區的資料上 當然,中收入和低收入地區 的資料分布非常不一樣 所以他們花很多時間,用前面資料生出的分類器 並不能在之後的資料上表現得好 所以,他們浪費了三個月 必須從頭再做起。 他們碰到的問題是 花了三個月瞄準某個靶心 三個月過後 他們的經理問「喔, 射另一個靶的話會多準?」 這位置完全不一樣 這讓團隊很挫折。 因此,我建議這樣設置開發集和測試集: 讓你的開發集和測試集能反映出預期中 未來的資料;你認為是重要、想做好的資料 特別注意的是,開發集 (dev) 和測試集 (test) 要從同一個分布而來。 無論你未來會獲得的、想要有好表現的 會是什麼樣的資料 試著去蒐集這樣子的資料。 蒐集到了以後 就分到開發集和測試集。 這樣子的話 你的目標就是真心想要的靶心 團隊可以有效率地射向同一個靶心 希望能做得好。 你可能會注意到,我們還沒講到如何設定訓練集 (training) 我們之後再討論 不過這部影片的重點是: 開發集的設置 還有評估的指標 定義了你想瞄準的目標。 希望藉由設置同個分布的開發集和測試集 你能讓團隊瞄準真正的目標。 而挑選訓練集的方法 會影響在這目標上能夠達到的好壞 不過我們之後會再討論。 根據我的經驗,某些機器學習的團隊 如果能遵守這個準則,就不會浪費了數個月的時間 所以我希望這個準則也能對你有幫助 接下來,其實開發集和測試集的大小 怎麼選擇那些資料的數量 在深度學習的時代也已有所改變 讓我們在下部影片來談談