2012-01-03 2 views
5

Как включить весы в критерии 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) 

ответ

0

Здесь нет никаких проблем. Если вы используете набор данных в два раза больше, чем исходный набор данных, а затем требуете, чтобы minsplit был в 3 раза больше, чем ваш первоначальный minsplit, вы, конечно, собираетесь выращивать более короткое дерево (при условии, что относительные веса между весами остаются прежними). См. Эти пересмотренные примеры, которые показывают, что вы будете выращивать одинаковые одинаковые деревья, если вы сохраните относительность веса одинаково, а отношение minsplit/n тоже самое.

## playing with rpart weights 
require(rpart) 
dev.new() 
par(mfrow=c(2,2), xpd=NA) 
data(kyphosis) 

# this dataset is the original data repeated 2 times############################################################ 
# without weights 
kyphosisRepeated <- rbind(kyphosis, kyphosis) 
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=30)) 
plot(fitRepeated) 
text(fitRepeated, use.n=TRUE) 

# with weights 
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis) 
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis))) 

fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
        control=rpart.control(minsplit=30)) 
plot(fitUneven30) 
text(fitUneven30, use.n=TRUE) 
################################################################################################################ 

# this dataset is the original data repeated 3 times 
# without weights 
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) 

# with weights 
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis, kyphosis) 
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)), rep(3,length.out=nrow(kyphosis))) 

fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
        control=rpart.control(minsplit=45)) 
plot(fitUneven45) 
text(fitUneven45, use.n=TRUE) 

См this blog post для более подробной информации о RPart.

+0

Я пытаюсь работать с несбалансированными весами и minsplit на общем наборе данных, и пример показывает, что он не работает. Балансировка весов не является общим решением, это может привести к слишком большому набору данных. – Saar

+0

@ Саар, прошу прощения, если я пропущу что-то очевидное. Вы говорите, что примеры показывают, что «это не работает». Каким образом это не работает? Когда я тестировал примеры, дерево выросло в каждом из них без каких-либо ошибок. Разве одно из деревьев росло так, как вы этого не ожидали? – Ben

+0

Во всех 6 примерах данные представляют собой одни и те же данные, представленные разными способами (за исключением первого примера): либо каждое наблюдение повторяется три раза, появляются один раз, но имеют вес 3 или появляются дважды с весами, которые составляют до 3 Я бы ожидал, что деревья, которые построены из него, будут одним и тем же деревом (одни и те же данные, один и тот же алгоритм, одни и те же условия должны приводить к тем же выходам). В частности, пятый пример должен дать мне то же дерево, что и второй и третий. Это не так. Речь идет не о ошибках времени выполнения, а о возврате неправильных ответов ... – Saar

Смежные вопросы