Classification Workflows
Confusion Counts
True and False Positives
Classification evaluation compares predicted labels with known labels for a chosen positive class.
Program
Play the script to change the positive class and watch the true/false-positive counts.
classification_counts.R
Replay: real traced execution (multi-file project)
positive_index <- 1
actual <- c("yes", "no", "yes", "no")
predicted <- c("yes", "yes", "yes", "no")
positive <- c("yes", "no", "maybe")[positive_index]
tp <- sum(actual == positive & predicted == positive)
fp <- sum(actual != positive & predicted == positive)
label <- paste("tp", tp, "fp", fp, sep = ":")
cat(label, "\n", sep = "")
positive_index <- 2
actual <- c("yes", "no", "yes", "no")
predicted <- c("yes", "yes", "yes", "no")
positive <- c("yes", "no", "maybe")[positive_index]
tp <- sum(actual == positive & predicted == positive)
fp <- sum(actual != positive & predicted == positive)
label <- paste("tp", tp, "fp", fp, sep = ":")
cat(label, "\n", sep = "")
positive_index <- 3
actual <- c("yes", "no", "yes", "no")
predicted <- c("yes", "yes", "yes", "no")
positive <- c("yes", "no", "maybe")[positive_index]
tp <- sum(actual == positive & predicted == positive)
fp <- sum(actual != positive & predicted == positive)
label <- paste("tp", tp, "fp", fp, sep = ":")
cat(label, "\n", sep = "")
positive_index ← 1
1positive_index <- 12actual <- c("yes", "no", "yes", "no")values this step1positive_indexactual ← yes, no, yes, no
1positive_index <- 12actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")values this stepyes, no, yes, noactualpredicted ← yes, yes, yes, no
2actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]values this stepyes, yes, yes, nopredictedpositive ← yes
3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)values this stepyespositive1positive_indextp ← 2
4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)values this step2tpyespositivefp ← 1
5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")values this step1fpyespositivelabel ← tp:2:fp:1
6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")values this steptp:2:fp:1label2tp1fpcat(label, " ", sep = "")
7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")outputtp:2:fp:1values this steptp:2:fp:1label
positive_index ← 2
1positive_index <- 22actual <- c("yes", "no", "yes", "no")values this step2positive_indexactual ← yes, no, yes, no
1positive_index <- 22actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")values this stepyes, no, yes, noactualpredicted ← yes, yes, yes, no
2actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]values this stepyes, yes, yes, nopredictedpositive ← no
3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)values this stepnopositive2positive_indextp ← 1
4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)values this step1tpnopositivefp ← 0
5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")values this step0fpnopositivelabel ← tp:1:fp:0
6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")values this steptp:1:fp:0label1tp0fpcat(label, " ", sep = "")
7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")outputtp:1:fp:0values this steptp:1:fp:0label
positive_index ← 3
1positive_index <- 32actual <- c("yes", "no", "yes", "no")values this step3positive_indexactual ← yes, no, yes, no
1positive_index <- 32actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")values this stepyes, no, yes, noactualpredicted ← yes, yes, yes, no
2actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]values this stepyes, yes, yes, nopredictedpositive ← maybe
3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)values this stepmaybepositive3positive_indextp ← 0
4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)values this step0tpmaybepositivefp ← 0
5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")values this step0fpmaybepositivelabel ← tp:0:fp:0
6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")values this steptp:0:fp:0label0tp0fpcat(label, " ", sep = "")
7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")outputtp:0:fp:0values this steptp:0:fp:0label
positive class
The chosen positive class defines what counts as a positive prediction.
true positive
`actual == positive & predicted == positive` finds correct positive predictions.
false positive
`actual != positive & predicted == positive` finds predicted positives that were not actually positive.