Создайте двоичный результат со случайным лесом


У меня есть набор данных, который выглядит следующим образом:

 TEAM1         TEAM2     EXPG1  EXPG2         Gewonnen    
 ADO Den Haag  Groningen 1.5950 1.2672        1
Теперь я попытаюсь предсказать столбец Gewonnen на основе EXPG1 и EXPG2. Поэтому я создал обучающий и тестовый набор и создаю следующую модель (все с использованием rcaret):
modFit <- train(Gewonnen~ EXPG1 + EXPG2, data=training, method="rf", prox=TRUE)
Я не могу сделать матрицу путаницы сейчас, потому что мои данные имеют больше ссылок. Это верно, потому что когда я делаю:
pred <- predict(modFit, testing)
head(print)

Он говорит: 0.5324000 0.7237333 0.2811333 0.8231000 0.8299333 0.9792000

Потому что я хочу сделать матрицу путаницы, я не могу превратить их в 0/1, но у меня есть чувство что должна быть возможность сделать это и в модели.

Любые мысли о том, что я должен изменить в этой модели, чтобы создать значения 0/1. Я не смог найти его в документации:

modFit <- train(Gewonnen~ EXPG1 + EXPG2, data=training, method="rf", prox=TRUE)
2 2

2 ответа:

Прежде всего, как говорит Тим Бигелейзен, вы должны преобразовать вашу переменную Gewonnen в фактор (в обоих наборах обучения и тестирования), если это еще не так:

training$Gewonnen <- as.factor(training$Gewonnen)
testing$Gewonnen <- as.factor(testing$Gewonnen)
После этого параметр type в функции caret predict определяет, какой тип ответа вы получите для задачи бинарной классификации, т. е. метки классов или вероятности. Вот воспроизводимый пример из caret документация использование набора данных Sonar из пакета mlbench:
library(caret)
library(mlbench)
data(Sonar)
str(Sonar$Class)
# Factor w/ 2 levels "M","R": 2 2 2 2 2 2 2 2 2 2 ...

set.seed(998)
inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing  <- Sonar[-inTraining,]

modFit <- train(Class ~ ., data=training, method="rf", prox=TRUE)

pred <- predict(modFit, testing, type="prob") # for class probabilities
head(pred)
#        M     R
# 5  0.442 0.558
# 10 0.276 0.724
# 11 0.096 0.904
# 12 0.360 0.640
# 20 0.654 0.346
# 21 0.522 0.478

pred2 <- predict(modFit, testing, type="raw") # for class labels
head(pred2)
# [1] R R R R M M
# Levels: M R

Для матрица путаницы, вам понадобятся метки классов (например, pred2 выше):

confusionMatrix(pred2, testing$Class)
# Confusion Matrix and Statistics

#           Reference
# Prediction  M  R
#          M 25  6
#          R  2 18

Этот ответ является немного спекулятивным, поскольку вы опустили некоторые важные детали о вашем наборе данных, и я не работал широко с пакетом caret. Тем не менее, похоже, что вы запускаете случайные леса в режиме регрессии, что означает, что вы в конечном итоге получите непрерывную функцию. Это означает, что предсказания могут иметь значение отклика 0, 1, или что-нибудь среднее между 0 и 1. Если ваш столбец Gewonnen имеет только значения 0 или 1, и вы хотите если предсказанные значения также ведут себя подобным образом, то можно попробовать превратить Gewonnen в категориальную переменную. Как в этой статье обсуждается, это может заставить случайные леса работать в режиме классификации вместо регрессионного режима.

Gewonnen <- as.factor(Gewonnen)
Это создает случайный лес, как вы делали это раньше, и у вас должны быть ответы, которые вы хотите.