Как включить весы в критерии minsplit
в rpart
, когда весы неровные? Я не мог найти путь для порога minsplit
, чтобы принять во внимание веса, а когда весы неравномерны, это становится проблемой, как показывает следующий пример. Мое текущее обходное решение состоит в том, чтобы развернуть данные в один, в котором каждая строка является наблюдением, но это кажется расточительным как во времени, так и в памяти (и я сомневаюсь, что могу сохранить реальные наборы данных, которые мне нужно использовать в памяти в их расширенной форме), таким образом - обращение за помощью. Заранее за вашу помощь, -SaarИспользование minsplit и неравных весов в rpart
Следующий код показывает, в чем проблема; первые три дерева одинаковы, но следующие два (с неравномерными весами) оказываются по-разному:
## playing with rpart weights
require(rpart)
dev.new()
par(mfrow=c(2,3), xpd=NA)
data(kyphosis)
fitOriginal <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis, control=rpart.control(minsplit=15))
plot(fitOriginal)
text(fitOriginal, use.n=TRUE)
# this dataset is the original data repeated 3 times
kyphosisRepeated <- rbind(kyphosis, kyphosis, kyphosis)
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=45))
plot(fitRepeated)
text(fitRepeated, use.n=TRUE)
# instead of repeating, use weights
kyphosisWeighted <- kyphosis
kyphosisWeighted$myWeights <- 3
fitWeighted <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisWeighted, weights=myWeights,
control=rpart.control(minsplit=15)) ## minsplit has to be adjusted for weights...
plot(fitWeighted)
text(fitWeighted, use.n=TRUE)
# uneven weights don't works the same way
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis)
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)))
fitUneven15 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights,
control=rpart.control(minsplit=15))
plot(fitUneven15)
text(fitUneven15, use.n=TRUE)
fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights,
control=rpart.control(minsplit=45))
plot(fitUneven45)
text(fitUneven45, use.n=TRUE)
## 30 works, but seems like a special case
fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights,
control=rpart.control(minsplit=30))
plot(fitUneven30)
text(fitUneven30, use.n=TRUE)
Я пытаюсь работать с несбалансированными весами и minsplit на общем наборе данных, и пример показывает, что он не работает. Балансировка весов не является общим решением, это может привести к слишком большому набору данных. – Saar
@ Саар, прошу прощения, если я пропущу что-то очевидное. Вы говорите, что примеры показывают, что «это не работает». Каким образом это не работает? Когда я тестировал примеры, дерево выросло в каждом из них без каких-либо ошибок. Разве одно из деревьев росло так, как вы этого не ожидали? – Ben
Во всех 6 примерах данные представляют собой одни и те же данные, представленные разными способами (за исключением первого примера): либо каждое наблюдение повторяется три раза, появляются один раз, но имеют вес 3 или появляются дважды с весами, которые составляют до 3 Я бы ожидал, что деревья, которые построены из него, будут одним и тем же деревом (одни и те же данные, один и тот же алгоритм, одни и те же условия должны приводить к тем же выходам). В частности, пятый пример должен дать мне то же дерево, что и второй и третий. Это не так. Речь идет не о ошибках времени выполнения, а о возврате неправильных ответов ... – Saar