Использование minsplit и неравных весов в rpart - PullRequest
5 голосов
/ 03 января 2012

Как включить весовые коэффициенты в критерии minsplit в rpart, если весовые коэффициенты неравномерны?Я не смог найти способ для порога minsplit принять во внимание весовые коэффициенты, и когда весовые коэффициенты неравномерны, это становится проблемой, как показано в следующем примере.Мой текущий обходной путь заключается в расширении данных в данные, в которых каждая строка является наблюдением, но это кажется расточительным как во времени, так и в памяти (и я сомневаюсь, что в любом случае я могу сохранить реальные наборы данных, с которыми мне нужно работать, в памяти в их расширенной форме)Таким образом - обращаясь за помощью.Заранее благодарим за помощь, -Saar

Следующий код показывает, в чем проблема;первые 3 дерева одинаковы, но следующие два (с неравномерным весом) получаются по-разному:

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

1 Ответ

0 голосов
/ 26 сентября 2014

Здесь нет проблем.Если вы используете набор данных, вдвое превышающий исходный набор данных, а затем требует, чтобы 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)

См. этот пост в блоге для более подробной информации о RPart.

...