首页 文章

相同的数据,与MASS和插入符号的判别分析的不同结果

提问于
浏览
2

关于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 回答

  • 3

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

    第1点 .

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

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

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

    但是这仍然与LDA获得的0.53不匹配 . 要理解原因:

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

    class 成员资格的先验概率 . 如果未指定,则使用训练集的类比例 . 如果存在,则应按因子水平的顺序指定概率

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

相关问题