摘要:机器学习中数据泄露会导致模型过拟合,主要分为目标泄露(使用预测时无法获取的特征)和训练-测试集污染(预处理时混入测试集信息)。防止措施包括:严格划分训练/测试集、仅使用可获取特征、采用交叉验证、预处理仅基于训练集等。文中以Scikit-learn乳腺癌数据集为例,通过建立标准化和SVM分类的Pipeline,确保无信息泄露,最终测试准确率达98.2%。
目录
机器学习 —— 数据泄露
目标泄露
训练 – 测试集污染
如何防止数据泄露?
Python 实现示例
代码示例
输出结果
机器学习 —— 数据泄露
数据泄露是机器学习中常见的问题,指在构建或评估模型时,使用了训练数据集之外的信息。这会导致模型过拟合,即模型过度贴合训练数据,在新数据上的表现会大打折扣。
数据泄露主要分为两种类型:目标泄露和训练 – 测试集污染。
目标泄露
目标泄露指构建模型时,使用了预测阶段无法获取的特征。例如,在预测客户是否会流失时,若将客户的注销日期纳入特征,模型就会获取到实际场景中无法得到的信息。这会让模型在训练阶段达到不切实际的高准确率,而在新数据上的表现却很差。
训练 – 测试集污染
训练 – 测试集污染指训练过程中无意间使用了测试集的信息。例如,若基于整个数据集的均值和标准差对数据做归一化,而非仅基于训练集,模型就会获取到实际场景中无法得到的信息。这会让模型的性能评估结果过于乐观。
如何防止数据泄露?
要防止数据泄露,需谨慎对数据进行预处理,确保训练过程中未使用任何测试集的信息。以下是一些防止数据泄露的策略:
Python 实现示例
以下示例将使用 Scikit-learn 的乳腺癌数据集,确保训练过程中没有任何测试集信息泄露到模型中:
代码示例
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
# 加载乳腺癌数据集
data = load_breast_cancer()
# 分离特征和标签
X, y = data.data, data.target
# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义流水线
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])
# 在训练集上拟合流水线
pipeline.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = pipeline.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
输出结果
运行上述代码,将得到以下输出:
plaintext
准确率: 0.9824561403508771





