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