我正在使用包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
答案 0 :(得分:8)
这可能不是您正在寻找的清洁解决方案,但这是前进的方向。问题有两个:
1)NA变量的值需要根据创建原始数据的相同插补协议进行估算。
2)结果需要根据推算值预测,但是根据没有新数据的原始随机森林进行预测。
对推算的(而不是原始的)数据集进行新的观察(即利用您已经获得的估算数据),并将新的缺失值归咎于此。新值与原始观察值不相符(不应该)。
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
使用原始随机森林中的信息预测新推算的观测值。
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>