機器學習 - 資料洩露



資料洩露是機器學習中一個常見的問題,它發生在使用訓練資料集之外的資訊來建立或評估模型時。這可能導致過擬合,即模型過於貼合訓練資料,並在新資料上表現不佳。

資料洩露主要有兩種型別:目標洩露和訓練測試汙染

目標洩露

目標洩露發生在使用預測過程中不可用的特徵來建立模型時。例如,如果我們要預測客戶是否會流失,並且我們包含客戶的取消日期作為特徵,那麼模型將可以訪問在實踐中不可用的資訊。這可能導致訓練期間的準確率虛高,並在新資料上表現不佳。

訓練測試汙染

訓練測試汙染髮生在訓練過程中無意中使用了測試集中的資訊時。例如,如果我們根據整個資料集的均值和標準差而不是僅根據訓練集來標準化資料,那麼模型將可以訪問在實踐中不可用的資訊。這可能導致對模型效能過於樂觀的估計。

如何防止資料洩露?

為了防止資料洩露,務必仔細預處理資料,並確保在訓練過程中沒有使用測試集中的任何資訊。一些防止資料洩露的策略包括:

  • 在進行任何預處理或特徵工程之前,將資料分成單獨的訓練集和測試集。

  • 僅使用在預測時可用的特徵。

  • 使用交叉驗證來評估模型效能,而不是單一的訓練測試拆分。

  • 確保所有預處理步驟(如標準化或縮放)僅應用於訓練集,然後對測試集使用相同的轉換。

  • 注意任何潛在的洩露來源,例如基於日期或時間的特徵,並適當地處理它們。

Python 實現

以下是一個示例,我們將使用 Sklearn 乳腺癌資料集,並確保在訓練期間沒有來自測試集的資訊洩露到模型中:

示例

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

# Load the breast cancer dataset
data = load_breast_cancer()

# Separate features and labels
X, y = data.data, data.target

# Split the data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define the pipeline
pipeline = Pipeline([
   ('scaler', StandardScaler()),
   ('svm', SVC())
])

# Fit the pipeline on the train set
pipeline.fit(X_train, y_train)

# Make predictions on the test set
y_pred = pipeline.predict(X_test)

# Evaluate the model performance
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

輸出

執行此程式碼時,將生成以下輸出:

Accuracy: 0.9824561403508771
廣告