資料外洩你好
我已經閱讀了幾篇關於測試和培訓小組之間數據洩漏的文章。 避免洩漏的常見建議:
1在進行任何標準化,標準化和缺失值估算之前,將數據庫分為訓練和測試集
2在時間序列的情況下,避免隨機分裂。 確定一個切入點,並用它來分離訓練和測試集。
有什麼意見,建議,有用的讀物嗎?
菲利斯
分析工具回复:數據洩漏我的2美分:
如果您有時間序列數據,我傾向於認為項目2是更大的問題,除非您進行大量插值。請考慮數據中的噪聲源,如果其中的任何噪聲發生在多行中,或者行是否以某種方式鏈接到前後的行(監視儲罐的液位隨時間變化,則儲罐需要花費多於一排的噪音) (例如一個新的穩定狀態),則您不能按行拆分數據,並且期望驗證或測試集獨立於訓練。
相反,您可以考慮將數據分成更大的塊進行測試和驗證,例如:
- 識別過程進行一些“重大”變化的新時期,並將穩態運行的持續時間保持在同一組中(更難但更好),或者
- 使用足夠長的時間段,以確保它們代表不同的運行條件,但足夠短的時間段,以使其不包含超過1個運行條件,並將該時間段中的所有行都保留在同一驗證組中(更容易,可能仍然面臨相同的風險)
- 使用上面確定的時間段,可以使用變量的平均值或標準差或其他函數的數據瀏覽器,將每個運行匯總為一行。 (最好)
無論哪種情況,您都可以考慮排除組之間的過渡期。
我的個人經驗:自從開始使用這些方法中的至少一種以來,驗證和測試組統計數據代表了對模型預測能力的更合理的期望。
回复:數據洩漏這是我的有限經驗。
建模非常複雜(正確的模型選擇,數據準備,數據拆分,元數據調整...)。
一個好的,穩健的模型獨立於拆分,元數據,模型類型...
培訓和測試集都需要代表該過程,但是測試集並不需要那麼全面。 培訓/測試是判斷結果的必要條件,因為@ih已經提到過。
對於拆分,可使用stratify選項控制拆分。 但是對於建模和拆分,您都需要流程知道如何做到最好。
對於復雜的模型,當結果至關重要時,我嘗試測試不同的模型,不同的元數據和不同的驗證列。 如果沒有重大差異,就沒有問題。 這在JMP(Pro)中非常容易完成。
最後,只有該測試為您提供答案,是否沒有洩漏。 但老實說,當我可以肯定有一個好的模型時,我不會介意洩漏。
回复:數據洩漏我想知道我們是否混淆了兩件事:洩漏和過度擬合。我認為它們是完全不同的。過度擬合始終是預測建模的潛在問題,防止這種情況的通常方法是進行驗證,並且,如果您有足夠的數據,則還需要單獨的測試數據集。根據我的經驗,與其他情況相比,JMP過度擬合的問題更少,因為許多其他調整參數也有助於防止這種情況。例如,對於決策樹,設置相對較高的最小拆分大小將有助於避免過度擬合。最好有單獨的測試數據來評估您的模型是否能夠對新數據產生現實的預測。我認為這對於時間序列數據尤為重要。
我認為洩漏是完全不同的問題。洩漏是一個錯誤指定的模型。您使用的因素只能與您嘗試預測的時間同時知道。例如,如果您要預測客戶保留率,並且其中一個因素是今年的購買量,那麼您將僅擁有保留客戶的數據,而那些沒有保留客戶的數據將丟失。在這種情況下,今年採購量的因素將完全預測客戶保留率,但這不是一個有用的模型。我認為這就是洩漏。
我不認為通過具有不同的訓練/驗證/測試數據集可以防止或檢測到洩漏。您可以通過以下三種方法中的任何一種來檢測洩漏:在訓練數據上建立一個完美的模型(或幾乎是這樣)就足以懷疑可能存在洩漏。我認為最好的預防洩漏方法是仔細考慮因素並了解如何以及何時進行測量。如果一個模型看起來太好而不能成立,那可能是由於洩漏(或者,它可能只是一個很好的模型)。但是我認為這不是任何技術手段都能回答的問題。
我很想听聽其他人對此有何評論。
回复:數據洩漏親愛的@dale_lehman ,是的,您是對的,至少在我考慮總體目標時,我至少正式地將其混合在一起,以建立一個良好而強大的模型。 避免洩漏的目的是為了避免在測試集中看到數據。 我在這裡找到了一些其他解釋:
機器學習中的數據洩漏。 如何防止減少...的問題?通過德文·索尼(Devin Soni):crown:|走向數據科學
但是,當我們通常隨機劃分訓練和測試集時,該如何有意地做到這一點? 我還認為,在過程模型類別中,訓練和測試集都來自同一過程。 考慮預測時,可能會有所不同。
回复:數據洩漏您鏈接到的文章對數據洩漏非常困惑。它混淆了訓練和驗證/測試數據上的差異性能(過擬合)的想法,而訓練和測試數據之間沒有明確的界限(這是考慮洩漏的一種方法)。我相信,這兩個概念是截然不同的。當模型適合訓練數據而不適合測試數據時,這就是過度擬合的一個示例。洩漏不會解決這個問題-實際上,如果存在洩漏,它也會出現在培訓數據中。此外,如果測試數據是隨機選擇的,則只要在測試數據中存在洩漏,訓練數據中就會發生洩漏(反之亦然)。這是由於數據中具有用於預測響應的信息特徵而導致的,但是在進行預測時尚不知道。
時間序列數據的含義不太清楚,因為測試數據不是整個數據集的隨機選擇(可能是隨機時間時期)。大多數時間序列模型都將使用過去的數據來預測未來-如果您使用以後的數據來預測以前的數據,則會發生洩漏。過度擬合將使用時間段來預測用於構建模型的時間段的子集,即不將時間段分開。即使在時間序列模型中避免了過擬合和洩漏,也可以假設用於構建模型的時間段與您要預測的時間段非常相似。如果週期不相似(例如,如果力的變化使模型不再適用),那麼我會說模型不是很好,但是我不會稱之為洩漏,也可能不會稱之為過度擬合。
回复:數據洩漏你好@ FR60 ,
我對您提出的具體觀點的看法:
1.如果要標準化和/或規範化數據,我認為在拆分數據集之前最好這樣做。 至於缺失值的估算,您需要注意這一點。 有時丟失的數據可以提供信息,而有時則沒有。 同樣,JMP推算值的方式可能不適用於您的特定數據。 它可能會錯誤地估算缺失的數據,並在數據中引入人為的行為,從而會錯誤地影響模型。
2.對於時間序列,如果您確實使用時間序列來預測和預測將來的事件,那麼我認為您不會拆分數據集-至少不是在JMP中使用時間序列平台,它們在那些平台上沒有“驗證”列。 但是,如果您想要一個獨立的數據集來比較不同的預測模型,以查看哪個模型最適合將來的未使用數據,那麼是的,我會在某個時候拆分數據集,並使用它來生成預測模型並保存將這些公式添加到數據表中,並查看它們如何很好地預測未使用的數據。 您可以使用簡單的Fit Y by X並查看R ^ 2值,以查看哪個模型最能預測結果,或者查看實際數據與建模數據之間的殘差,以查看殘差之和最小或類似的值。 。
不過,總的來說,我要做的是將數據表80/20分為訓練和測試數據集。 然後,我將測試數據分離到一個完全不同的數據表中,以使我建立的模型沒有機會使用測試數據。 這不僅僅是簡單地“隱藏”和“排除”數據,而且消除了算法意外使用測試數據的任何可能性。 然後,使用“培訓”設置數據表,創建驗證列或僅使用平台的驗證部分選項,然後將其80/20再次分為訓練/驗證,以減少過度擬合。 在使用不同平台生成多個不同模型之後,我將使用測試數據集來查看哪個模型最能預測未使用/看不見的數據。
希望這可以幫助,
DS
回复:數據洩漏我發現Kaggle中的本教程非常有趣。
再次強調避免在對數據進行訓練和測試集拆分之前對數據應用任何歸一化和缺失值插補。
https://www.kaggle.com/alexisbcook/data-leakage
喬·菲利斯