在rfImpute之后获得预测

时间:2013-12-12 02:51:27

标签: r random-forest

我正在使用包randomForest进行一些建模。 rfImpute函数非常适合在拟合模型时处理缺失值。但是,有没有办法为缺少值的新案例获取预测

以下内容基于?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

2 个答案:

答案 0 :(得分:8)

这可能不是您正在寻找的清洁解决方案,但这是前进的方向。问题有两个:

1)NA变量的值需要根据创建原始数据的相同插补协议进行估算。

2)结果需要根据推算值预测,但是根据没有新数据的原始随机森林进行预测。

1

对推算的(而不是原始的)数据集进行新的观察(即利用您已经获得的估算数据),并将新的缺失值归咎于此。新值与原始观察值不相符(不应该)。

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:

使用原始随机森林中的信息预测新推算的观测值。

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

方差会出现问题,因为您没有在使用估算数据来估算另一个数据点时隐含的不确定性。解决这个问题的一种方法是引导。

如果缺少因变量,这也有效(预测并不关心因变量,所以你也可以给出一个独立变量矩阵):

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

答案 1 :(得分:2)

四年后又有一家公司......

Microsoft R Server / Client附带的rxDForest函数可以获取缺失值的案例的预测值。这是因为rxDForest使用与rxDTree相同的底层代码来拟合单个决策树,因此可以从后者创建代理变量的能力中获益。

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 

(@alex keil的回答虽然巧妙,但在生产环境中并不是很实用,因为它需要为每个预测调用重新安装模型。使用大小合适的数据集,可能需要几分钟或几小时。)< / p>