Как работать с 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
который связан оттуда (по какой-то причине не в ссылке, которую вы предоставили), далее говорит "такой же длины, чем response
Msgstr "Вы передаете числовую матрицу с 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 (мкг / л), вероятно, в образце крови.