什么时候对没有统计意义的数据使用机器学习有意义

数据挖掘 统计数据
2022-03-05 02:04:55

我有一个包含三列的数据集,项目完成的截止日期之后或之前的天数,项目所在部门的名称以及员工的用户编号。

考虑到部门和员工,公司有兴趣预测何时可能完成工作。

查看这些箱形图,您可以看到部门之间和个人之间的项目交付延迟略有不同,但部门和个人之间的差异要大得多。

很大程度上是因为这个,如果我使用统计测试,我发现类的平均值之间没有显着差异。

但是,我可以构建一个复杂的决策树或类似的尝试预测基于用户/部门的项目延迟。

  • 这有意义吗?
  • 在什么情况下,在统计工具拒绝模式概念的数据集上使用机器学习工具是有意义的?
  • 如果您使用没有统计数据的 ML 工具,您什么时候会拒绝数据中存在任何重要模式的想法?

各部门项目延误

各部门项目延期^

每个员工的项目延迟

每个员工的项目延迟^

1个回答

这取决于您在统计上检查哪种差异。

如果您有两个来自同一分布的组,您应该无法可靠地区分它们。这是机器学习的一个功能,而不是错误。

如果您有两组来自具有相同均值的不同分布,您应该能够区分它们。你的表现可能不是很好,但你可以做得比随机猜测更好。例如,如果在逻辑回归中包含二次项,则可以区分你的表现不会令人惊叹,但它胜过随机猜测。N(0,1)N(0,2)

# install.packages('pROC') # You might need to run this.
library(pROC)
set.seed(2021)
N <- 100
x0 <- rnorm(N, 0, 1)
y0 <- rep(0, N)
x1 <- rnorm(N, 0, 2)
y1 <- rep(1, N)
x <- c(x0, x1)
y <- c(y0, y1)
L1 <- glm(y ~ x, family = binomial)
L2 <- glm(y ~ poly(x, 2), family = binomial) # I think poly is not the best way to do this, but it's what I remember right now.
my_roc_1 <- pROC::roc(y, 1/(1+exp(-predict(L1))))
my_roc_2 <- pROC::roc(y, 1/(1+exp(-predict(L2))))
par(mfrow = c(2, 1))
plot(my_roc_1, main = "No Quadratic Term")
plot(my_roc_2, main = "Quadratic Term")
par(mfrow = c(1, 1))

在此处输入图像描述

没有二次项,性能很糟糕,AUC 基本上是机会,在使用二次项,性能远非惊人,但我们做得比机会好,AUC 为(更好的方法是比较 log loss 或 Brier 分数,尽管这些指标在数据科学中似乎不如在统计学中流行。)0.54260.6847

如果你绘制两组的密度,就很清楚为什么它们比机会更能区分。

library(ggplot2)
d0 <- data.frame(x = x0, group = "0")
d1 <- data.frame(x = x1, group = "1")
d <- rbind(d0, d1)
ggplot(d, aes(x = x, fill = group)) + geom_density(alpha = 0.3) + theme_bw()

在此处输入图像描述

如果您在附近得到一个点,则它更有可能来自第组而不是第组。如果你得到一个远离的点,它更有可能来自第组而不是第组。附近,该组更加模棱两可,但是当您处于中间或远处时,您可以做得不错。001010±2

这里要吸取的教训是,除非分布相同,否则某些模型应该能够在区分两个分布方面取得一些进展。当均值不同时,像普通逻辑回归这样的线性方法(只有线性项,所以没有像我的模型)效果最好。具有非线性项的逻辑回归,例如我的具有二次项的模型或具有样条的模型,可以拟合(但也过拟合)其他差异。在极端情况下,找到自己的非线性项的模型(例如神经网络)可以找到各种差异(同时也有过度拟合的风险)。x2L2L2

回到您的示例,您知道,如果您进行极端观察,则它更有可能属于具有极端观察的某些组,而不是聚集在平均值附近的其他组。