如何快速检测大数据中的作弊变量?

机器算法验证 算法 线性的 大数据 高维
2022-03-20 03:52:02

假设我们有一个包含数百万行和数千列的数据集,任务是二进制分类。当我们运行逻辑回归模型时,性能比预期好很多,例如,几乎完美的分类。

我们怀疑数据中存在一些作弊变量,如何快速检测出来?

这里作弊变量是指一个对响应非常有指示性的变量,我们不应该使用它。例如,我们使用一个人是否拨打客户服务电话来预测一个人是否购买了产品。

2个回答

这有时被称为“数据泄漏”。这里有一篇很好的论文:

数据挖掘中的泄漏:制定、检测和避免

上面的论文有很多有趣(和可怕)的数据泄露示例,例如,一场癌症预测竞赛,结果发现患者 ID 号对未来癌症有近乎完美的预测,这是无意中因为在整个研究过程中如何形成分组的.

我认为没有明确的方法来识别数据泄漏。上面的论文有一些建议,但总的来说它是非常具体的问题。例如,您绝对可以只查看特征和目标之间的相关性。然而,有时你会错过一些东西。例如,假设您正在为诸如 stackexchange 之类的网站制作垃圾邮件机器人检测器,除了收集消息长度、内容等功能外,您还可以收集有关消息是否被其他用户标记的信息。但是,如果您希望机器人检测器尽可能快,则不必依赖用户生成的消息标志。自然,垃圾邮件机器人会积累大量用户生成的消息标志,因此您的分类器可能会开始依赖这些标志,而消息的内容则更少。通过这种方式,您应该考虑删除标记作为一项功能,以便您可以比众包用户的工作更快地标记机器人,即在广泛的受众接触他们的消息之前。

其他时候,你会有一个非常愚蠢的功能导致你被检测到。这里有一个很好的轶事,讲述了陆军如何尝试制造坦克探测器的故事,该探测器具有近乎完美的准确度,但最终检测到阴天,因为所有坦克的训练图像都是在阴天拍摄的,而且每张训练图像没有坦克是在晴朗的日子拍摄的。一篇非常相关的论文是:“我为什么要相信你?”:解释任何分类器的预测- Ribeiro 等。人。

检测作弊变量的一种方法是构建树模型并查看最初的几个拆分。这是一个模拟示例。

cheating_variable=runif(1e3)
x=matrix(runif(1e5),nrow = 1e3)
y=rbinom(1e3,1,cheating_variable)

d=data.frame(x=cbind(x,cheating_variable),y=y)

library(rpart)
library(partykit)
tree_fit=rpart(y~.,d)
plot(as.party(tree_fit))

在此处输入图像描述