Поиск соответствующего узла в дереве регрессии с помощью rpart - PullRequest
7 голосов
/ 24 февраля 2011

Я довольно плохо знаком с 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 методом Iпросто получите прогнозируемое соотношение моих новых элементов, и я не могу найти способ получить лист дерева решений , где мои новые элементы принадлежат.

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

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

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

Анализируя узелс помощью метода path.rpart это помогло бы мне понять результаты.

Ответы [ 3 ]

12 голосов
/ 21 июня 2011

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

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

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

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

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

2 голосов
/ 06 июня 2016

Вы можете использовать пакет 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")
1 голос
/ 10 марта 2011

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

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

...