4.2.4 数据泄露

机器学习中还有一个与过拟合非常相似的现象:训练时模型表现异常的好,但在真实预测中表现得很差。这就是数据泄露(Data Leakage)会产生的现象。我们举两个常见的例子,如下所示。

1)对数据进行标准化后再拆分数据训练。


# X,y 同上述数据
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X2 = scaler.fit_transform(X)
knn = KNeighborsClassifier()
scores = cross_val_score(knn, X2, y, cv=5, scoring='accuracy')

2)预测病人是否会患病:开发一个预测病人是否会患A疾病的模型,在准备特征的过程中,收集了病人是否使用过某些药物的特征,其中包含了“是否使用过治疗A疾病的药物”的特征。

这两个例子中包含了很多初学者容易犯的错误。在第一个例子中,先进行数据标准化,然后交叉验证。此时已将验证集上的信息(均值、标准差)泄露到了训练集中;第二个例子中,“是否使用过治疗A疾病的药物”的特征泄露了是否已患A疾病的事实,此时开发的模型是没有意义的。

数据泄露又称特征穿越,指的是在建模过程中的数据收集、数据处理时无意将未来信息引入训练集中。未来信息包括如例一的测试集信息泄露到训练集中,例二中的将目标信息泄露到训练数据中。数据泄露一般发生在时间序列场景或具有时间属性的场景,例如在金融的信贷领域,建模工程师在取数时,误取到了建模时间点后的还款信息、表现等。

注意:机器学习中的数据泄露与计算机安全领域的数据泄露的概念完全不同。日常听到的“用户信息泄露”指的是安全领域的数据泄露,即数据被未经授权的组织剽窃、盗走或使用。

很明显,数据泄露后模型训练效果往往非常好,甚至好到难以置信,而真实场景预测效果往往会大打折扣。除此之外,我们还可以通过如下的方式检查或判断是否发生了数据泄露。

1)数据探索性分析(Exploratory Data Analysis,EDA):查看特征的分布和特征与目标标量的关系;从业务角度出发,分析和论证该特征的物理含义。

2)特征分析:特征与目标变量的相关性分析;使用基于统计的OneR(One Rule)算法、使用基于信息论的特征的信息值(IV)、信息熵等,查看特征重要性,如果有表现特别突出的特征,请重点检查。

3)模型比较:详细的模型性能评估和分析;与之前版本模型和行业模型对比。

4)加强测试:如有条件,对模型进行现场测试,查看真实环境的表现与模型训练效果是否有很大的差别。

为了避免数据泄露,实践中需要形成规范的建模方法,例如:

1)具有时间属性的场合要求严格控制时间,取得所需历史快照数据,并追溯变量业务的物理含义。

2)使用特征区分力指标进行直观检查,重点检查区分力强的特征;一定不能使用ID类的变量;怀疑某个特征有泄露的可能时,请先不要使用它。

3)只在训练数据集或交叉验证的训练组中执行数据信息提取等相关处理方法(特征选择、异常值删除、编码、特征缩放和降维等);交叉验证时在每个循环周期内独立进行。

4)在独立的、模型完全未见的数据集上进行模型的最终评估。

5)使用统一的数据处理方法(管道)。