資料外洩你好
我讀過幾篇關於測試組和訓練組之間資料外洩的文章。 避免洩漏的常見建議:
1 在進行任何歸一化、標準化和缺失值插補之前,將資料庫拆分為訓練集和測試集
2 在時間序列的情況下避免隨機分割。 確定一個時間切割點並用它來分離訓練集和測試集。
有什麼意見、建議、有用的讀物嗎?
菲利斯
資料混合與清理回覆:資料外洩你好@FR60 ,
不幸的是,我無法確認 JMP 是否針對每個平台或在每種情況下都這樣做。
我確實知道,在 JMP 的幾個建模平台中,當您獲得估算報告時,通常會有一個用於按比例估算的報告。 您也可以在 Fit Y by X 平台中看到這一點。 在那裡,如果您將一條線、多項式或任何函數擬合到數據,JMP 會傳回以擬合函數為中心的公式。 因此,如果擬合為y=a*x+b*x^2 +c,則JMP 傳回的函數實際上是y=a*(x-x0)+b*(x-x1)^2+c,其中x0 x1 和 x1 是常數。 除非您明確告訴它不要這樣做,否則它會執行此操作。
我的理解是 JMP 這樣做是因為將資料居中時對 a、b 和 c 的估計比不居中時更準確。 如果 JMP 對每個平台都這樣做,我不會感到驚訝,但我不知道。 它們在產生 DOE 時對所有資料進行編碼,因此即使您輸入實際值,在程式後端,它也會使用 -1、0、1 等編碼值來表示 DOE 中的低、中、高設定。 它實際上並不使用您可能輸入的真實數字。
為了獲得有關該主題的完整確認,我會直接寫信給 JMP 工作人員,或與支援您所在區域的系統工程師交談。 最好知道這是否是平台相關的事情,或者是透過 JMP 全面完成的。
謝謝!,
DS
回覆:資料外洩嗨戴德里奇
非常感謝您的評論。
關於訓練測試洩漏,幾個部落格中報告的建議是在進行任何資料預處理之前分割資料。 例如,如果我們想要標準化 0 到 1 之間的所有預測變量,我們應該在分割資料之前,然後僅使用訓練資料計算最小值/最大值,然後也使用這些值標準化驗證和測試資料。 其他類似類型的資料管理(例如 z 標準化或缺失值插補)也是如此。 當然,如果使用交叉驗證,則需要按照上述相同的方法來實施更複雜的計算。
現在讓我們進入問題。 您在郵件中寫道:
」我現在明白為什麼在分割後標準化/標準化資料可能很重要,這是有道理的。 據我了解,JMP 通常會在計算過程中在幕後執行此操作,然後在將其製成報告時重新調整比例」
這意味著使用 JMP 我們不需要擔心訓練測試洩漏,因為 jmp 演算法內部避免了這種情況?
如果是這樣,這對我來說太好了。
請問您能確認一下嗎?
謝謝菲利斯
回覆:資料外洩你好@FR60 ,
我可以看出在這方面可能存在一些混亂。 您提到的分裂和洩漏有兩種,就像您在 Kaggle 引用這篇文章時一樣,而且@dale_lehman對此也發表了評論。
一種劃分是確保用於訓練模型的資料不包括僅在結果中已知的資料。 這就是 Kaggle 所說的「目標洩漏」。 另一個是“訓練測試污染”,您要確保測試資料不會進入訓練或驗證集。 第二個是我更常提到的——我的資料集通常不包含預測變數之後已知的列,因此「目標洩漏」對我來說並不常見,而「訓練測試」污染」是。
對於 JMP,也許更容易將資料拆分視為按行拆分 ==「訓練測試污染」與按列拆分 ==「目標洩漏」。 根據您的資料結構,您可能只執行其中一項操作或同時執行兩項操作。
我現在明白為什麼在分割後標準化/標準化資料可能很重要,這是有道理的。 據我了解,無論如何,JMP 通常都會在計算過程中在幕後執行此操作,然後在將其製成報告時重新調整比例。
回到你原來的帖子,我想這取決於你的數據需要如何分割以及它的結構如何——它是垂直時間結構還是水平結構。 這可能決定您是否對時間資料進行按行或按列分割。 但是,我會應用類似的邏輯來決定何時剪切時間序列。 如果某個時間點結果可能會作為預測變數輸入到模型中,那麼您肯定需要在此之前進行削減。 我不確定您如何以正確的方式解決“火車測試污染”問題。 如果您嘗試進行預測或時間序列分析,JMP 實際上可以很好地使用所有資料。 您可以根據歷史時間資料決定向前預測多少週期,並且輸出具有置信區間等。
很好的討論!,
DS
回覆:資料外洩另一篇關於資料預處理期間資料外洩的文章。
https://machinelearningmastery.com/data-preparation-without-data-leakage/
回覆:資料外洩我發現 Kaggle 中的這個教學非常有趣。
再次強調,在將資料分割到訓練和測試集中之前,避免對資料應用任何標準化和缺失值插補。
https://www.kaggle.com/alexisbcook/data-leakage
再見菲利斯
回覆:資料外洩你好@FR60 ,
針對您提出的具體問題,我的看法是:
1.如果要標準化和/或規範化數據,我認為最好在拆分資料集之前進行。 至於缺失值插補,您需要小心。 有時缺失的資料可以提供信息,有時卻不能。 此外,JMP 估算值的方式可能不適合您的特定資料。 它可能會錯誤地估算缺失的數據,並在數據中引入人為行為,從而錯誤地影響模型。
2. 對於時間序列,如果您確實使用時間序列來及時預測和預測未來事件,我認為您不會拆分資料集 - 至少不會使用 JMP 中的時間序列平台,他們在這些平台中沒有驗證列。 但是,如果您想要一個獨立的資料集來比較不同的預測模型,看看哪一個最適合未來未使用的數據,那麼是的,我會在某個時刻分割資料集,並使用它來產生預測模型並保存將這些公式新增到資料表中,看看它們預測未使用資料的效果如何。 您可以使用簡單的 Fit Y by X 並查看 R^2 值來查看哪個模型預測結果最好,或者查看實際資料和建模資料之間的殘差以查看哪個殘差總和最小或類似的東西。
不過,總的來說,我所做的是將資料表以 80/20 分成訓練資料集和測試資料集。 然後,我將測試資料分離到一個完全不同的資料表中,以便我建立的模型沒有機會使用測試資料。 這不僅是簡單地「隱藏」和「排除」數據,還消除了演算法意外使用測試數據的任何可能性。 使用「訓練」集資料表,然後我要么創建一個驗證列,要么只使用平台的驗證部分選項,再次將其按 80/20 分成訓練/驗證,以減少過度擬合。 在使用不同平台產生多個不同模型後,我使用測試資料集來查看哪個模型最能預測未使用/未見過的資料。
希望這可以幫助,
DS
回覆:資料外洩您連結到的文章對資料外洩非常困惑。它混合了訓練和驗證/測試資料(過度擬合)的差異性能的概念,以及訓練和測試資料之間缺乏明確的界限(這是考慮洩漏的一種方式)。我認為這兩個概念是不同的。當您的模型適合訓練資料而不是測試資料時,這就是過度擬合的一個例子。洩漏不能解釋這一點 - 事實上,如果有洩漏,它也會出現在訓練資料中。此外,如果測試資料是隨機選擇的,那麼無論何時訓練資料出現在測試資料中,洩漏都應該發生在訓練資料中(反之亦然)。它是由於數據中具有用於預測響應的資訊特徵而產生的,但在進行預測時無法知道這些特徵。
時間序列資料的情況則不太清楚,因為測試資料不是整個資料集的隨機選擇(可能是隨機時間)時期)。大多數時間序列模型將使用過去的數據來預測未來 - 如果您使用較晚的數據來預測較早的數據,則會出現洩漏。過度擬合將使用一個時間段來預測用於建立模型的時間段的子集 - 即,不將時間段分開。即使在時間序列模型中避免了過度擬合和洩漏,也可以假設用於建立模型的時間段與您嘗試預測的時間段足夠相似。如果週期不相似(例如,如果力的變化使模型不再相關),那麼我會說模型不是很好,但我不會稱之為洩漏,也可能不會稱之為過度擬合。
回覆:資料外洩親愛的@dale_lehman ,是的,你是對的,我混合了它,至少在形式上,因為我考慮了總體目標,即擁有一個良好且強大的模型。 避免洩漏被定義為一個目標,而不是在測試集中已經看到的資料。 我在這裡找到了一些額外的解釋:
機器學習中的資料外洩。 如何預防減少…的問題作者:德文·索尼 :crown: |走向數據科學
但是,當我們通常隨機劃分訓練集和測試集時,如何有意地做到這一點? 我更認為在流程模型類別中,訓練和測試集都來自同一個流程。 當考慮預測時,情況可能會有所不同。
回覆:資料外洩我想知道我們是否混淆了兩件事:洩漏和過度擬合。我認為他們是非常不同的。過度擬合始終是預測建模的潛在問題,防止它的常見方法是進行驗證,如果有足夠的數據,還需要一個單獨的測試數據集。根據我的經驗,使用 JMP 時,過度擬合問題比其他情況要小,因為許多其他調整參數也有助於防止過度擬合。例如,對於決策樹,設定相對較高的最小分割大小將有助於避免過度擬合。儘管如此,使用單獨的測試數據來評估您的模型是否能夠對新數據產生現實的預測仍然是一個好主意。我認為這對於時間序列資料尤其重要。
在我看來,洩漏是一個完全不同的問題。洩漏是錯誤指定的模型。您使用的因素只有在您嘗試預測的同時才知道。例如,如果您嘗試預測客戶保留率,而您的因素之一是今年的購買量,那麼您將僅擁有保留客戶的數據,而不會保留未保留客戶的數據。在這種情況下,今年的購買因素將完美地預測客戶保留率,但這不是一個有用的模型。我認為這就是洩漏。
我不認為透過使用不同的訓練/驗證/測試資料集可以防止或檢測洩漏。您可能會偵測到這 3 個中任何一個的洩漏:訓練資料上的完美模型(或接近完美的模型)足以懷疑可能存在洩漏。我認為預防洩漏的最佳方法是仔細考慮這些因素並了解如何以及何時測量它們。如果一個模型看起來好得令人難以置信,那麼它可能是由於洩漏(或者,它可能只是一個非常好的模型)。但我不認為這是任何技術手段都能回答的問題。
我很想聽聽其他人對此有何看法。
回覆:資料外洩這是我有限的經驗。
建模相當複雜(正確的模型選擇、資料準備、資料分割、元資料調整...)。
一個好的機器人模型獨立於分割、元資料、模型類型...
訓練集和測試集都需要具有代表性,但測試集不需要那麼全面。 需要進行訓練/測試來判斷結果,因為@ih已經提到了。
對於分割,可以使用 stratify 選項來控制分割。 但對於建模和分割,您需要流程知道如何最好地做到這一點。
對於複雜的模型,當結果至關重要時,我嘗試測試不同的模型、不同的元資料和不同的驗證列。 當沒有重大差異時,就沒有問題。 這在 JMP (Pro) 中很容易完成。
最後只有這個測驗才能給你答案,是否不漏水。 但老實說,當我確信有一個好的模型時,我不介意洩漏。
回覆:資料外洩我的2分錢:
如果您有時間序列數據,我傾向於認為您的第 2 項是更大的問題,除非您進行大量插值。考慮資料中的雜訊來源,如果其中任何一個出現在多行上,或者行以某種方式連結到之前和之後的行(隨著時間的推移監控水箱液位,當水箱需要超過 1 行才能到達例如,一個新的穩定狀態),那麼您就不能按行分割資料並期望驗證或測試集獨立於訓練。
相反,您可能會考慮將資料拆分為更大的區塊進行測試和驗證,例如:
- 確定流程發生一些「重大」變化的新時期,並將穩態運行的持續時間保持在同一組中(更難但更好),或者
- 使用足夠長的時間段,使您確信它們代表不同的運行條件,但又足夠短,使它們不包含超過1 個運行條件,並將該時間段中的所有行保留在同一驗證組中(更容易,但仍可能面臨相同的風險) )
- 使用上面確定的周期,將每個運行匯總到一行中,可能使用變數的平均值或標準差,或其他功能資料瀏覽器。 (最好的)
無論哪種情況,您都可以考慮排除組之間的過渡期。
我的個人經驗:自從開始使用至少其中一種方法以來,驗證和測試組統計數據代表了對模型預測能力更合理的期望。