2012-01-03 38 views
5

Làm cách nào để kết hợp các trọng số vào các tiêu chí minsplit trong rpart, khi trọng lượng không đồng đều? Tôi không thể tìm được cách cho ngưỡng minsplit để cân nhắc trọng lượng và khi trọng số không đồng đều, nó sẽ trở thành vấn đề, như ví dụ sau đây. Cách giải quyết hiện tại của tôi là mở rộng dữ liệu thành một trong đó mỗi hàng là một quan sát, nhưng điều đó dường như lãng phí trong cả thời gian và bộ nhớ (và tôi nghi ngờ mình có thể giữ bộ dữ liệu thực mà tôi cần làm việc trong bộ nhớ trong biểu mẫu mở rộng của mình), do đó - chuyển sang trợ giúp. Cảm ơn trước sự giúp đỡ của bạn, -SaarSử dụng minsplit và trọng số bất bình đẳng trong rpart

Mã sau đây cho biết vấn đề là gì; 3 cây đầu tiên giống nhau, nhưng hai cây sau đây (với trọng lượng không đồng đều) khác nhau:

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

Trả lời

0

Không có vấn đề gì ở đây. Nếu bạn sử dụng tập dữ liệu lớn gấp hai lần so với tập dữ liệu ban đầu và sau đó yêu cầu minsplit lớn gấp 3 lần minsplit ban đầu của bạn, tất nhiên bạn sẽ trồng một cây ngắn hơn (giả sử tương đối giữa các trọng số vẫn giữ nguyên). Xem các ví dụ đã sửa đổi này cho thấy bạn sẽ trồng những cây giống hệt nhau nếu bạn giữ cho các tương đối trọng lượng giống nhau, và tỷ lệ của minsplit/n cũng vậy.

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

Xem this blog post để biết thêm chi tiết về RPart.

+0

Tôi đang cố gắng làm việc với trọng số không cân bằng và minsplit trên tập dữ liệu chung và ví dụ cho thấy nó không hoạt động. Cân bằng trọng lượng không phải là giải pháp chung, có thể dẫn đến tập dữ liệu quá lớn. – Saar

+0

@ Saar, tôi xin lỗi Nếu tôi thiếu điều gì đó hiển nhiên. Bạn nói rằng các ví dụ cho thấy "nó không hoạt động". Theo cách nào nó không hoạt động? Khi tôi thử nghiệm các ví dụ, một cây lớn lên trong mỗi chúng mà không có bất kỳ lỗi nào. Có phải một trong những cây mọc theo cách mà bạn không ngờ? – Ben

+0

Trong tất cả 6 ví dụ, dữ liệu là cùng một dữ liệu, được biểu diễn theo nhiều cách khác nhau (trừ ví dụ đầu tiên): Mỗi lần quan sát lặp lại ba lần, xuất hiện một lần nhưng có trọng số là 3 hoặc xuất hiện hai lần với trọng số lên tới 3 Tôi hy vọng những cây được xây dựng từ nó thành cùng một cây (cùng một dữ liệu, cùng một thuật toán, cùng điều kiện sẽ dẫn đến cùng một kết quả đầu ra). Cụ thể, ví dụ thứ năm sẽ cho tôi cùng một cây như ví dụ thứ hai và thứ ba. Nó không. Đây không phải là lỗi thời gian chạy, đó là về việc trả lời sai ... – Saar

Các vấn đề liên quan