2012-01-03 7 views
5

minsplitの条件に重みを組み込むには、重みが不均等である場合、rpartにしますか? しきい値が重みを考慮する方法を見つけることができませんでした。重みが不均一な場合は、次の例のように問題になります。 私の現在の回避策は、各行が観測値であるデータに展開することですが、時間とメモリの両方で無駄に見えます(とにかく、拡張された形式でメモリで作業する必要のある実際のデータセットを保持できるのではないかと思います)、助けを求めて回る。 ご協力いただきありがとうございます。 -Saarrpartのminsplitと等しくない重みを使用する

次のコードは、問題点を示しています。最初の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) 

答えて

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の詳細についてはthis blog postを参照してください。

+0

一般的なデータセットで不均衡な重みと分数を扱おうとしていますが、この例は動作しないことを示しています。ウェイトのバランスをとることは一般的な解決策ではありません。データセットが大きすぎる可能性があります。 – Saar

+0

@ Saar、私は謝罪します。あなたは、その例が「うまくいきません」と言っています。どのようにして動作しませんか?私が例をテストしたところ、エラーは発生せず、それぞれの例でツリーが成長しました。あなたが期待していなかったように木の一つが成長しましたか? – Ben

+0

すべての6つの例では、データは同じデータです(最初の例を除く)。これは、各観測が3回繰り返されるか、一度表示されますが3の重みを持つか、 私はそれから構築される樹木が同じ木であることを期待します(同じデータ、同じアルゴリズム、同じ条件が同じ出力につながるはずです)。具体的には、5番目の例は、2番目と3番目の例と同じツリーを私に与えるべきです。それはしません。 これは実行時エラーではなく、間違った回答を返すことです... – Saar

関連する問題