【資料分析】什麼是數據洩漏? 新手常犯的錯誤以及該如何正確分析資料

更新於 發佈於 閱讀時間約 10 分鐘
raw-image

數據洩漏(Data Leakage)在數據分析和機器學習領域,是指在構建模型的過程中,不恰當地使用了不應該獲取的數據,導致模型在訓練時看似表現良好,但在實際應用中效果卻大打折扣。

數據洩漏會讓模型「提前知道」測試集或未來的資訊,這會導致:

  • 過度擬合:模型過於適應訓練數據,無法泛化到新數據。
  • 性能評估偏差:在評估模型時,得到過於樂觀的結果,誤導決策。

數據洩漏是模型開發中的一個關鍵問題,可能在不經意間影響模型的性能和可靠性。通過嚴格的數據處理流程和對特徵的深入理解,可以有效地避免數據洩漏,建立更為健全和可靠的模型。


# 可使用目錄功能快速確認要閱覽的主題


常見的數據洩漏形式

1.特徵洩漏(Feature Leakage)

  • 描述:特徵變量中包含了目標變量的資訊。
  • 例子:在預測患者是否患有某種疾病時,使用了與該疾病診斷結果直接相關的檢測指標作為特徵。


2.訓練/測試集混淆:

  • 描述:在預處理或特徵選擇時,同時使用了訓練集和測試集的數據。
  • 例子:在對數據進行標準化時,用整個數據集的平均值和標準差,而不是僅用訓練集的。


3.時間序列數據中的洩漏:

  • 描述:在預測未來事件時,使用了未來才會知道的數據。
  • 例子:在股票價格預測中,使用了未來日期的交易量作為特徵。

常見的數據洩漏範例

1.在整個數據集上進行標準化或縮放


錯誤示範

在進行特徵縮放(如標準化、正規化)時,直接對整個數據集進行處理,包括訓練集和測試集。


from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd

# 假設有一個數據集 df
X = df.drop('target', axis=1)
y = df['target']

# 錯誤:先縮放,後分割
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)


問題分析

數據洩漏發生點:標準化時使用了整個數據集的平均值和標準差,包含了測試集的信息。

影響:模型在訓練時已經「見過」測試集的數據分佈,導致評估結果過於樂觀。


正確做法

應該先分割數據,再只對訓練集進行縮放,然後將相同的縮放應用於測試集。

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 只用訓練集來擬合縮放器
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)

# 使用同一個縮放器轉換測試集
X_test_scaled = scaler.transform(X_test)


2.在交叉驗證中錯誤地進行數據預處理


錯誤示範

在交叉驗證之前對整個數據集進行特徵選擇或特徵縮放。

from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 縮放整個數據集
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 建立模型
model = LogisticRegression()

# 進行交叉驗證
scores = cross_val_score(model, X_scaled, y, cv=5)


問題分析

  • 數據洩漏發生點:在交叉驗證的每個fold中,測試集都已經被用來進行縮放。
  • 影響:模型評估結果不準確,無法反映模型的真正性能。


正確做法

使用 Pipeline和cross_val_score,確保在每個fold中,數據預處理只基於訓練集。

from sklearn.pipeline import make_pipeline

# 建立包含縮放和模型的管道
pipeline = make_pipeline(StandardScaler(), LogisticRegression())

# 進行交叉驗證
scores = cross_val_score(pipeline, X, y, cv=5)


3.使用未來資訊作為特徵


錯誤示範

在時間序列預測中,使用了未來才會知道的數據作為特徵。

# 假設我們有一個時間序列數據集 data
data['future_feature'] = data['target'].shift(-1) # 使用了未來的目標值

# 刪除含有NaN的行
data = data.dropna()

X = data.drop('target', axis=1)
y = data['target']

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False)


問題分析

  • 數據洩漏發生點:使用了未來的目標值作為當前的特徵。
  • 影響:模型性能被高估,因為在實際應用中無法獲取未來資訊。


正確做法

只能使用當前或過去的數據作為特徵,不能使用未來資訊。

# 正確地創建滯後特徵
data['lag_feature'] = data['target'].shift(1) # 使用前一期的目標值作為特徵

# 刪除含有NaN的行
data = data.dropna()

X = data.drop('target', axis=1)
y = data['target']

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False)


4.在整個數據集上進行特徵選擇


錯誤示範

在進行特徵選擇時,使用了整個數據集,包含了測試集的信息。

from sklearn.feature_selection import SelectKBest, f_classif

# 特徵選擇
selector = SelectKBest(score_func=f_classif, k=5)
X_new = selector.fit_transform(X, y)

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.2)


問題分析

  • 數據洩漏發生點:特徵選擇時使用了整個數據集,導致選擇的特徵受到測試集的影響。
  • 影響:模型對測試集的性能被高估,泛化能力不足。


正確做法

