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.

positive_index
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 = "")
  1. positive_index ← 1

    1positive_index <- 12actual <- c("yes", "no", "yes", "no")
    values this step1positive_index
  2. actual ← yes, no, yes, no

    1positive_index <- 12actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")
    values this stepyes, no, yes, noactual
  3. predicted ← 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, nopredicted
  4. positive ← yes

    3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)
    values this stepyespositive1positive_index
  5. tp ← 2

    4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)
    values this step2tpyespositive
  6. fp ← 1

    5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")
    values this step1fpyespositive
  7. label ← 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:1label2tp1fp
  8. cat(label, " ", sep = "")

    7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")
    outputtp:2:fp:1
    values this steptp:2:fp:1label
  1. positive_index ← 2

    1positive_index <- 22actual <- c("yes", "no", "yes", "no")
    values this step2positive_index
  2. actual ← yes, no, yes, no

    1positive_index <- 22actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")
    values this stepyes, no, yes, noactual
  3. predicted ← 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, nopredicted
  4. positive ← no

    3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)
    values this stepnopositive2positive_index
  5. tp ← 1

    4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)
    values this step1tpnopositive
  6. fp ← 0

    5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")
    values this step0fpnopositive
  7. label ← 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:0label1tp0fp
  8. cat(label, " ", sep = "")

    7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")
    outputtp:1:fp:0
    values this steptp:1:fp:0label
  1. positive_index ← 3

    1positive_index <- 32actual <- c("yes", "no", "yes", "no")
    values this step3positive_index
  2. actual ← yes, no, yes, no

    1positive_index <- 32actual <- c("yes", "no", "yes", "no")3predicted <- c("yes", "yes", "yes", "no")
    values this stepyes, no, yes, noactual
  3. predicted ← 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, nopredicted
  4. positive ← maybe

    3predicted <- c("yes", "yes", "yes", "no")4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)
    values this stepmaybepositive3positive_index
  5. tp ← 0

    4positive <- c("yes", "no", "maybe")[positive_index]5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)
    values this step0tpmaybepositive
  6. fp ← 0

    5tp <- sum(actual == positive & predicted == positive)6fp <- sum(actual != positive & predicted == positive)7label <- paste("tp", tp, "fp", fp, sep = ":")
    values this step0fpmaybepositive
  7. label ← 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:0label0tp0fp
  8. cat(label, " ", sep = "")

    7label <- paste("tp", tp, "fp", fp, sep = ":")8cat(label, "\n", sep = "")
    outputtp:0:fp:0
    values 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.