如何处理与响应高度相关的预测变量

机器算法验证 相关性 不平衡类
2022-03-19 03:50:53

首先,我想说我在统计方面不是很有经验,也不是以英语为母语的人,所以请随时告诉我我的问题是完全明显还是不清楚。

我目前正在处理一个不平衡的数据集(欺诈检测),我遇到了一些与响应高度相关的变量类别的问题。例如,有一个表示付款类型的变量。大多数试图欺诈的人都选择了支票,而选择支票的人中有三分之一是欺诈者,因此我的模型倾向于将任何以支票作为支付类型的观察归类为欺诈。
这两个变量之间的相关性约为 50%,我在应用 bagged Cart 后得到的精度约为 0.4,而其他算法的效果也很差。

如何在不从数据集中删除变量的情况下处理这个问题?

3个回答

听起来你所拥有的是一个强大的预测变量,没有理由删除它。

在这种情况下你必须注意的是所谓的泄漏泄漏是指你有一个预测变量,它只是你变相的响应的某个版本。

例如,假设您的公司有一个系统,当检测到欺诈时,首先将帐户切换到“调查”状态,然后在调查完成后,由于欺诈而将其取消。“调查状态”看起来是一个非常强大的变量,但它是响应(欺诈)引起的。如果你去实现你的模型,试图检测欺诈,那么“调查状态”变量将毫无用处,就像一个帐户处于调查状态,你已经知道它是欺诈的。

您可以看到为什么这被称为泄漏,响应已“泄漏”到预测变量中。

因此,请仔细考虑您的帐户状态是否会出现这种情况,但我怀疑不会。在这种情况下,您只有一个非常好的预测变量。

大多数试图欺诈的人都选择了支票,大多数选择了支票的人和三分之一选择了支票的人都是欺诈者,所以每当我的模型倾向于将任何以支票作为支付类型的观察结果归类为欺诈时。

您不应该通过将记录分类为欺诈或非欺诈来评估您的模型。相反,您应该让您的模型为每个评估记录分配欺诈概率,并直接使用这些概率。如果您使用此上下文,那么您的问题就会消失,因为您会简单地观察到使用支票会带来很高的欺诈概率,这并不意味着所有支票用户都是欺诈的。

除了@Matthew Drury 的回答,您还可以针对不同的交易方法(支票、非支票)训练不同的模型。这样,使用支票的人的特征将被突出显示,并且该列也将保留在数据中。查看您使用的工具是否允许在拟合模型时进行分组。这可以节省额外的工作。

不平衡

到目前为止,平衡训练集(50%-50%)的最干净*方法是使用观察权重。假设 1% 的案例是欺诈性的,99% 不是,那么给每个非欺诈性案例权重 1,每个欺诈性交易权重 99。这相当于将每个欺诈性案例的 98 个副本添加回训练集中。

例如,在 R 中rpartset中lm使用参数在 Python 的集合中。weightsrandomForestclasswt = c(0.5, 0.5)sklearn.tree.DecisionTreeClassifierclass_weight = "balanced"

这样做将使分类器在少数结果类别(欺诈)上“更加努力”,因为现在对其进行错误分类会大大增加成本。

*我写“最干净”是因为(随机)过采样会产生不必要的采样噪声,因为某些情况的采样次数多于或少于 99 次。相反,加权会平等对待所有情况。

决策树

鉴于您使用的是分类树,您可以强制节点check == yes拆分,这样您就不必将最终在该节点中的所有案例分类为欺诈(当然我在推测 - 我不知道您的数据)。

最后,分类树自然会输出概率。假设一个新案例落入一个由 72% 的欺诈案例和 28% 的非欺诈案例组成的端节点(叶子),那么新案例是欺诈的估计概率等于 72%。