相同的数据,与MASS和插入符号

时间:2018-04-09 14:40:41

标签: r machine-learning cross-validation r-caret

关于R中预测分析的一个非常简短的问题 为什么使用MASS包线性判别分析获得的交叉验证结果与使用caret得到的结果不同?

#simulate data
set.seed(4321)

training_data = as.data.frame(matrix(rnorm(10000, sd = 12), 100, 10))
training_data$V1 = as.factor(sample(c(1,0), size = 100, replace = T))
names(training_data)[1] = 'outcome'

#MASS LDA
fit.lda_cv_MASS = lda(outcome~.
            , training_data
            , CV=T)
pred = fit.lda_cv_MASS$class
caret::confusionMatrix(pred, training_data$outcome)

这给出了~0.53

的准确度
#caret interface LDA
lg.fit_cv_CARET = train(outcome ~ .
               , data=training_data
               , method="lda"
               , trControl = trainControl(method = "LOOCV")
              )
pred = predict(lg.fit_cv_CARET, training_data)
caret::confusionMatrix(pred, training_data$outcome)

现在这导致精确度为~0.63。

我会假设它们是相同的,因为它们都使用了一次性交叉验证。

为什么他们不同?

1 个答案:

答案 0 :(得分:3)

这里有两点,首先是你的错误,另一个是微妙的差异。

第1点。

当您在插入符号列车对象上调用预测时,您实际上是在适合所有训练数据的模型上调用预测,因此您获得的准确度不是LOOCV而是训练准确性。要获得重新采样的准确性,您只需致电:

lg.fit_cv_CARET$results
#output:
  parameter Accuracy       Kappa
1      none     0.48 -0.04208417

而不是0.63,这只是你在列车数据上调用预测时获得的列车精度。

然而,这仍然与LDA获得的0.53不匹配。要理解原因:

第2点。在拟合模型时,lda也使用参数prior

  

班级成员资格的先验概率。如果未指定,则为班级   使用训练集的比例。如果在场的话   概率应按因子水平

的顺序指定

所以ldaCV = TRUE使用相同的先前列车。而caret::train使用重新抽样确定的prior。对于LOOCV而言,这应该不重要,因为先前的更改只是一点点,但是您的数据具有非常低的类别分离,因此先验影响后验概率比平常更多。为了证明这一点,对两种方法使用相同的先验:

fit.lda_cv_MASS <- lda(outcome~.,
                      training_data,
                      CV=T,
                      prior = c(0.5, 0.5))
pred = fit.lda_cv_MASS$class

lg.fit_cv_CARET <- train(outcome ~ .,
                         data=training_data,
                         method="lda",
                         trControl = trainControl(method = "LOOCV"),
                         prior = c(0.5, 0.5)
)

all.equal(lg.fit_cv_CARET$pred$pred, fit.lda_cv_MASS$class)
#output
TRUE

caret::confusionMatrix(pred, training_data$outcome)
#output
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 27 25
         1 24 24

               Accuracy : 0.51           
                 95% CI : (0.408, 0.6114)
    No Information Rate : 0.51           
    P-Value [Acc > NIR] : 0.5401         

                  Kappa : 0.0192         
 Mcnemar's Test P-Value : 1.0000         

            Sensitivity : 0.5294         
            Specificity : 0.4898         
         Pos Pred Value : 0.5192         
         Neg Pred Value : 0.5000         
             Prevalence : 0.5100         
         Detection Rate : 0.2700         
   Detection Prevalence : 0.5200         
      Balanced Accuracy : 0.5096         

       'Positive' Class : 0 

lg.fit_cv_CARET$results
#output
  parameter Accuracy      Kappa
1      none     0.51 0.01921537