Поиск соответствующего узла в дереве регрессии с помощью rpart

Я довольно плохо знаком с R и застрял с довольно тупой проблемой.

Я калибрую дерево регрессии, используя пакет rpart, чтобы выполнить некоторую классификацию и прогнозирование.

Благодаря R калибровочную часть легко выполнять и легко контролировать.

#the package rpart is needed
library(rpart)

# Loading of a big data file used for calibration
my_data <- read.csv("my_file.csv", sep=",", header=TRUE)

# Regression tree calibration
tree <- rpart(Ratio ~ Attribute1 + Attribute2 + Attribute3 + 
                      Attribute4 + Attribute5, 
                      method="anova", data=my_data, 
                      control=rpart.control(minsplit=100, cp=0.0001))

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

# read validation data
validationData <-read.csv("my_sample.csv", sep=",", header=TRUE)

# search for the probability in the tree
predict <- predict(tree, newdata=validationData, class="prob")

# dump them in a file
write.table(predict, file="dump.txt") 

Однако с predict метод Я просто получаю прогнозируемое соотношение моих новых элементов и не могу найти способ получить лист дерева решений, где мои новые элементы принадлежат.

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

Есть несколько параметров, которые могут быть заданы для метода прогнозирования через class= аргумент, но для дерева регрессии все, кажется, возвращают одно и то же (значение целевого атрибута дерева решений)

Кто-нибудь знает, как получить соответствующий узел в дереве решений?

Анализируя узел с path.rpart метод, это поможет мне понять результаты.

4 ответа

Ответ Бенджамина, к сожалению, не работает: type="vector" по-прежнему возвращает прогнозируемые значения.

Мое решение довольно клёвое, но я не думаю, что есть лучший способ. Хитрость заключается в том, чтобы заменить предсказанные значения y в фрейме модели соответствующими номерами узлов.

tree2 = tree
tree2$frame$yval = as.numeric(rownames(tree2$frame))
predict = predict(tree2, newdata=validationData)

Теперь вывод предикта будет представлять собой номера узлов, а не предсказанные значения y.

(Одно примечание: вышеупомянутое сработало в моем случае, когда tree было деревом регрессии, а не деревом классификации. В случае дерева классификации вам, вероятно, нужно пропустить as.numeric или заменить его на as.factor.)

Вы можете использовать пакет partykit:

fit <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)

library("partykit")
fit.party <- as.party(fit)
predict(fit.party, newdata = kyphosis[1:4, ], type = "node")

Для вашего примера просто установите

predict(as.party(tree), newdata = validationData, type = "node")

Я думаю, что вы хотите type="vector" вместо class="prob" (Я не думаю, что класс является допустимым параметром метода предсказания), как объяснено в документации rpart:

If type = "vector": вектор предсказанных ответов. Для деревьев регрессии это средняя реакция в узле, для деревьев Пуассона это предполагаемая скорость отклика, а для деревьев классификации это прогнозируемый класс (как число).

  1. rpart.predict.leaves(tree, validationData) возвращает номер узла
  2. также tree$where возвращает номера узлов для обучающего набора
Другие вопросы по тегам