Есть ли способ сохранить результаты в функции for_loop? - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно вычислить точность модели по диапазону значений. Мне нужно создать цикл for для подачи в этот диапазон значений, а затем сохранить эти выходные данные в пустом фрейме данных.

Я попытался использовать свой опыт работы с Python, чтобы изначально создать пустой список, и попытался выполнить цикл for для диапазона значений.

Train_Rest_Loop Dataframe:

  ground Rest_Cos_Sim
1      1         0.25
2      1         0.20
3      1         0.35
4      1         0.25
5      1         0.25
6      0         0.30


cos_sim_values <- seq(0,1, by=0.05)
Accuracy <- matrix(NA, nrow=21, ncol=2) # Empty Matrix

for (i in cos_sim_values) {
train_rest_loop['Rest_Cos_Sim'] <- ifelse(train_rest_loop$Rest_Cos_Sim >= i, 1,0)
cm_train_rest <- table(train_rest_loop$ground, train_rest_loop$Rest_Cos_Sim)
cm_train_rest <- caret :: confusionMatrix(cm_train_rest, mode = "prec_recall", positive="1") 
Accuracy[i,] <- as.vector(cm_train_rest$overall['Accuracy']) }

Error in !all.equal(nrow(data), ncol(data)) : invalid argument type

Фактических результатов нет, потому что код не запускается, см. Сообщение об ошибке выше.

Я бы ожидал список значений точности:

  cos_sim_values Accuracy
1      0.1          0.25
2      0.15         0.20
3      0.20         0.35
4      0.25         0.25
5      0.30         0.25
6      0.40         0.30

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Сообщение об ошибке приходит из строки

cm_train_rest <- caret :: confusionMatrix(cm_train_rest, mode = "prec_recall", positive="1")

и говорит, что cm_train_rest должно иметь такое же количество столбцов и строк, что не имеет место.

К вашему основному вопросу:

Accuracy[i,] <- as.vector(cm_train_rest$overall['Accuracy'])

также не будет работать, поскольку я храню в вас значения cos_sim_values ​​, которые нельзя использовать в качестве индекса.

Кроме того, в

train_rest_loop['Rest_Cos_Sim'] <- ifelse(train_rest_loop$Rest_Cos_Sim >= i, 1,0)

вы перезаписываете столбец Rest_Cos_Sim того, что вам, возможно, не нужно.

Возможно, следующее приближает вас к ожидаемому результату:

library("caret")
library("e1071")

cos_sim_values <- seq(0,1, by=0.05)
Accuracy <- matrix(NA, nrow=length(cos_sim_values), ncol=2) # Empty Matrix

train_rest_loop <- data.frame(ground=factor(c(1,1,1,1,1,0)), Rest_Cos_Sim=c(0.25,0.20,0.35,0.25,0.25,0.30))

for (idx in 1:length(cos_sim_values)) { #use idx as an index which ranges from 1 to the length of cos_sim_values
  i <- cos_sim_values[idx]  #Get the idx'th values of cos_sim_values
  tt <- factor(ifelse(train_rest_loop$Rest_Cos_Sim >= i, 1,0), levels = c(0,1))
  cm_train_rest <- table(train_rest_loop$ground, tt)
  cm_train_rest <- caret :: confusionMatrix(cm_train_rest, mode = "prec_recall", positive="1") 
  Accuracy[idx,] <- c(i, as.vector(cm_train_rest$overall['Accuracy']))
}
0 голосов
/ 03 апреля 2019

Один из способов использования lapply вместо цикла и tryCatch в случае ошибки:
Я использовал as.integer(condition), а не ifelse, поскольку в результате получается двоичный файл 1 или 0.

library(caret)
library(e1071)

cos_sim_values <- seq(0, 1, by = 0.05)

result_list <- lapply(cos_sim_values, function(csvals){
  trl[['Rest_Cos_Sim']] <- as.integer(train_rest_loop$Rest_Cos_Sim >= csvals)
  trl[['Rest_Cos_Sim']] <- factor(trl[['Rest_Cos_Sim']], levels = 0:1)
  cm_train_rest <- table(trl)
  cm_train_rest <- tryCatch(confusionMatrix(cm_train_rest, mode = "prec_recall", positive = "1"),
                            error = function(e) e)
})

ok <- !sapply(result_list, inherits, "error")
result_list[ok]

Accuracy <- sapply(result_list[ok], '[[', 'overall')[1, ]
Accuracy
# [1] 0.8333333 0.8333333 0.8333333 0.8333333 0.8333333
# [6] 0.6666667 0.3333333 0.1666667 0.1666667 0.1666667
#[11] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
#[16] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
#[21] 0.1666667

Данные.

train_rest_loop <- read.table(text = "
  ground Rest_Cos_Sim
1      1         0.25
2      1         0.20
3      1         0.35
4      1         0.25
5      1         0.25
6      0         0.30
", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...