2012-01-03 13 views
5

Come si incorporano i pesi nei criteri minsplit in rpart, quando i pesi non sono uniformi? Non sono riuscito a trovare un modo per la soglia minsplit per tenere in considerazione i pesi e quando i pesi sono irregolari diventa un problema, come mostra il seguente esempio. La mia soluzione attuale è quella di espandere i dati in uno in cui ogni riga è un'osservazione, ma ciò sembra uno spreco sia nel tempo che nella memoria (e dubito di poter mantenere i set di dati reali di cui ho bisogno in memoria nella loro forma espansa comunque), quindi - cercando aiuto. Grazie per l'aiuto, -SaarUtilizzo di pesi minimi e disuguali in rpart

Il seguente codice mostra qual è il problema; i primi 3 alberi sono uguali, ma i due seguenti (con pesi non uniformi) risultano diversi:

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

risposta

0

Non c'è nessun problema qui. Se si utilizza un set di dati due volte più grande del set di dati originale e quindi si richiede minsplit per essere 3 volte più grande del minisplit originale, ovviamente si farà crescere un albero più corto (assumendo che le relatività tra i pesi rimangano le stesse). Vedi questi esempi rivisti che mostrano che coltiverai alberi identici identici se manterrai le relatività del peso uguali e anche il rapporto di minsplit/n lo stesso.

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

Vedere this blog post per maggiori dettagli su RPart.

+0

Sto provando a lavorare con pesi non bilanciati e minsplit su un set di dati generale, e l'esempio mostra che non funziona. Il bilanciamento dei pesi non è una soluzione generale, potrebbe causare un set di dati troppo grande. – Saar

+0

@ Saar, mi scuso se mi manca qualcosa di ovvio. Dici che gli esempi mostrano "non funziona". In che modo non funziona? Quando ho testato gli esempi, un albero è cresciuto in ciascuno di essi senza errori. Uno degli alberi cresceva come non te l'aspettavi? – Ben

+0

In tutti i 6 esempi i dati sono gli stessi dati, rappresentati in modi diversi (eccetto il primo esempio): ciascuna osservazione ripetuta tre volte, appare una volta ma ha il peso di 3, o appare due volte con pesi che sommano a 3 Mi aspetterei che gli alberi che vengono creati siano lo stesso albero (gli stessi dati, lo stesso algoritmo, le stesse condizioni dovrebbero portare agli stessi output). Nello specifico, il quinto esempio dovrebbe darmi lo stesso albero del secondo e terzo esempio. Non è così. Non si tratta di errori di runtime, si tratta di ottenere le risposte sbagliate indietro ... – Saar