在R中使用随机森林模型的情况下,predict()函数与model $ predicted有什么区别?

时间:2019-02-12 07:24:54

标签: r machine-learning random-forest predict

使用随机森林包:-

#install.packages("randomForest")
library(randomForest)

我使用在线代码在系统上运行随机森林。我得到了一个具有混淆矩阵和准确性等的模型。 现在,我的数据以训练和验证集的形式出现。我从这里得到数据: https://archive.ics.uci.edu/ml/machine-learning-databases/car/ 我将其划分为70%-30%(分别为培训-验证)。 然后我在上面运行了一个模型。 模型结果给了我一个答案,大约30个观测值被误分类为运行随机森林的变量的一个特定值。 下面是示例数据:-

     BuyingPrice Maintenance NumDoors NumPersons Bootspace Safety Condition
        vhigh         low        4          4       med    low     unacc
        vhigh         med        2          4       med   high       acc
        vhigh         med        2       more     small   high     unacc
        vhigh        high        3          4       big   high     unacc
        vhigh         med        4       more     small    med     unacc
         low         low        2       more       med    med       acc 

randomForest在预测最后一个变量“条件”时运行。 以下是模型摘要

Call:
 randomForest(formula = Condition ~ ., data = TrainSet, ntree = 500,      
mtry = 6, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 6

        OOB estimate of  error rate: 2.48%
Confusion matrix:
      acc good unacc vgood class.error
acc   244    4     6     2  0.04687500
good    3   44     1     0  0.08333333
unacc  11    1   843     0  0.01403509
vgood   2    0     0    47  0.04081633

如果我们使用表格的第一行(在我们上方的那一行),我们将看到值“ acc”具有244个正确的预测(95%)和12个错误的预测。 同样,“好”有44个正确的预测(91%)和4个错误的预测。对于其他两个,依此类推。 错误预测的总数为30(12 + 4 + 12 + 2) 现在,从技术上讲,此模型的预测值应与实际值相差30个错误分类值。 现在,我尝试通过两种方法获取预测值:-

    1. First method :- model2$predicted.
    2. Second method :- predTrain <- predict(model2, TrainSet, type = "class")

第一种方法给我的预测值集与实际值相差30个位置,而第二种方法给我的数据集与实际值完全相等。 我认为第一种方法是正确的,但是链接中的人使用了第二种方法。

 https://www.r-bloggers.com/how-to-implement-random-forests-in-r/

不确定我的概念哪里出了问题 请帮忙。 PS:-我知道有人问过类似的问题,但是我觉得这个问题及其下面的答案对我来说不够详尽或难以解释。这就是为什么,我问了一个新问题。

示例代码

set.seed(100)
train <- sample(nrow(data1),0.7*nrow(data1),replace=FALSE)
TrainSet <- data1[train,]
ValidSet <- data1[-train,]
model2 <- randomForest(Condition ~ ., data = TrainSet, ntree = 500, mtry=6, 
importance = TRUE)
predTrain <- predict(model2, TrainSet, type = "class")
new1 <- data.frame(actual = TrainSet$Condition, predicted = predTrain)
new2 <- data.frame(actual = TrainSet$Condition, predicted = 
model2$predicted)
new1$third <- 0
for(i in 1:nrow(new1))
{
if(new1[i,1] == new1[i,2])
{
new1[i,3] = 1
}else{
new1[i,3] = 0
}
}
new2$third <- 0
for(i in 1:nrow(new2))
{
  if(new2[i,1] == new2[i,2])
  {
    new2[i,3] = 1
  }else{
    new2[i,3] = 0
  }
}

谢谢, 阿比(Abhay)

1 个答案:

答案 0 :(得分:3)

根据randomForest函数的文档: 预测的:基于袋装样本的输入数据的预测值。

因此,观测值的预测值是通过不使用该观测值的模型获得的。

预测功能会将学习到的模型应用于新数据,并且不知道它们已用于训练。因此,任何观察都可用于学习和预测。

您应该使用预测输出,因为在计算每个预测值时都没有用于训练的相应观察值。