2024-11-29|閱讀時間 ‧ 約 0 分鐘

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

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. 設定嚴格的流程管控

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

分享至
成為作者繼續創作的動力吧!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

JayRay 的沙龍 的其他內容

你可能也想看

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.