應該在訓練集上進行特徵選擇,然後將選擇的特徵應用到測試集。

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 在訓練集上進行特徵選擇
selector = SelectKBest(score_func=f_classif, k=5)
X_train_new = selector.fit_transform(X_train, y_train)

# 在測試集上應用相同的特徵選擇
X_test_new = selector.transform(X_test)


5. 資料增強時洩漏測試集信息


錯誤示範

在資料增強或合成時,使用了測試集的信息。

問題分析

數據洩漏發生點:在增強數據時使用了測試集,導致模型提前見過測試數據。

影響:模型評估結果不可信,無法真實反映性能。


正確做法

只在訓練集上進行資料增強。

# 在訓練集上進行SMOTE增強
smote = SMOTE()
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)

# 測試集保持不變

如何避免數據洩漏


1. 嚴格劃分數據集

在任何數據處理之前,先將數據劃分為訓練集、驗證集和測試集。

2. 僅對訓練集進行預處理

所有的數據轉換(如標準化、特徵選擇)都應該基於訓練集,然後將同樣的轉換應用到驗證集和測試集。

3. 深入理解特徵

仔細審查每個特徵,確保它們不包含目標變量的未來資訊。

4. 使用交叉驗證

採用交叉驗證技術,可以更可靠地評估模型性能,減少洩漏風險。

5. 避免未來資訊

特別是在時間序列數據中,只能使用當前或過去的資訊。

6. 設定嚴格的流程管控

在團隊協作中,制定明確的數據處理和模型構建流程,防止無意間的數據洩漏。

