Ошибка при прогнозировании встроенной модели в cv.glm на несбалансированных тестовых и обучающих данных

У меня есть модель, предсказанная с использованием логистической регрессии с использованием cv.glm в наборе обучающих данных, и когда я предсказываю ее на testdata и пытаюсь создать матрицу путаницы, она выдает ошибку. Классы как поезда, так и набора testdata несбалансированы.

Вот размеры наборов тестовых и обучающих данных. И мои traindata, и testdata взяты из большого набора данных из 1234 столбцов и 60 строк. Я случайным образом разделил их на два набора, чтобы в конце проверить чувствительность и специфичность классификации.

> dim(traindata)
   40 1234
> dim(testdata)
[1]   20 1234

И это то, что я пробовал.

Subtype   = factor(traindata$Subtype) 
CV=cv.glmnet(x=data.matrix(traindata),y=Subtype,standardize=TRUE,alpha=0,nfolds=3,family="multinomial")
response_predict=predict(CV, data.matrix(testdata),type="response")
predicted = as.factor(names(response_predict)[1:3][apply(response_predict[1:3], 1, which.max)])

Здесь он выдает ошибку как:

Error in apply(response_predict[1:3], 1, which.max) : 
  dim(X) must have a positive length

Мой вопрос заключается в том, чтобы продолжить работу с таким несбалансированным набором данных, используя cv.glmи как избавиться от вышеупомянутой ошибки. Спасибо


person user1017373    schedule 27.10.2018    source источник


Ответы (1)


Дисбаланс не имеет ничего общего с этой ошибкой. Во-первых, response_predict — это массив, а не матрица и не фрейм данных. По этой причине последняя строка должна быть

predicted <- as.factor(colnames(response_predict[, , 1])[1:3][apply(response_predict[, 1:3, 1], 1, which.max)])

То есть, поскольку мы имеем дело с трехмерным массивом, у нас есть три индекса. Также response_predict[1:3] означало всего три числа, а не три столбца массива. И поскольку response_predict не является фреймом данных, names не собирался давать вам имена его столбцов.

Но на самом деле все это можно записать, предполагая наличие трех возможных классов, просто как

predicted <- as.factor(colnames(response_predict)[apply(response_predict, 1, which.max)])

что намного чище. Я думаю, вы также знаете, что

predicted <- as.factor(predict(CV, data.matrix(testdata), type = "class"))

тоже дает тот же результат.

person Julius Vainora    schedule 27.10.2018
comment
@ user1017373, это ответ на твой вопрос? - person Julius Vainora; 08.11.2018