前言
我們過去探討了數據清理和特徵工程的重要性。然而,擁有乾淨的數據和精心設計的特徵還不是終點。機器學習模型不僅需要在訓練數據上表現良好,還需要能夠在新數據上進行準確預測。為了解決這個問題,我們需要將數據分成不同的部分,分別用於模型的訓練、驗證和測試。這樣做可以幫助我們評估模型的性能,並確保模型在實際應用中具有良好的預測能力。
為什麼要進行數據切分?
在機器學習中,原始數據集通常包含帶有標註的數據。我們使用這些標註數據來訓練模型,使其學會從數據中提取特徵並進行預測。然而,這個過程面臨著幾個關鍵挑戰:
為了應對這些挑戰,數據切分變得非常重要。通常,我們將數據分成三部分:訓練集、驗證集和測試集。這種切分方法有以下幾個關鍵目的:
- 模擬真實場景:保留部分數據作為測試集,使我們能夠模擬模型在面對新數據時的表現。在實際應用中,模型通常只接收到輸入數據,沒有對應的真實結果。數據切分允許我們在模型訓練和評估過程中模擬這一情境,以檢驗模型是否能夠在面對未知數據時做出準確的預測。
- 避免過擬合:使用獨立的驗證集和測試集可以有效地避免過擬合。若僅依賴訓練集進行模型調整,可能會出現模型「記住」訓練數據而非學習到通用模式的情況,就像是在「偷看答案」一樣。這會高估模型在新數據上的預測能力。驗證集和測試集的分離能幫助及時發現並防止這種問題。
- 調整和優化:驗證集的存在使我們能夠在不影響最終測試評估的情況下調整模型的超參數和結構以進行優化。通過在驗證集上的性能評估,我們可以找到最佳的模型配置,從而提升模型的整體效果。
- 公平評估:使用獨立的測試集可以公平地評估模型的實際性能,避免對模型表現產生過於樂觀的估計。我們需要評估模型在只有輸入數據、沒有真實結果可參考的情況下的表現。
總之,當我們拿到數據時,通常會包含真實結果。然而,真實應用中我們需要預測的是未知結果。預測的本質是我們並不知道真實數據,因此我們需要測試在只有輸入數據而沒有輸出數據的情況下,模型是否能夠做出準確的預測。這種數據切分的方法能夠幫助我們更好地訓練模型,評估其性能,並預測其在實際應用中的表現。
數據集的類型:訓練集、驗證集和測試集
訓練集 (Training Set)
訓練集是模型學習的基礎,包含了大部分的數據。模型利用這些數據進行學習,識別輸入特徵和目標變量之間的關係、數據模式和特徵,以便能夠做出預測。這一部分的數據經過清理和特徵工程處理後,能夠為模型提供最完整和詳細的資訊。訓練集的主要目的是讓模型能夠在這些數據上取得良好的表現。通常,訓練集占整體數據集的大部分,例如 60%-80%。
驗證集 (Validation Set)
驗證集在模型訓練過程中扮演了監督和調整的角色。在訓練模型時,我們需要不斷調整模型的超參數和結構,以找到最佳的配置。驗證集提供了一個獨立於訓練集的數據集,用於評估模型的性能並進行參數調整。通過驗證集的評估,我們能夠檢測到過擬合或欠擬合的情況,並相應地做出調整。驗證集通常占整體數據集的 10%-20%。
測試集 (Testing set)
測試集是評估模型最終性能的重要工具。與訓練集和驗證集不同,測試集在整個模型訓練過程中都不會被模型看到。這部分數據僅在訓練完成後使用,用於模擬模型在真實世界中處理全新數據的表現。測試集的結果能夠提供對模型泛化能力的公正評估,確保模型在未見過的數據上能夠維持良好的性能。測試集通常占整體數據集的 10%-20%。
為什麼需要驗證集?
- 避免對測試集的間接過擬合
如果我們只有訓練集和測試集,我們可能會多次使用測試集來評估模型並調整超參數。這樣的反覆調整會使模型逐漸適應測試集的特定模式,導致模型間接地「學習」測試集。這樣一來,測試集的結果會變得過於樂觀,無法真實反映模型在未見過數據上的泛化能力。
- 模型選擇
在模型開發中,通常會嘗試多種不同的模型架構。驗證集允許我們比較這些模型在未見過數據上的性能,從而選擇最適合的模型架構,而不影響測試集的最終評估結果。這種方法確保我們選擇的模型在多種架構中具有最好的泛化性能。
- 模型優化調整
機器學習模型通常依賴超參數來做模型優化,而這些超參數的最佳值需要通過試驗來確定。驗證集提供了一個可靠的基礎來進行這些試驗,使我們能夠在不影響測試集完整性的前提下,針對不同的超參數配置進行調整。這種方法有助於找到最優的超參數組合,從而提升模型的性能。
- 更可靠的模型評估
通過使用驗證集進行中間評估和調整,我們可以確保最終的測試集評估結果是公正且可靠的。這樣的多階段評估機制有助於避免模型性能估計中的偏差,確保模型在真實應用中的穩定性和可靠性。
- 雙重驗證機制
引入驗證集實際上為我們的模型開發過程增加了一層額外的檢驗,在訓練過程中,我們第一層檢驗使用驗證集來調整模型和超參數,確保模型在「新」數據上表現良好。在第二層檢驗,我們使用測試集進行最終評估,確保模型在完全未見過的數據上仍能保持良好性能。
總的來說,驗證集為我們提供了一個安全的實驗室,讓我們可以自由地調整和優化模型,而不會影響到最終的性能評估。這種方法使我們能夠建立更強大、更可靠的機器學習模型,同時提供了一個更嚴格的評估過程,確保模型在實際應用中能夠表現出色。
常見的數據切分方法
數據切分的方法有很多種,根據不同的應用場景和需求,我們可以選擇最合適的方法。以下是幾種常見的數據切分方法:
- 隨機切分 (Random Split):這是最常見的一種數據切分方法,將數據隨機分配到訓練集、驗證集和測試集中。這種方法適用於數據集較為平均且沒有明顯時間或其他順序依賴的情況。隨機切分能夠確保每個數據點都有平等的機會被分配到不同的集合中,從而避免數據集本身的偏差對模型評估造成影響。
- 分層切分 (Stratified Split):在分類問題中,我們使用 stratify 參數希望不同類別的比例在訓練集、驗證集和測試集中保持一致。分層切分能夠根據類別比例進行數據切分,確保每個集合中不同類別的分布與原始數據集一致。這種方法特別適用於類別不平衡的數據集,能夠提高模型在不同類別上的預測性能。
- 時間切分(Time-Based Split):對於時間序列數據或存在時間依賴性的數據集,時間切分是一種更合適的方法。將數據按時間順序進行排序,通常早期的數據作為訓練集,中間的數據作為驗證集,最新的數據作為測試集。這種方法能夠模擬模型在實際應用中處理未來數據的情況,有助於提高模型的泛化能力。
- 交叉驗證 (Cross-Validation):交叉驗證是一種更為複雜但非常有效的數據切分方法。它將數據集分成多個子集,並多次訓練和驗證模型。每次訓練時,使用其中一個子集作為驗證集,其餘子集作為訓練集。交叉驗證能夠充分利用數據,提供更加穩健的模型性能評估。最常見的交叉驗證方法是K折交叉驗證(K-Fold Cross-Validation)。以下是交叉驗證的基本步驟:
1. 數據切分:將整個數據集分成 k 個子集(通常稱為折),每個子集都是一個獨立的驗證集。
2. 模型訓練與驗證:在每次迭代中,選擇其中一個子集作為驗證集,其餘 k−1 個子集作為訓練集。訓練模型後,使用該驗證集來評估模型性能。
3. 重複過程:重複上述過程 k 次,每個子集都會被用作一次驗證集,並且模型會在不同的訓練集上進行訓練。
4. 性能評估:將 k 次評估結果取平均,得到模型的總體性能指標
在這種方法中,數據集被切分成 k 個相等大小的子集,通常 k 值為 5 或 10。這樣可以確保每個數據點都在某次迭代中作為驗證集,並且都在其他迭代中參與訓練。這種方法不僅能夠減少模型評估中的偏差,還能更全面地利用可用數據,從而提升模型的泛化能力。
結論
通過適當的數據切分,我們能夠有效評估模型的性能,避免過擬合,並確保模型在實際應用中的可靠性。接下來,我們將深入研究如何選擇和應用適當的演算法,以進一步提升模型的效果和性能。