4

minsplitウェイトが不均一な場合、ウェイトを の基準に組み込むにはどうすればよいrpartですか? minsplitしきい値が重みを考慮に入れる方法を見つけることができませんでした。次の例に示すように、重みが不均一な場合は問題になります。私の現在の回避策は、データを各行が観測値になるように拡張することですが、それは時間とメモリの両方で無駄に思えます (とにかく、作業する必要がある実際のデータセットを拡張された形でメモリに保持できるとは思えません) 、したがって - 助けを求めます。よろしくお願いします -Saar

次のコードは、問題の内容を示しています。最初の 3 つのツリーは同じですが、次の 2 つ (重みが不均一) は結果が異なります。

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

1 に答える 1

0

ここでは問題ありません。元のデータセットの 2 倍の大きさのデータセットを使用し、minsplit を元の minsplit の 3 倍にする必要がある場合、もちろん、より短いツリーを成長させることになります (重み間の相対性が同じままであると仮定します)。これらの修正された例を参照してください。重みの相対性を同じに保ち、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

于 2014-09-25T22:58:50.683 に答える