caret :: confusionMatrix на итерации, которая вычисляет таблицу сопряженности, но не может создать объект confusionMatrix - PullRequest
0 голосов
/ 08 апреля 2020

Область действия:

[ОБНОВЛЕНИЕ кода.] Для вычисления чувствительности, специфичности, точности confusionMatrix () по al oop или последовательности значений в диапазоне от seq (0,1,0,9) , = 0,1).

Проблема с confusionMatrix ()

[ОБНОВЛЕНИЕ кода.] Используя функцию caret :: confusionMatrix, у меня есть переменные для построения confusionMatrix внутри функции (compute_seq_accuracy.fun c). Try / Catch не показывает никаких ошибок; НО, эта функция НЕ создает confusionMatrix, когда caret :: confusionMatrix (csa.fun c .p, csa.fun c .confusion_table).

Это не главная проблема, которую необходимо решить в этот код, другие ошибки были исправлены мной при изменении набора данных.

Цель:

Для итерации значений: от 0,1 до 0,9, на 0,1, вычисление чувствительности, специфичность, точность из пользовательской кодированной функции confusionMatrix, которая обрабатывает ошибки уровня, когда caret :: confusionMatrix error'd, когда уровни были разными.

Нулевые записи были удалены.

Решение RIP WIP

Это код R, работа в процессе, функция compute_seq_accuracy.fun c () выполняется без ошибок, однако теперь таблица сопряженности, созданная внутри функции compute_confusion_matrix.fun c (), не получает create и возвращается из функции return. следующая трассировка данных взята из внутреннего оператора печати, который показывает таблицу непредвиденных расходов, созданную для каждой оценки порога:

## function
compute_seq_accuracy.func <- function(value) {
        tryCatch({
                csa.func.p <- factor(ifelse(loans_predict < value, 0, 1))
                csa.func.confusion_table <- compute_confusion_matrix.func(loans_train_data$statusRank, csa.func.p)
                tryCatch({
                        csa.cmt <- compute_matrix.func(csa.func.p, csa.func.confusion_table)
                }, 
                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)
                return(cm.func.confusion_matrix)   ### $overall['Accuracy'])
        }, 
        error = function(e) return(e)
        )
}

## function
compute_confusion_matrix.func <- function(y, p) {
        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)
}

## process run
compute_for_values = seq(0.1,0.9, by=0.1)
csa_computed_accuracies <- sapply(compute_for_values, compute_seq_accuracy.func, simplify = FALSE)

функция вернула переменную: csa_computed_accuracies, матрица создана, сообщение об ошибке внутри матрицы, читает следующее:

> csa_computed_accuracies
[[1]]
<simpleError in dimnames(x) <- dn: length of 'dimnames' [1] not equal to array extent>

Трассировка данных

Try ... Catch установлено, предупреждающих сообщений нет. Однако когда вызывается строка csa.fun c .confusion_matrix <- caret :: confusionMatrix (), объект confusionMatrix не создается. И не пытаться ... Выдается ошибка или выдается предупреждение: </p>

> csa_computed_accuracies <- sapply(compute_for_values, compute_seq_accuracy.func, simplify = FALSE)
      p
y          0     1
  Bad      4  6009
  Good     0 21411
      p
y          0     1
  Bad     38  5975
  Good    15 21396
      p
y          0     1
  Bad    225  5788
  Good   133 21278
      p
y          0     1
  Bad    702  5311
  Good   533 20878
      p
y          0     1
  Bad   1575  4438
  Good  1614 19797
      p
y          0     1
  Bad   2836  3177
  Good  4002 17409
      p
y          0     1
  Bad   4382  1631
  Good  8646 12765
      p
y          0     1
  Bad   5627   386
  Good 15856  5555
> 

> csa_computed_accuracies
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
[[6]]
NULL
[[7]]
NULL
[[8]]
NULL
[[9]]
NULL

> 

Частичная коррекция

Исправленный набор данных:

 head(loans_predict,50)
    11413      2561     25337      1643     14264     24191     33989     28193     21129      7895     29007     26622      3065 
0.8375821 0.7516343 0.8375704 0.7671279 0.7201578 0.7917037 0.8980501 0.8259884 0.8604232 0.8664207 0.7609676 0.7753622 0.9321958 
    11423      3953      5789     30150      6070      1486     13195     30344     26721       716     24609     22196     10770 
0.8325967 0.9459098 0.5903160 0.5997290 0.9045176 0.6782181 0.7546154 0.8381577 0.7943421 0.7198638 0.4522069 0.7129170 0.8632025 
    18042      3710     21750     23492     10680      5088     10434      3228      8696     29688     33847      2997     24772 
0.8941667 0.6445716 0.7659989 0.2616490 0.7402274 0.7115220 0.8985310 0.7300686 0.8737217 0.6712457 0.7037675 0.6868837 0.7534947 
    28396      6825     27619     26433     25542     33853     32926     33585     20362      6895     20634 
0.7516796 0.7261610 0.8437550 0.8662871 0.8620579 0.9355447 0.6786310 0.6017286 0.9340776 0.9022817 0.7832571 
> 
> compute_for_values
[1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

1 Ответ

1 голос
/ 08 апреля 2020

Подумайте об обёртывании вашего метода в tryCatch, чтобы перехватить исключения и вернуть NULL при ошибке, которую вы можете исследовать далее, которая 0.1 вызывает ошибку, и такие NULL элементы могут быть удалены с Filter в конце. Ниже также используется sapply (оболочка для lapply), которая возвращает именованный список, если в качестве входных данных используется вектор символов.

compute_seq_accuracy.func <- function(value) {
     tryCatch({
        p <- factor(ifelse(loans_predict_fcm < as.numeric(value), 'Bad', 'Good')) 
        confusion_table <- compute_confusion_matrix(loans_train_data$statusRank, p) 
        c_matrix <- confusionMatrix(confusion_table) 
        return(c_matrix$overall['Accuracy']) 
     }, 
        # RETURN ERROR MESSAGE
        error = function(e) return(e)
     )
}

compute_for_values <- as.character(seq(0.1, 0.9, by=0.1))

## WIP error in !all.equal(nrow(data, ncol(data))) 
computed_accuracies <- sapply(compute_for_values, compute_seq_accuracy.func, simplify = FALSE)

# REMOVE NULLs FROM LIST
computed_accuracies <- Filter(LENGTH, computed_accuracies)
...