Как работать с ROC-анализом нескольких классов в R (пакет pROC)?

Например, когда я использую функцию multiclass.roc в R (пакет pROC), я обучил набор данных случайным лесом, вот мой код:

# randomForest & pROC packages should be installed:
# install.packages(c('randomForest', 'pROC'))
data(iris)
library(randomForest)
library(pROC)
set.seed(1000)
# 3-class in response variable
rf = randomForest(Species~., data = iris, ntree = 100)
# predict(.., type = 'prob') returns a probability matrix
multiclass.roc(iris$Species, predict(rf, iris, type = 'prob'))

И результат:

Call:
multiclass.roc.default(response = iris$Species, predictor = predict(rf,     
iris, type = "prob"))
Data: predict(rf, iris, type = "prob") with 3 levels of iris$Species: setosa,   
versicolor, virginica.
Multi-class area under the curve: 0.5142

Это правильно? Спасибо!!!

Ссылка "pROC": http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

3 ответа

Решение

Как вы видели в ссылке, multiclass.roc ожидает "числовой вектор (...)" и документацию roc который связан оттуда (по какой-то причине не в ссылке, которую вы предоставили), далее говорит "такой же длины, чем responseMsgstr "Вы передаете числовую матрицу с 3 столбцами, что явно неверно и больше не поддерживается со времен pROC 1.6. Я понятия не имею, что он делал раньше, возможно, не то, что вы ожидали.

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

predictions <- as.numeric(predict(rf, iris, type = 'response'))
multiclass.roc(iris$Species, predictions)

Что действительно делает этот код, так это вычислить 3 кривые ROC для ваших прогнозов (одна с сетозой и версиколором, одна с версиколой против девственницы и одна с сетозой против девственницы) и усреднить их AUC.

Еще три комментария:

  • Я говорю, что преобразование коэффициента в числовой не имеет смысла, потому что вы получите другие результаты, если у вас нет идеальной классификации и вы переупорядочите уровни. Вот почему это не делается автоматически в pROC: вы должны подумать об этом при настройке.
  • В целом, это мультиклассовое усреднение не имеет смысла, и вам лучше переосмыслить свой вопрос с точки зрения бинарной классификации. Существуют более продвинутые мультиклассовые методы (с поверхностью ROC и т. Д.), Которые еще не реализованы в pROC
  • Как было сказано @cbeleites, неправильно оценивать модель с данными обучения (повторное замещение), поэтому в реальном примере вы должны оставить набор тестов в стороне или использовать перекрестную проверку.

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

Я быстро попытался получить прогноз с помощью типа "проб", но безуспешно. Таким образом, вам нужно будет сделать проверку вне randomForest функция.

Лично я бы не пытался объединить всю мультиклассовую модель в одно безусловное число. Но это совершенно другой вопрос.

Я скопировал ваш код и получил AUC 0,83. Не уверен, что отличается.

Вы правы, s100b столбец не является вероятностью. Набор данных aSAH (Аневризма субарахноидального кровоизлияния) представляет собой набор клинических данных. s100b - это белок, содержащийся в глиальных клетках мозга. Из исследовательской работы на наборе данных, s100b колонка, по-видимому, представляет концентрацию белка s100b (мкг / л), вероятно, в образце крови.

Другие вопросы по тегам