Andrew Ng 的團隊曾在一篇研究論文中犯了一個大錯誤。 這是因為隨機拆分數據所導致的。 以下是發生的具體情況(以及解決方案):
通常會使用隨機拆分來生成訓練集和驗證集。 然而,在許多情況下,這對模型構建來說可能是致命的。 考慮構建一個為圖像生成標題的模型。 由於語言的固有特性,每張圖像可以有許多不同的標題。 - 圖像-1 → 標題-1、標題-2、標題-3 等等。 - 圖像-2 → 標題-1、標題-2、標題-3 等等。 查看這個 👇
如果我們使用隨機拆分,則相同的數據點(圖像)將在訓練集和驗證集中可用。 因此,我們最終在模型訓練過的實例上進行評估。 這是一個數據洩漏的例子(也稱為組洩漏),導致過擬合!
在 Andrew Ng 的論文中也發生了同樣的事情,他們準備了一個醫療數據集來檢測肺炎。 - 總圖像數 = 112k - 總患者數 = 30k 由於隨機拆分,同一位患者的圖像在訓練集和驗證集中都可用。 這導致了數據洩漏,驗證分數看起來比實際應該的要好得多。 這是他們的初始論文👇
群組隨機分割解決了這個問題。 有兩個步驟: 1) 將所有與一張圖片對應的訓練實例分組。 2) 分組後,整個群組(該圖片的所有範例)必須隨機分配到訓練集或驗證集中。 這將防止群組洩漏。
如果你使用 Sklearn,GroupShuffleSplit 實現了這個想法。 作為一個例子,考慮我們有以下數據集: - x1 和 x2 是特徵。 - y 是目標變量。 - group 表示分組標準。 查看這個 👇
首先,我們從sklearn導入GroupShuffleSplit並實例化該對象。 接下來,這個對象的split()方法讓我們執行分組拆分。它返回一個生成器,我們可以解包它以獲得以下輸出: - 組“A”和“C”中的數據點一起在訓練集裡。 - 組“B”中的數據點一起在驗證/測試集中。 查看這個 👇
幾天後,Andrew Ng 的團隊在使用相同的群組隨機分配策略後更新了論文,以確保相同的病人不會同時出現在訓練集和驗證集中。 👉 請問你之前遇到過這個問題嗎?
11.83K