机器学习中Data Leakage是怎么回事?怎么避免?

文章导读
Previous Quiz Next 数据泄漏是机器学习中的一个常见问题,它发生在使用训练数据集之外的信息来创建或评估模型时。这会导致过拟合,即模型过于贴合训练数据而在新数据上表现不佳。
📋 目录
  1. A Target Leakage
  2. B Train-test Contamination
  3. C 如何防止数据泄漏?
  4. D 示例 - 在 Python 中的实现
A A

机器学习 - 数据泄漏



Previous
Quiz
Next

数据泄漏是机器学习中的一个常见问题,它发生在使用训练数据集之外的信息来创建或评估模型时。这会导致过拟合,即模型过于贴合训练数据而在新数据上表现不佳。

数据泄漏主要有两种类型:Target Leakage 和 Train-test Contamination

Target Leakage

Target Leakage 发生在使用预测时不可用的特征来创建模型时。例如,如果我们正在预测客户是否会流失,并且将客户的取消日期作为特征包含在内,那么模型将能够访问到实际中不可用的信息。这会导致训练期间不切实际的高准确率,并在新数据上表现不佳。

Train-test Contamination

Train-test Contamination 发生在测试集的信息被无意中用于训练过程时。例如,如果我们基于整个数据集的均值和标准差来归一化数据,而不是仅使用训练集,那么模型将能够访问到实际中不可用的信息。这会导致对模型性能的过于乐观的估计。

如何防止数据泄漏?

为了防止数据泄漏,重要的是仔细预处理数据,并确保训练过程中不使用测试集中的任何信息。防止数据泄漏的一些策略包括 −

  • 在进行任何预处理或特征工程之前,将数据分割成独立的训练集和测试集。

  • 仅使用预测时可用的特征。

  • 使用交叉验证来评估模型性能,而不是单一的 train-test split。

  • 确保所有预处理步骤(如归一化或缩放)仅应用于训练集,然后对测试集应用相同的转换。

  • 注意任何潜在的泄漏来源,例如基于日期或时间的特征,并适当处理它们。

示例 - 在 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
from sklearn.metrics import accuracy_score  # 加载准确率计算函数

# 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 = Pipeline([
   ('scaler', StandardScaler()),
   ('svm', SVC())
])

# Fit the pipeline on the train set  # 在训练集上拟合 pipeline
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