2012-01-03 3 views
5

가중치가 고르지 않은 경우 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) 

답변

0

여기에는 문제가 없습니다. 원본 데이터 세트의 두 배에 해당하는 데이터 세트를 사용하고 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 번을 가중치로 두 번 표시됩니다 나는 그것으로부터 지어지는 나무가 같은 나무 (같은 자료, 같은 알고리즘, 같은 조건이 같은 결과물을 가져와야 함)가 될 것으로 기대한다. 특히, 다섯 번째 예제는 두 번째 및 세 번째 예제와 동일한 트리를 제공해야합니다. 그렇지 않습니다. 이것은 런타임 오류가 아니라 잘못된 대답을 되 찾는 것입니다 ... – Saar