資料集:分割原始資料集

所有優質的軟體工程專案都會投入大量精力測試應用程式。同樣地,我們強烈建議您測試 ML 模型,以便判斷預測結果是否正確。

訓練集、驗證集和測試集

您應針對不同的範例集合測試模型,而非用於訓練模型的範例集合。如您稍後所學,與其測試相同的示例,不如測試不同的示例,這樣更能證明模型的適合度。您從哪裡取得這些不同的範例?在傳統的機器學習中,您必須透過分割原始資料集,才能取得這些不同的示例。因此,您可能會假設應將原始資料集分成兩個子集:

圖 8:水平條分為兩部分:約 80% 是訓練集,約 20% 是測試集。
圖 8. 並非最佳分配比例。

 

練習:檢查你的直覺

假設您在訓練集上訓練,並在多輪測試集上評估。在每輪訓練中,您會使用測試集結果來決定如何更新超參數和特徵集。您是否發現這個做法有任何錯誤?請只選取一個答案。
多次執行這項程序可能會導致模型隱含地符合測試集的特性。
當然可以!使用相同測試集的次數越多,模型就越有可能與測試集密切配合。就像老師「應試教學」一樣,模型會不經意地將測試集套用到實際資料上,這可能會讓模型更難套用實際資料。
這種做法沒問題。畢竟您是在訓練集上訓練,並在另一個測試集上評估。
其實,這裡有個微妙的問題。想想哪些問題可能會逐漸發生。
這種做法在運算上效率不佳。請勿在每輪測試後變更超參數或功能組合。
雖然頻繁測試的成本高昂,但卻十分重要。不過,比起額外訓練,頻繁測試的費用會低得多。最佳化超參數和功能集可大幅提升模型品質,因此請務必預留時間和運算資源來處理這些問題。

將資料集分成兩個集合是一個不錯的做法,但更好的方法是將資料集分成三個子集。除了訓練集和測試集之外,第三個子集是:

  • 驗證集會在模型訓練期間執行初步測試。
圖 9:水平條分為三部分:70% 為訓練集、15% 為驗證集,以及 15% 為測試集
圖 9. 這樣分割方式會好得多。

使用驗證集來評估訓練集的結果。重複使用驗證集後,如果模型的預測結果良好,請使用測試集再次確認模型。

下圖顯示這個工作流程。在圖表中,「微調模型」是指調整模型的任何內容,包括變更學習率、新增或移除功能,以及從頭設計全新模型。完成這個工作流程後,您會選出在測試集上表現最佳的模型。

圖 10:工作流程圖表,包含下列階段:
            1. 使用訓練集訓練模型。
            2. 在驗證集上評估模型。
            3. 根據驗證集的結果微調模型。
            4. 重複執行 1、2 和 3,最後選出在驗證集上表現最佳的模型。5. 確認測試集的結果。
圖 10. 開發和測試的良好工作流程。

圖 10 所示的工作流程是最佳做法,但即使採用該工作流程,測試集和驗證集仍會因重複使用而「耗損」。也就是說,您使用相同資料來決定超參數設定或其他模型改善項目的次數越多,模型在預測新資料時準確度的信心就會越低。因此,建議您收集更多資料來「重新整理」測試集和驗證集。重新開始是重整的好方法。

練習:檢查你的直覺

您將資料集中的所有範例洗牌,並將洗牌後的範例分為訓練、驗證和測試集。不過,測試集的損失值非常低,因此您懷疑是否有錯誤。可能的問題所在
測試集的許多範例都是訓練集的範例重複。
可以。在包含大量重複範例的資料集中,這可能會造成問題。強烈建議您在測試前刪除測試集合中的重複範例。
訓練和測試並非確定性作業。有時,您的測試損失可能會非常低。重新執行測試,確認結果。
雖然每次執行時的損失確實會略有不同,但差異不應太大,否則您可能會認為自己中了機器學習彩券。
測試集剛好包含模型表現良好的範例。
我們已將範例進行充分洗牌,因此這種情況極不可能發生。

其他測試集問題

如前一個問題所述,重複的範例可能會影響模型評估。將資料集分割為訓練、驗證和測試集後,請刪除驗證集或測試集中與訓練集中的範例重複的任何範例。模型唯一公平的測試方式,就是針對新例進行測試,而非重複項目。

舉例來說,假設有個模型會使用主旨行、電子郵件內容和寄件者的電子郵件地址做為特徵,藉此預測電子郵件是否為垃圾郵件。假設您將資料分割為訓練和測試集,並以 80-20 的比例進行分割。訓練完成後,模型在訓練集和測試集的準確度皆達 99%。您可能會預期測試集的查準率較低,因此您再次查看資料,發現測試集中的許多範例都是訓練集中的範例重複。問題是,您在分割資料前,未從輸入資料庫中清除相同垃圾郵件的重複項目。您不小心使用部分測試資料進行訓練。

總而言之,良好的測試集或驗證集必須符合下列所有條件:

  • 足以產生具統計顯著性的測試結果。
  • 代表資料集的整體。換句話說,請不要選擇與訓練集不同的測試集。
  • 代表模型在業務用途中會遇到的實際資料。
  • 訓練集中沒有重複的範例。

練習:測試您的理解程度

假設有一個包含固定數量範例的單一資料集,以下敘述何者正確?
在測試模型時,每個用於測試的例子都會減少一個用於訓練模型的例子。
將範例分割為訓練/測試/驗證集是零和遊戲。這就是主要的取捨。
測試集中的範例數量必須大於驗證集中的範例數量。
理論上,驗證集和測試集應包含相同或幾乎相同的範例數量。
測試集中的範例數量必須大於驗證集或訓練集中的範例數量。
訓練集中的範例數量通常會多於驗證集或測試集中的範例數量;不過,不同集合之間並未規定百分比要求。
假設您的測試集包含足夠的範例,可執行具統計顯著性的測試。此外,針對測試集進行測試可產生低損失。不過,該模型在實際環境中的表現不佳。此時該如何處理這種狀況?
判斷原始資料集與實際資料的差異。
可以。即使是最佳資料集,也只是真實資料的快照,而底層的真相往往會隨著時間而變動。雖然測試集與訓練集相符,足以顯示模型品質良好,但資料集可能無法充分符合實際資料。您可能需要針對新資料集重新訓練及重新測試。
對同一組測試重新測試。測試結果可能有異常。
雖然重複測試可能會產生略有不同的結果,但這項策略可能幫助不大。
測試集應包含多少個範例?
有足夠的範例可產生具統計顯著性的測試。
可以。有多少個範例?您需要進行實驗。
至少占原始資料集的 15%。
15% 的樣本量不一定足夠。