如何为随机森林模型估算缺失的分类预测变量?

机器算法验证 r 随机森林 缺失数据
2022-03-12 09:41:14

我有一组 x,y 数据用于构建随机森林。x 数据是包含一些 NA 的值向量。所以我rfImpute用来处理丢失的数据并创建一个随机森林。现在我有一个新的看不见的观察 x(带有 NA),我想预测 y。如何估算缺失值,以便可以使用我已经种植的随机森林?rfImpute函数似乎需要 x 和 y。我只有 x 用于预测目的。

我的问题与这个问题相似(但不同)例如,我可以使用相同的 iris 数据集。如果我正确解释了我引用的问题的答案中的代码iris.na[148, , drop=FALSE],则语句中的代码iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE])表示包含Species(Y 值)的新数据。在我的问题中,我不知道Species——我想使用随机森林来预测。我会有 4 个自变量,但有些可能是NA给定行的。继续类比,假设我有 4 个变量中的 3 个(缺少一个)。我想估算那个值。然后我想预测我不知道的物种。

为了回应gung的评论,我应该添加一个插图,让我把它放在iris数据集方面。想象一下,我有一朵花有以下数据。我知道它是Sepal.Length, Sepal.Width, Petal.Length, 但不是Petal.Width. 我想估算Petal.Width,然后在 RF 模型中使用这 4 个值来预测Species.

1个回答

我认为您需要一种无监督的估算方法。那是一种不使用目标值进行估算的方法。如果您只有很少的预测特征向量,则可能很难发现数据结构。相反,您可以将您的预测与已经估算的训练特征向量混合,并使用此结构再次估算。请注意,此过程可能违反独立性假设,因此将整个过程包装在外部交叉验证中以检查严重的过拟合。

我刚刚从对这个问题的评论中了解到了missForest missForest 似乎可以解决问题。我在虹膜数据上模拟了你的问题。(没有外部交叉验证)

rm(list=ls())
data("iris")
set.seed(1234)
n.train = 100
train.index = sample(nrow(iris),n.train)
feature.train = as.matrix(iris[ train.index,1:4])
feature.test  = as.matrix(iris[-train.index,1:4])


#simulate 40 NAs in train
n.NAs = 40
NA.index = sample(length(feature.train),n.NAs)
NA.feature.train = feature.train; NA.feature.train[NA.index] = NA

#imputing 40 NAs unsupervised
library(missForest)
imp.feature.train = missForest(NA.feature.train)$ximp
#check how well imputation went, seems promsing for this data set
plot(    feature.train[NA.index],xlab="true value",
     imp.feature.train[NA.index],ylab="imp  value",)

#simulate random NAs in feature test
feature.test[sample(length(feature.test),20)] = NA

#mix feature.test with imp.feature.train
nrow.test = nrow(feature.test)
mix.feature = rbind(feature.test,imp.feature.train)
imp.feature.test = missForest(mix.feature)$ximp[1:nrow.test,]

#train RF and predict
library(randomForest)
rf = randomForest(imp.feature.train,iris$Species[train.index])
pred.test = predict(rf,imp.feature.test)
table(pred.test, iris$Species[-train.index])

Printing...
-----------------
pred.test    setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         20         2
  virginica       0          1        15