Ошибка при прогнозировании значения модели в файле cv.glm по несбалансированным данным тестирования и обучения - PullRequest
0 голосов
/ 27 октября 2018

У меня есть модель, предсказанная с использованием логистической регрессии с использованием 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 и как избавиться отвышеупомянутая ошибка.Спасибо

1 Ответ

0 голосов
/ 27 октября 2018

Несбалансированность не имеет ничего общего с этой ошибкой.Во-первых, 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"))

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

...