caret :: confusionMatrix внутренняя матричная ошибка chr длина имен, которые не равны экстенту массива - PullRequest
0 голосов
/ 09 апреля 2020

Задача

caret :: confusionMatrix. Код в R имеет новые функции и включает Try / Catch, но при выполнении функций R нет ошибок, кроме внутренних по отношению к матрице.

Для моих расчетов с использованием итерации по точности, для вычисления чувствительности, специфичности, точности confusionMatrix я могу сделать это успешно на не-l oop и получить все показатели. Но когда я использую переменные для построения confusionMatrix внутри функции (compute_seq_accuracy.fun c), я включаю блок Try / Catch; который при запуске не показывает ошибки; но функция также НЕ создает правильно confusionMatrix. Поэтому мне пришлось создать пользовательскую функцию для исправления ошибки уровней из confusionMatrix. Эта функция называется: compute_confusion_table.fun c (), которая принимает переменную ответа y и матрицу предиктивной переменной и исправляет отсутствующие имена строк и имен столбцов и возвращает действительную таблицу непредвиденных обстоятельств (например, return (ccm.fun c .confusion_table)

Основная функция программы драйвера (например, compute_seq_accuracy.fun c) принимает значения последовательности (01 ... 0,9 ) и вызывает функцию compute_consusion_table.fun c () для возврата действительной таблицы непредвиденных обстоятельств. НО эта функция не работает правильно для вычисления confusionMatrix, ошибки Try / Catch нет, но внутри матрицы внутри функции, которую я вижу что есть внутренняя ошибка в "chr длина имен, которые не равны экстенту массива". Эта ошибка видна через str () для переменной, встроенной в функцию для отладки. У меня есть оператор отладки str () внутри compute_matrix .fun c () функция, которая явно как происходит внутренняя ошибка "chr длины имен, которые не равны экстенту массива"

Попытка кода

loans_predict <- predict(full, newdata=loans_train_data, type="response", na.action=na.pass)

compute_seq_accuracy.func <- function(value) {
        tryCatch({
                csa.func.p <- factor(ifelse(loans_predict < value, "Good", "Bad"))
                csa.func.confusion_table <- compute_confusion_table.func(loans_train_data$statusRank, csa.func.p)
                tryCatch({
                        csa.cmt <- compute_matrix.func(csa.func.p, csa.func.confusion_table)
        str(csa.cmt)
                },
                error = function(e) return(e)
                )
                return(csa.cmt$overall['Accuracy'])
        },
        error = function(e) return(e)
        )
}

compute_matrix.func <- function(p, t) {
        tryCatch({
                cm.func.confusion_matrix <- caret::confusionMatrix(p, t, positive="1", alpha=0.05)
        str(cm.func.confusion_matrix)
                return(cm.func.confusion_matrix$overall['Accuracy'])
        },

        error = function(e) return(e)
        )
}

##
compute_confusion_table.func <- function(y, p) {
        tryCatch({
                ccm.func.confusion_table <- table(y, p)
                if(nrow(ccm.func.confusion_table)!=ncol(ccm.func.confusion_table)){
                        missings <- setdiff(colnames(ccm.func.confusion_table),rownames(ccm.func.confusion_table))
                        missing_mat <- mat.or.vec(nr = length(missings), nc = ncol(ccm.func.confusion_table))
                        ccm.func.confusion_table  <- as.table(rbind(as.matrix(ccm.func.confusion_table), missing_mat))
                        rownames(ccm.func.confusion_table) <- colnames(ccm.func.confusion_table)
                }
                return(ccm.func.confusion_table)
        },
        error = function(e) return(e)
        )
}

compute_for_values <- seq(0.1, 0.9, by=0.1)

csa_copmuted_accuracies <- sapply(compute_for_values, compute_seq_accuracy.func, simplify=FALSE) 

names(csa_computed_accuracies) <- compute_for_values

csa_computed_accuracies[which.max(as.numeric(csa_computed_accuracies))

Дополнительное объяснение

R confusionMatrix для диапазона точности (0,1 ... 0,9), но возникла проблема из-за внутренней ошибки "chr длина имен, которые не равны экстенту массива" Тем не менее, поскольку я только запустил функцию glm2 (), и Функция Предиката () до confusionMatrix, я никогда не менял имена столбцов и не выпускал никаких функций rbind (), которые могли бы изменить имена / порядок столбцов, поэтому я не понимаю, почему эта функция confusionMatrix выдает ошибку, когда прогнозируется и фактические параметры, которые не имеют одинаковое количество уровней. Итак, теперь я понимаю, что функции в пакете карет go очень длинны, чтобы гарантировать, что предсказания всегда имеют те же уровни, что и исходные классы. Это и есть цель для функции compute_confusion_table.fun c. Кроме того, кроме того, мой другой вопрос: где (?) Или когда (?) Эти данные (прогнозируемые и фактические) в конечном итоге получили уровни syn c для неверных несин c уровней?

Образец данных

loan_predict

> dput(loans_predict[1:20])
c(`11413` = 0.803325118108046, `2561` = NA, `25337` = 0.853849488971217, 
`1643` = 0.793893769102712, `14264` = 0.714721872072079, `24191` = 0.778606178072608, 
`33989` = 0.890633845537385, `28193` = 0.798171905376348, `21129` = 0.898502735539081, 
`7895` = 0.881058550796637, `29007` = 0.760753392722403, `26622` = 0.662375927088179, 
`3065` = 0.925597132852884, `11423` = 0.763460597845282, `3953` = 0.921791256610175, 
`5789` = 0.745157387706153, `30150` = 0.587949357489077, `6070` = 0.915098837460939, 
`1486` = 0.680767185297498, `13195` = 0.76299062675687)
>

loan_train_data

> dput(loans_train_data[1:20,])
structure(list(loan_id = c(551879L, 442449L, 187882L, 619315L, 
453195L, 513713L, 647765L, 296L, 571832L, 128305L, 358197L, 26517L, 
12653L, 374086L, 305620L, 197445L, 307835L, 331697L, 550455L, 
301842L), amount = c(8400L, 15000L, 15600L, 12000L, 9975L, 21000L, 
20000L, 7500L, 21000L, 16000L, 4800L, 25000L, 7500L, 15600L, 
3000L, 3900L, 20125L, 25000L, 11975L, 11825L), term = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 2L, 2L), .Label = c("36", "60"), class = "factor"), rate = c(0.12, 
0.1, 0.12, 0.15, 0.16, 0.12, 0.09, 0.12, 0.11, 0.09, 0.13, 0.2, 
0.07, 0.17, 0.07, 0.19, 0.19, 0.08, 0.15, 0.1), payment = c(280.17, 
483.94, 518.07, 415.93, 348.78, 700.42, 640.57, 250.51, 687.42, 
510.07, 161.02, 928.97, 233.27, 556.11, 92.49, 143.89, 521.95, 
785.49, 282.69, 251.19), grade = structure(c(5L, 6L, 6L, 5L, 
4L, 5L, 6L, 5L, 6L, 6L, 5L, 3L, 7L, 4L, 7L, 4L, 3L, 6L, 5L, 6L
), .Label = c("-1", "10", "20", "40", "60", "80", "100"), class = "factor"), 
    employment = c("store manager", "", "IT Director", "IT Specialist", 
    "Patient Serbice Rep", "Manager", "Service Technician", "E-6", 
    "Pharmacist/Pharmacy Supervisor", "Direct Sales Supervisor", 
    "Documement Associate", "Project Manager - Training", "Senior Accountant", 
    "Executive Assistant", "Chef", "Retail Sales, Production Assistant", 
    "Legislative Auditor", "System Specialist", "Lab Tech", "Store Manager"
    ), length = c(10, NA, 3, 6, 6, 4, 10, 8, 6, 3, 6, 10, 3, 
    1, 10, 5, 10, 10, 10, 4), home = structure(c(2L, 2L, 3L, 
    1L, 3L, 3L, 1L, 3L, 1L, 2L, 3L, 2L, 3L, 1L, 3L, 2L, 1L, 1L, 
    1L, 3L), .Label = c("MORTGAGE", "OWN", "RENT"), class = "factor"), 
    income = c(49600, 62255, 131000, 80000, 60000, 116000, 80000, 
    75132, 115000, 68000, 28000, 70000, 70000, 79000, 50000, 
    36000, 58000, 78900, 30000, 82000), verified = structure(c(2L, 
    1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 3L, 2L, 2L, 
    2L, 1L, 2L, 2L), .Label = c("Not Verified", "Source Verified", 
    "Verified"), class = "factor"), status = structure(c(3L, 
    3L, 3L, 1L, 1L, 3L, 3L, 3L, 1L, 3L, 1L, 1L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L), .Label = c("Charged Off", "Default", "Fully Paid"
    ), class = "factor"), reason = structure(c(4L, 2L, 3L, 3L, 
    3L, 2L, 2L, 8L, 3L, 3L, 3L, 3L, 3L, 9L, 9L, 4L, 2L, 4L, 2L, 
    3L), .Label = c("car", "credit_card", "debt_consolidation", 
    "home_improvement", "house", "major_purchase", "medical", 
    "moving", "other", "renewable_energy", "small_business", 
    "vacation", "wedding"), class = "factor"), state = structure(c(46L, 
    21L, 30L, 2L, 5L, 11L, 14L, 5L, 37L, 42L, 42L, 44L, 33L, 
    8L, 19L, 11L, 41L, 14L, 3L, 33L), .Label = c("AK", "AL", 
    "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", 
    "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", 
    "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", 
    "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", 
    "UT", "VA", "VT", "WA", "WI", "WV", "WY"), class = "factor"), 
    debt_inc_rat = c(20.42, 14.9, 12.83, 20.07, 26.18, 15.26, 
    25.59, 6.01, 21.07, 10.94, 31.2, 13.12, 9.33, 1.2, 11.74, 
    27.7, 26.65, 19.24, 23.4, 21.84), delinq2yr = c(1L, 0L, 1L, 
    1L, 0L, 0L, 0L, 1L, 0L, 2L, 0L, 1L, 0L, 2L, 0L, 0L, 0L, 0L, 
    0L, 0L), inq6mth = c(1L, 3L, 1L, 3L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), open_acc = c(10L, 
    13L, 9L, 14L, 11L, 4L, 11L, 6L, 18L, 11L, 8L, 9L, 13L, 5L, 
    16L, 16L, 7L, 26L, 4L, 19L), pub_rec = c(1L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
    0L), revol_ratio = c(0.22, 0.53, 0.62, 0.61, 0.58, 0.78, 
    0.66, 0.04, 0.85, 0.46, 0.46, 0.92, 0.59, 0.32, 0.21, 0.72, 
    0.85, 0.57, 0.64, 0.23), total_acc = c(26L, 17L, 29L, 35L, 
    20L, 8L, 18L, 8L, 40L, 16L, 14L, 28L, 26L, 11L, 26L, 36L, 
    24L, 41L, 15L, 36L), total_paid = c(10004.43161, 17053.23761, 
    17788.62, 8909.41, 2424.16, 22618.02, 23069.03794, 8820.741039, 
    20586.97, 18349.10828, 1213.64, 18590.71, 8394.285943, 16982.69, 
    3293.165743, 5093.61, 21429.4, 25922.82, 12875.89999, 12959.12
    ), total_bal = c(175097L, 25184L, 39845L, 276866L, 44292L, 
    66042L, 233534L, 7059L, 219927L, 114621L, 29741L, 335392L, 
    46661L, 114486L, 22527L, 40819L, 176379L, 238772L, 57456L, 
    71201L), total_rev_lim = c(19000L, 47100L, 25700L, 13040L, 
    17900L, 65500L, 72100L, 39800L, 64900L, 20100L, 28200L, 20700L, 
    7100L, 9600L, 55700L, 7200L, 27000L, 8300L, 7200L, 34300L
    ), acc_open24 = c(4L, 7L, 6L, 8L, 3L, 2L, 3L, 2L, 9L, 4L, 
    2L, 4L, 2L, 2L, 1L, 13L, 4L, 3L, 3L, 6L), avg_bal = c(17510L, 
    1937L, 4427L, 21297L, 4027L, 16511L, 23353L, 1177L, 12937L, 
    10420L, 4249L, 47913L, 3589L, 22897L, 1408L, 2721L, 25197L, 
    9184L, 14364L, 4188L), bc_open = c(6690L, 19007L, 7940L, 
    2267L, 5888L, 7758L, 16881L, 35401L, 782L, 5818L, 12515L, 
    0L, 2942L, 0L, 35319L, 1834L, 360L, 2316L, 2600L, 23337L), 
    bc_ratio = c(14.2, 56.6, 66.5, 77, 33.8, 80.8, 57.9, 3.8, 
    98.4, 49.4, 49.3, 102.2, 58.6, 103.7, 20.5, 67.8, 98.5, 66.9, 
    63.9, 25), total_lim = c(207427L, 47352L, 57626L, 292092L, 
    69796L, 88066L, 298525L, 57181L, 259850L, 131377L, 54172L, 
    361379L, 53648L, 124005L, 69108L, 69822L, 201136L, 253377L, 
    73564L, 114318L), total_rev_bal = c(31782L, 25184L, 39845L, 
    44598L, 44292L, 66042L, 84958L, 7059L, 134381L, 23389L, 29741L, 
    25022L, 46661L, 3088L, 22527L, 23481L, 81434L, 94468L, 33134L, 
    71201L), total_bc_lim = c(7800L, 43800L, 23700L, 6800L, 8900L, 
    40500L, 40100L, 36800L, 48200L, 11500L, 24700L, 16800L, 7100L, 
    2000L, 44400L, 5700L, 23400L, 7000L, 7200L, 31100L), total_il_lim = c(38991L, 
    0L, 31926L, 44052L, 51896L, 22566L, 71125L, 17381L, 104950L, 
    14140L, 25972L, 10000L, 46548L, 0L, 13408L, 28244L, 59542L, 
    99477L, 32892L, 80018L), statusRank = structure(c(2L, 2L, 
    2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("0", "1"), class = "factor")), row.names = c(11413L, 
2561L, 25337L, 1643L, 14264L, 24191L, 33989L, 28193L, 21129L, 
7895L, 29007L, 26622L, 3065L, 11423L, 3953L, 5789L, 30150L, 6070L, 
1486L, 13195L), class = "data.frame")
> 

Трассировка данных от строки отладки ()

Когда выполняется код R, из предыдущего оператора выдается следующая строка (csa.cmt):

csa.cmt <- compute_matrix.func(csa.func.p, csa.func.confusion_table)

Однако обработка разницы в «одинаковых уровнях» была кодируется для обработки и исправления в вызываемой / вызываемой функции 'compute_confusion_table.fun c'

> csa_computed_accuracies <- sapply(compute_for_values, compute_seq_accuracy.func, simplify = FALSE)
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
List of 2
 $ message: chr "`data` and `reference` should be factors with the same levels."
 $ call   : NULL
 - attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
> 
...