#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)