【数据竞赛】5行代码检测分布不一致,代码少效果好!
共 1699字,需浏览 4分钟
·
2022-01-19 16:22
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吗?
包大人你又在这水班车日更了。
包大人:哎,你会了不代表所有人都会。班车到站了,打卡上工打灰了。
都看到了这里了,点个关注吧!包大人的精彩班车知识分享。
往期精彩回顾
适合初学者入门人工智能的路线及资料下载 中国大学慕课《机器学习》(黄海广主讲) 机器学习及深度学习笔记等资料打印 机器学习在线手册 深度学习笔记专辑 《统计学习方法》的代码复现专辑 AI基础下载 本站qq群955171419,加入微信群请扫码: