2020-08-23
数据漂移是指由于时间的变动,之前的数据集的分布与现在的数据集的分布不一致,导致之前的模型不能很好的对现在的数据进行预测的情况。简单点说就是随着时间的推移,数据分布变了,基于以前的数据训练好的模型不好用了。
目前市面上常用的解决方法:
1. 用现在的数据重新训练模型 (这个不需要解释)
2. 对抗性验证法
论文地址:https://arxiv.org/pdf/2004.03045.pdf
这个方法的好处是万一你只有少数当前时间段的数据,不足以用它来重新分割训练集测试集从而训练一个新的模型,你还有另一条路可以走。那就是从你原先的训练集里面选出与当前的数据尽可能接近的数据作为验证集,然后做K折交叉验证,使得训练出来的模型接可能的可以评估当前的数据。
核心点就是如何从原先的训练集里面挑选出一部分与当前数据的分布最为接近的数据作为验证集,that is the problem。对抗性验证用的方法就是新增一个标签(is_test),训练一个二分类模型来预测这个标签值,预测结果是概率值(有多大概率属于测试集)给预测结果根据概率值排序后选择最后20%的数据。具体的实现过程可以自行百度或者看论文。
推荐的一种新方法featexp
先看效果图:
- 训练集测试集中“DAYS_EMPLOYED”这个变量的分布情况
- 所有变量的分布趋势(trend_changes)在训练集,测试集中的情况,以及趋势相关度的量化值
看不懂?我稍微解释下就懂了
第一个图中的折线图的横坐标展示的是当前这个变量的分箱区间,纵坐标表格每个区间里的数据的标签值的平均,比如某个变量分了5个区间,那就会出现5个点,每个点的值表示这个区间内所有数据原先的标签值求和再取平均。把所有的点连线就是这个变量的分布趋势。
先对训练集中的某个变量分析,画出这个图,然后对测试集中这个变量也用同样的方法画出这个图,就可以很直观的知道这个变量在训练集和测试集里面的分布是否一致(既折线的趋势是否一致)。
第二个图是对数据集中每个变量做一个量化分析,trend_changes表示图中的折线有几次斜率正负号反向,有3次正负号的变换那么trend_changes就等于3。很好理解:如果训练集和测试集中的trend_changes数一样,那么就就较高的概率分布一致,为了更加精确的表示每个变量在训练集和测试集中的趋势相关度,featexp内置了直接计算趋势相关度(trend_correlation)的方法,调用它,传入训练集,测试集就可以直接展示出来。
要知道我们的核心任务是找到哪些变量在训练集和当前的数据(测试集)不一致,剔除掉这些引起不一致的变量,那不就很大程度解决了数据漂移问题?然后在剔除之后的数据上训练新的模型就可以用了,简单有效。
最后要说的是,featexp可以做的事远不止数据漂移,具体能做哪些事可以参考这份中文教程,非常简单粗暴!
中问教程地址:https://www.jiqizhixin.com/articles/2018-11-06-7
featexp源码地址:https://github.com/abhayspawar/featexp