留言
avatar-img
留言分享你的想法!
avatar-img
JayRay 的沙龍
11會員
23內容數
JayRay 的沙龍的其他內容
2025/01/21
本文章提供深度學習(Deep Learning)、深度神經網絡(DNN)、卷積神經網絡(CNN)和遞歸神經網絡(RNN)的簡介,並包含它們的定義、應用場景、基本結構、工作原理、優缺點和Python範例。
Thumbnail
2025/01/21
本文章提供深度學習(Deep Learning)、深度神經網絡(DNN)、卷積神經網絡(CNN)和遞歸神經網絡(RNN)的簡介,並包含它們的定義、應用場景、基本結構、工作原理、優缺點和Python範例。
Thumbnail
2025/01/05
本篇文章提供描述性統計的完整指南,涵蓋集中趨勢、離散趨勢和數據分佈等重要概念,並附上豐富的實務應用案例與 Python 資料視覺化參考連結,協助讀者快速瞭解數據分析的基礎知識。
Thumbnail
2025/01/05
本篇文章提供描述性統計的完整指南,涵蓋集中趨勢、離散趨勢和數據分佈等重要概念,並附上豐富的實務應用案例與 Python 資料視覺化參考連結,協助讀者快速瞭解數據分析的基礎知識。
Thumbnail
2024/12/25
Naive Bayes是一種基於貝葉斯定理的機器學習分類演算法,適用於文本分類、垃圾郵件檢測及情感分析等任務。雖然假設特徵之間相互獨立,這在現實中不常成立,但其高效計算與穩定性使得在小數據集及高維度特徵空間中表現良好。
Thumbnail
2024/12/25
Naive Bayes是一種基於貝葉斯定理的機器學習分類演算法,適用於文本分類、垃圾郵件檢測及情感分析等任務。雖然假設特徵之間相互獨立,這在現實中不常成立,但其高效計算與穩定性使得在小數據集及高維度特徵空間中表現良好。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
研究指出,若在每次迭代中缺乏足量且新鮮的真實資料,生成模型的品質與多樣性都會逐漸退化,最終將陷入所謂的模型自嗜的狀態。
Thumbnail
研究指出,若在每次迭代中缺乏足量且新鮮的真實資料,生成模型的品質與多樣性都會逐漸退化,最終將陷入所謂的模型自嗜的狀態。
Thumbnail
數據洩漏是在機器學習和數據分析中,因不當使用資料而造成的模型性能評估錯誤。這篇文章探討數據洩漏的常見形式及其對模型可靠性的影響,並提供防範措施,如嚴格劃分數據集、僅對訓練集進行預處理和使用交叉驗證。瞭解這些概念有助於構建更穩健的數據驅動模型。
Thumbnail
數據洩漏是在機器學習和數據分析中,因不當使用資料而造成的模型性能評估錯誤。這篇文章探討數據洩漏的常見形式及其對模型可靠性的影響,並提供防範措施,如嚴格劃分數據集、僅對訓練集進行預處理和使用交叉驗證。瞭解這些概念有助於構建更穩健的數據驅動模型。
Thumbnail
當我們在訓練各種模型時, 難免會有許多實驗性的參數、產出的模型、不同的資料來源, 隨著版本迭代越來越多, 過了一段時間回頭看之後卻發現當初最好的某一個實驗參數到底是啥啊? 模型去了哪裡? 用的數據集是哪些? 我想上述這些問題都是模型訓練的過程難免會遇到的問題, 除非我們有一套管理的SOP, 比
Thumbnail
當我們在訓練各種模型時, 難免會有許多實驗性的參數、產出的模型、不同的資料來源, 隨著版本迭代越來越多, 過了一段時間回頭看之後卻發現當初最好的某一個實驗參數到底是啥啊? 模型去了哪裡? 用的數據集是哪些? 我想上述這些問題都是模型訓練的過程難免會遇到的問題, 除非我們有一套管理的SOP, 比
Thumbnail
虛擬變數陷阱(Dummy Variable Trap)是指在進行One-Hot Encoding時,生成的虛擬變數之間存在完全多重共線性,影響回歸模型的準確性。透過具體的例子,本文探討瞭如何避免這個陷阱,以提升機器學習模型的效果與穩定性。
Thumbnail
虛擬變數陷阱(Dummy Variable Trap)是指在進行One-Hot Encoding時,生成的虛擬變數之間存在完全多重共線性,影響回歸模型的準確性。透過具體的例子,本文探討瞭如何避免這個陷阱,以提升機器學習模型的效果與穩定性。
Thumbnail
隨著生成式AI的興起,AI幻覺的問題日漸受到重視。AI幻覺指的是AI生成內容中的虛構與現實重疊現象,造成錯誤資訊的擴散。造成這一現象的原因包括訓練數據不足、模型缺失及惡意資訊注入。
Thumbnail
隨著生成式AI的興起,AI幻覺的問題日漸受到重視。AI幻覺指的是AI生成內容中的虛構與現實重疊現象,造成錯誤資訊的擴散。造成這一現象的原因包括訓練數據不足、模型缺失及惡意資訊注入。
Thumbnail
*本文章為參考李弘毅2021年機器學習課程後的筆記。 在訓練模型的時候,常常會遇到訓練上的問題,像是Loss值太大,或是Test出來的結果不如預期,但我們又不知道模型中到底發生了甚麼事,就跟黑盒子一樣。 因此,感謝李弘毅教授傳授了一套SOP來幫助我們判斷模型是哪裡出了問題,應該要怎麼解決!!
Thumbnail
*本文章為參考李弘毅2021年機器學習課程後的筆記。 在訓練模型的時候,常常會遇到訓練上的問題,像是Loss值太大,或是Test出來的結果不如預期,但我們又不知道模型中到底發生了甚麼事,就跟黑盒子一樣。 因此,感謝李弘毅教授傳授了一套SOP來幫助我們判斷模型是哪裡出了問題,應該要怎麼解決!!
Thumbnail
班傑明.迪斯雷利:「世界上有三種謊言:謊言、該死的謊言,和統計數字。」 由於我們未知的東西可能至關重大,踏錯一步很可能導致理解不當或預測錯誤,對我們的健康、財產和福祉造成嚴重的後果。我們有理由對資料科學感到興奮,但必須抱持謹慎。唯一的解決之道就是瞭解風險,時時警覺。
Thumbnail
班傑明.迪斯雷利:「世界上有三種謊言:謊言、該死的謊言,和統計數字。」 由於我們未知的東西可能至關重大,踏錯一步很可能導致理解不當或預測錯誤,對我們的健康、財產和福祉造成嚴重的後果。我們有理由對資料科學感到興奮,但必須抱持謹慎。唯一的解決之道就是瞭解風險,時時警覺。
Thumbnail
嗨! 各位學員大家好,歡迎來到「🔒 Python實戰營 - Data Science 必修班」,為什麼會設計成必修班呢? 我們都知道AI的趨勢已經勢在必行,前往AI的道路上最基礎的就是資料處理、資料科學,AI模型訓練的過程中最忌諱的就是垃圾進、垃圾出,這不僅在AI模型適用,包括我們傳統的軟體開發
Thumbnail
嗨! 各位學員大家好,歡迎來到「🔒 Python實戰營 - Data Science 必修班」,為什麼會設計成必修班呢? 我們都知道AI的趨勢已經勢在必行,前往AI的道路上最基礎的就是資料處理、資料科學,AI模型訓練的過程中最忌諱的就是垃圾進、垃圾出,這不僅在AI模型適用,包括我們傳統的軟體開發
Thumbnail
模型上線前的評估的嚴謹與否,攸關上線後模型的表現。你知道模型評估需要注意哪些細節?在評估過程的嚴謹性又可以如何分級呢?一起來看看吧!
Thumbnail
模型上線前的評估的嚴謹與否,攸關上線後模型的表現。你知道模型評估需要注意哪些細節?在評估過程的嚴謹性又可以如何分級呢?一起來看看吧!
Thumbnail
小心「誘導統計數據」的陷阱。問題不在於指標本身,而在於過度執著於指標——也就是過度評估和不適當的評估方式。
Thumbnail
小心「誘導統計數據」的陷阱。問題不在於指標本身,而在於過度執著於指標——也就是過度評估和不適當的評估方式。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News