Вычисление точности прогнозирования дерева с использованием метода прогнозирования rpart

#r #machine-learning #decision-tree #rpart

#r #машинное обучение #дерево решений #rpart

Вопрос:

Я построил дерево решений, используя rpart для набора данных.

Затем я разделил данные на 2 части — обучающий набор данных и тестовый набор данных. Для набора данных было построено дерево с использованием обучающих данных. Я хочу рассчитать точность прогнозов на основе созданной модели.

Мой код показан ниже:

 library(rpart)
#reading the data
data = read.table("source")
names(data) <- c("a", "b", "c", "d", "class")

#generating test and train data - Data selected randomly with a 80/20 split
trainIndex  <- sample(1:nrow(x), 0.8 * nrow(x))
train <- data[trainIndex,]
test <- data[-trainIndex,]

#tree construction based on information gain
tree = rpart(class ~ a   b   c   d, data = train, method = 'class', parms = list(split = "information"))
 

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

Мой код показан ниже:

 t_pred = predict(tree,test,type="class")
t = test['class']
accuracy = sum(t_pred == t)/length(t)
print(accuracy)
 

Я получаю сообщение об ошибке, в котором говорится —

Ошибка в t_pred == t: сравнение этих типов дополнительно не реализовано: Предупреждающее сообщение: Несовместимые методы («Ops.factor», «Ops.data.frame») для «==»

При проверке типа t_pred я обнаружил, что он имеет тип integer, однако документация

(https://stat.ethz.ch/R-manual/R-devel/library/rpart/html/predict.rpart.html )

указывает, что predict() метод должен возвращать вектор.

Я не могу понять, почему тип переменной является целым числом, а не списком. Где я допустил ошибку и как я могу ее исправить?

Ответ №1:

Попробуйте сначала вычислить матрицу путаницы:

 confMat <- table(test$class,t_pred)
 

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

 accuracy <- sum(diag(confMat))/sum(confMat)
 

Комментарии:

1. Спасибо, это сработало. Однако я все еще не понимаю метод прогнозирования. Что именно он возвращает и почему это целое число? Когда я печатаю t_pred, это выглядит как матрица.

2. Трудно сказать, что происходит, без воспроизводимого примера.

3. Я использовал набор данных Iris для приведенного выше примера, но это нормально. Теперь я понял это. Еще раз спасибо за ваш ответ.

Ответ №2:

Мой ответ очень похож на ответ @mtoto, но немного проще… Я надеюсь, что это также поможет.

 mean(test$class == t_pred)