从数据框手动创建 ROC 曲线
Create ROC curve manually from data frame
我有以下概念性问题,我无法理解。
下面是调查数据的示例,其中我有一个时间列,指示某人需要多长时间来回答某个问题。
现在,我对清洁量如何根据此阈值发生变化感兴趣,即如果我增加阈值会发生什么,如果我减少它会发生什么。
所以我的想法是创建一条 ROC 曲线(或其他模型指标)以获得关于潜在阈值的视觉提示。问题是我没有类似机器学习的模型可以给我 class 概率。所以我想知道是否有任何方法可以用这种类型的数据创建 ROC 曲线。我的想法是在大约 100 个不同的阈值处循环我的数据,计算每个阈值的假阳性率和真阳性率,然后做一个简单的线图,但我希望有一个更优雅的解决方案,不需要我循环.
有什么想法吗?
示例数据:
time
列表示每个案例所需的时间
truth
列表示我要与 比较的当前决定
predicted
列表示如果我要在 2.5s
的时间阈值处进行切割的清理决策。这是我需要 change/loop 通过的内容。
set.seed(3)
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) %>%
mutate(predicted = if_else(time < 2.5, "cleaned", "final"))
So my idea was to just create a ROC curve
创建 ROC 曲线就像
一样简单
library(pROC)
set.seed(3)
data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) |>
roc(truth, time) |>
plot()
The problem is that I don't have a machine-learning-like model that would give me class probabilities.
抱歉,我不明白类似机器学习的问题。
I had the idea of just looping through my data at maybe 100 different thresholds
如果您有 10 个观察值,则循环超过 100 个可能的阈值是没有意义的。合理的截止点是位于 time
值之间的九个。你可以从 roc
:
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5))
thresholds <- roc(df, truth, time)$thresholds
print(thresholds)
或
> print(thresholds)
[1] -Inf 1.195612 1.739608 1.968531 2.155908 2.329745 2.561073
[8] 3.093424 3.969994 4.586341 Inf
术语循环的确切含义是什么,以及您是否只想排除一个 for
和一个 while
循环,或者您认为是循环的任何东西都需要一些精确的定义。 c(1, 2, 3, 4) * 5
是循环吗?引擎盖下会有一个循环运行。
你也可以使用 ROCR
library(ROCR)
set.seed(3)
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) %>%
mutate(predicted = if_else(time < 2.5, "cleaned", "final"))
pred <- prediction(df$time, df$truth)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
您还可以查看AUC值:
auc <- performance(pred, measure = "auc")
auc@y.values[[1]]
[1] 0.92
与 pROC
交叉检查 AUC 值
library(pROC)
roc(df$truth, df$time)
Call:
roc.default(response = df$truth, predictor = df$time)
Data: df$time in 5 controls (df$truth cleaned) < 5 cases (df$truth final).
Area under the curve: 0.92
两种情况都是一样的!
我有以下概念性问题,我无法理解。
下面是调查数据的示例,其中我有一个时间列,指示某人需要多长时间来回答某个问题。
现在,我对清洁量如何根据此阈值发生变化感兴趣,即如果我增加阈值会发生什么,如果我减少它会发生什么。
所以我的想法是创建一条 ROC 曲线(或其他模型指标)以获得关于潜在阈值的视觉提示。问题是我没有类似机器学习的模型可以给我 class 概率。所以我想知道是否有任何方法可以用这种类型的数据创建 ROC 曲线。我的想法是在大约 100 个不同的阈值处循环我的数据,计算每个阈值的假阳性率和真阳性率,然后做一个简单的线图,但我希望有一个更优雅的解决方案,不需要我循环.
有什么想法吗?
示例数据:
time
列表示每个案例所需的时间truth
列表示我要与 比较的当前决定
predicted
列表示如果我要在2.5s
的时间阈值处进行切割的清理决策。这是我需要 change/loop 通过的内容。
set.seed(3)
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) %>%
mutate(predicted = if_else(time < 2.5, "cleaned", "final"))
So my idea was to just create a ROC curve
创建 ROC 曲线就像
一样简单library(pROC)
set.seed(3)
data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) |>
roc(truth, time) |>
plot()
The problem is that I don't have a machine-learning-like model that would give me class probabilities.
抱歉,我不明白类似机器学习的问题。
I had the idea of just looping through my data at maybe 100 different thresholds
如果您有 10 个观察值,则循环超过 100 个可能的阈值是没有意义的。合理的截止点是位于 time
值之间的九个。你可以从 roc
:
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5))
thresholds <- roc(df, truth, time)$thresholds
print(thresholds)
或
> print(thresholds)
[1] -Inf 1.195612 1.739608 1.968531 2.155908 2.329745 2.561073
[8] 3.093424 3.969994 4.586341 Inf
术语循环的确切含义是什么,以及您是否只想排除一个 for
和一个 while
循环,或者您认为是循环的任何东西都需要一些精确的定义。 c(1, 2, 3, 4) * 5
是循环吗?引擎盖下会有一个循环运行。
你也可以使用 ROCR
library(ROCR)
set.seed(3)
df <- data.frame(time = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
truth = rep(c("cleaned", "final"), each = 5)) %>%
mutate(predicted = if_else(time < 2.5, "cleaned", "final"))
pred <- prediction(df$time, df$truth)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
您还可以查看AUC值:
auc <- performance(pred, measure = "auc")
auc@y.values[[1]]
[1] 0.92
与 pROC
library(pROC)
roc(df$truth, df$time)
Call:
roc.default(response = df$truth, predictor = df$time)
Data: df$time in 5 controls (df$truth cleaned) < 5 cases (df$truth final).
Area under the curve: 0.92
两种情况都是一样的!