Dự đoán với RandomForest (R) khi một số đầu vào bị thiếu giá trị (NA)


9

Tôi có một randomForestmô hình phân loại tốt mà tôi muốn sử dụng trong một ứng dụng dự đoán lớp của một trường hợp mới. Các trường hợp mới chắc chắn thiếu giá trị. Dự đoán sẽ không làm việc như vậy cho NA. Làm thế nào tôi nên làm điều này sau đó?

data(iris)
# create first the new case with missing values
na.row<-45
na.col<-c(3,5)
case.na<-iris[na.row,]
case.na[,na.col]<-NA

iris.rf <- randomForest(Species ~ ., data=iris[-na.row,])
# print(iris.rf)

myrf.pred <- predict(iris.rf, case.na[-5], type="response")
myrf.pred
[1] <NA>

Tôi đã thử missForest. Tôi đã kết hợp dữ liệu gốc và trường hợp mới, lắc nó missForestvà nhận các giá trị cho các NA trong trường hợp mới của tôi. Máy tính quá nặng mặc dù.

data.imp <- missForest(data.with.na)

Nhưng phải có một cách để sử dụng mô hình rf để dự đoán một trường hợp mới với các giá trị bị thiếu, phải không?


4
Có nhiều cách thiếu giá trị có thể được xử lý trong các cây quyết định, nhưng randomForestgói trong R chỉ có phương thức cắt bỏ mà bạn mô tả. Nếu bạn muốn ở trong một môi trường tương tự, gbmcó một phương pháp xử lý các giá trị bị thiếu trong dữ liệu mới một cách mượt mà hơn (nó không hoàn hảo, nhưng nó rất hữu ích).
Shea Parkes

Tôi nghĩ rằng gói tiệc xử lý tốt hơn với các giá trị còn thiếu
Simone

Gửi @Simone, partygói hoạt động với NA trong bộ thử nghiệm như thế nào? Tôi không thể tìm thấy dấu vết của việc liệt kê trong partysách hướng dẫn hoặc ví dụ.
hermo

@hermo hãy thử xem giấy citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 của bên này , có vẻ như thuật toán này hoạt động giống như GIỎI - nó tìm kiếm sự phân chia thay thế.
Simone

Hãy thử sử dụng "na.action = na.roughfix".

Câu trả lời:


1

Bạn không có lựa chọn nào khác ngoài việc áp đặt các giá trị hoặc thay đổi mô hình. Một lựa chọn tốt có thể là aregImpute trong gói H'misc. Tôi nghĩ rằng nó ít nặng hơn rfimpute, thứ đang giam giữ bạn, ví dụ gói đầu tiên (có những thứ khác):

# Check that aregImpute can almost exactly estimate missing values when
# there is a perfect nonlinear relationship between two variables
# Fit restricted cubic splines with 4 knots for x1 and x2, linear for x3
set.seed(3)
x1 <- rnorm(200)
x2 <- x1^2
x3 <- runif(200)
m <- 30
x2[1:m] <- NA
a <- aregImpute(~x1+x2+I(x3), n.impute=5, nk=4, match='closest')
a
matplot(x1[1:m]^2, a$imputed$x2)
abline(a=0, b=1, lty=2)

x1[1:m]^2
a$imputed$x2

# Multiple imputation and estimation of variances and covariances of
# regression coefficient estimates accounting for imputation
# Example 1: large sample size, much missing data, no overlap in
# NAs across variables
x1 <- factor(sample(c('a','b','c'),1000,TRUE))
x2 <- (x1=='b') + 3*(x1=='c') + rnorm(1000,0,2)
x3 <- rnorm(1000)
y  <- x2 + 1*(x1=='c') + .2*x3 + rnorm(1000,0,2)
orig.x1 <- x1[1:250]
orig.x2 <- x2[251:350]
x1[1:250] <- NA
x2[251:350] <- NA
d <- data.frame(x1,x2,x3,y)
# Find value of nk that yields best validating imputation models
# tlinear=FALSE means to not force the target variable to be linear
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
                data=d, B=10) # normally B=75
f
# Try forcing target variable (x1, then x2) to be linear while allowing
# predictors to be nonlinear (could also say tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f

# Use 100 imputations to better check against individual true values
f <- aregImpute(~y + x1 + x2 + x3, n.impute=100, data=d)
f
par(mfrow=c(2,1))
plot(f)
modecat <- function(u) {
 tab <- table(u)
 as.numeric(names(tab)[tab==max(tab)][1])
}
table(orig.x1,apply(f$imputed$x1, 1, modecat))
par(mfrow=c(1,1))
plot(orig.x2, apply(f$imputed$x2, 1, mean))
fmi <- fit.mult.impute(y ~ x1 + x2 + x3, lm, f, 
                       data=d)
sqrt(diag(vcov(fmi)))
fcc <- lm(y ~ x1 + x2 + x3)
summary(fcc)   # SEs are larger than from mult. imputation

Bạn đề cập rằng bạn có nhiều quan sát mới thiếu giá trị trên các biến độc lập. Mặc dù bạn có nhiều trường hợp như thế này, nhưng đối với mỗi lần quan sát mới, chỉ có một lỗi trong một hoặc hai biến của nó và số lượng biến của bạn không nhỏ có thể chỉ lấp đầy các lỗ trung bình hoặc trung bình (chúng có liên tục không?) có thể làm việc.

Một điều có thể thú vị là làm một phân tích tầm quan trọng nhỏ. Việc thực hiện rừng R ngẫu nhiên tính toán hai biện pháp quan trọng và các ô tương ứng:

varImpPlot(yourRandomForestModel) # yourRandomForestModel must have the argument importance=TRUE 

Và bạn có thể chơi xung quanh chỉ với các biến "quan trọng" trong đào tạo mô hình, cho đến khi độ chính xác dự đoán không phải là tất cả những gì bị ảnh hưởng so với "mô hình đầy đủ". Có thể bạn giữ các biến với số lần bỏ lỡ thấp. Nó có thể giúp bạn giảm kích thước của vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.