2013-12-12 30 views
6

Tôi đang thực hiện một số mô hình bằng cách sử dụng gói randomForest. Chức năng rfImpute rất tốt để xử lý các giá trị bị thiếu khi lắp mô hình. Tuy nhiên, có cách nào để nhận được các dự đoán cho các trường hợp mới có giá trị bị thiếu không?Nhận dự đoán sau khi rfImpute

Sau đây là dựa trên ví dụ trong ?rfImpute.

iris.na <- iris 

set.seed(111) 
## artificially drop some data values. 
for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA 

## impute the dropped values 
set.seed(222) 
iris.imputed <- rfImpute(Species ~ ., iris.na) 

## fit the model 
set.seed(333) 
iris.rf <- randomForest(Species ~ ., iris.imputed) 

# now try to predict for a case where a variable is missing 
> predict(iris.rf, iris.na[148, , drop=FALSE]) 
[1] <NA> 
Levels: setosa versicolor virginica 

Trả lời

1

Bốn năm và một công ty sau đó ....

Chức năng rxDForest đi kèm với Microsoft R Server/Client có thể nhận giá trị dự đoán cho các trường hợp có giá trị bị thiếu. Điều này là do rxDForest sử dụng cùng một mã cơ bản như rxDTree để kết hợp các cây quyết định duy nhất và do đó có lợi từ khả năng tạo biến thay thế của người thứ hai.

iris.na <- iris 

set.seed(111) 
## artificially drop some data values. 
for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA 


library(RevoScaleR) 

# rxDForest doesn't support dot-notation for formulas 
iris.rxf <- rxDForest(Species ~ Petal.Length + Petal.Width + Sepal.Length + Sepal.Width, 
    data=iris.na, nTree=100) 

pred <- rxPredict(iris.rxf, iris.na) # not predict() 

table(pred) 
# setosa versicolor virginica 
#  50   48   52 

(Câu trả lời của Keil @ Alex, trong khi khéo léo, không phải là rất thực tế trong một môi trường sản xuất vì nó đòi hỏi trang bị lại một mô hình cho mỗi cuộc gọi dự đoán. Với một tập dữ liệu phong nha cỡ, có thể mất vài phút hoặc giờ.)

+0

Vui vì bạn đã tìm ra cách tốt hơn để làm điều đó! Cảm ơn bạn đã báo cáo lại. –

8

Đây có thể không phải là giải pháp sạch mà bạn đang tìm kiếm, nhưng đây là một con đường phía trước. Vấn đề là gấp đôi:

1) giá trị của các biến NA cần được mô phỏng dựa trên cùng một giao thức imputation mà dữ liệu gốc được tạo ra.

2) kết quả cần được dự đoán dựa trên giá trị được tranh chấp đó, nhưng theo khu rừng ngẫu nhiên ban đầu không có dữ liệu mới.

1:

Tack trên quan sát mới vào tập dữ liệu quy gán (chứ không phải là bản gốc) (ví dụ: Sử dụng chức năng dữ liệu QUY GÁN bạn đã có) và quy cho các giá trị bị mất tích mới. Giá trị mới không khớp với imputed từ quan sát ban đầu (nó không nên).

 
iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE]) 
iris.imputed2 = rfImpute(Species ~ ., iris.na2) 
 
>>>tail(iris.imputed,3) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
148 virginica   6.5 3.019279   5.2   2.0 
149 virginica   6.2 3.400000   5.4   2.3 
150 virginica   5.9 3.000000   5.1   1.8 
>>>tail(iris.imputed2,4) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
148 virginica   6.5 3.019279   5.2   2.0 
149 virginica   6.2 3.400000   5.4   2.3 
150 virginica   5.9 3.000000   5.1   1.8 
1481 virginica   6.5 3.023392   5.2   2.0 

2:

dự đoán mới quy gán quan sát bằng cách sử dụng thông tin từ rừng ngẫu nhiên ban đầu.

 
predict(iris.rf, iris.imputed2[151, ]) 
    1481 
virginica 
Levels: setosa versicolor virginica 

Sẽ có vấn đề với phương sai vì bạn không bao gồm sự không chắc chắn tiềm ẩn trong việc sử dụng dữ liệu bị tranh chấp để ám chỉ một điểm dữ liệu khác. Một cách để có được xung quanh đó là để bootstrap.

này hoạt động nếu biến phụ thuộc là mất tích, quá (dự đoán không quan tâm đến biến phụ thuộc, vì vậy bạn chỉ có thể cung cấp cho một ma trận của các biến độc lập, quá):

 
>>>missY = cbind(NA,iris.imputed2[151, 2:5]) 
>>>missY 
    NA Sepal.Length Sepal.Width Petal.Length Petal.Width 
1481 NA   6.5 3.023392   5.2   2 

>>>predict(iris.rf,missY) 
    1481 
virginica 
Levels: setosa versicolor virginica 
Các vấn đề liên quan