【数据竞赛】5行代码检测分布不一致,代码少效果好!

共 1699字,需浏览 4分钟

 ·

2022-01-19 16:22

5行代码系列,是包大人班车日更精选的原理简单明确,效果立竿见影的机器学习武器库。


往期:

5行代码提升GBDT,提升巨大!

5行代码提升时间序列预测,都有用!

5行代码实现的对比学习,效果超好!


我们还是用一道题目开场吧!


问题引入


大家都招过外包标注,怎么选出合适的数据是一个技术活。


如果你标的是图片分类数据集,合适的含义就有两层

第一,不一样的类别。有太多猫猫了,那么再加数据也意义不大了。

第二,有代表性的类别,狗狗照片里面有太多柴犬了,你也得把二哈,萨摩耶,德牧,短腿柯基也弄进去。


怎么解决这个问题,给标注每天选数据呢?


这进入了我们今天的关键,分布不一致检测。他有个洋气的学术名叫concept drift detection,概念漂移检测。


传统的学术派解决这个问题的经典方法,就是用一个分布函数,把历史的数据拟合出来,然后看看待检测数据超出置信空间的水平。


以上方法有两个问题,第一,严重依赖于分布函数的先验。第二,他是无监督的,无监督听起来就不靠谱。总结起来就是又费劲又受限。


他的应用场景有开头的新样本发现,如果你标的意图识别数据,就是意图发现。其他应用还有其他的像异常检测,debias等。


那么今天的主角呼之欲出了,有监督,无先验。又简单,又好用


我以意图发现为例(找出有可能好友新意图类别的样本),几句话讲明白这个方法。




方法原理


已有的数据打上0,待检测数据打上1,然后样本拼接,训练一个lstm。最好做一个5折交叉验证,然后把验证概率大于0.9(自己设)的找出来。


他的原理就是用分类器做一个数据来源分类任务。大家都知道,两个分布重叠的部分,一会儿0,一会儿1,模型就学懵了。


要是数量均衡的话,模型只好给你个0.5敷衍完事。既然模型在重叠的分布上敷衍了事,那我把模型有把握的部分,找出来不就行了吗?


嗯,有把握的部分就是高置信的部分,你可以相信模型找到了一点不一样的东西。这些不一样的东西,才会被他学到。所以过高的置信度样本,就是我们要找的刺头。


除了意图发现,结构化数据可以用这个方法来找出分布不一致的样本和特征。


怎么做呢?和前面过程一样,一部分给0,一部分给1。你把分类器换成LightGBM就可以了,他还可以生产特征重要性,在划分新老数据的时候,他把特征bias的程度,给你打了一个排名。


这是以前我在PAKDD AUTOML竞赛中用来处理drift特征的方法。验证AUC大于0.65的话,特征用时间窗来更新下,删掉一部分特别飘的。这个方法在工业界上线也挺有意义的。




代码实现


如果你看懂了前面,基本就不需要看代码就能实现出来了。核心原理代码。


df_history['lable'] = 0 #历史数据
df_now['lable'] = 1 #检测数据
df_all = pd.concat([df_history,df_now]).reset_index(drop=True)
model_list,prob = model.fit(X= df_all['feature'],y = df_all['lable'], kfold=True)
df_drift = df_all[df_all['prob']>drift_thres]#找到prob>drift_thres的样本


完整的代码在后台回复 漂移检测




最后,会的同学说,这不就是adversial validation吗?

包大人你又在这水班车日更了。


包大人:哎,你会了不代表所有人都会。班车到站了,打卡上工打灰了。

都看到了这里了,点个关注吧!包大人的精彩班车知识分享。


往期精彩回顾




浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报