相同数据在MASS和caret包下的判别分析结果不同

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

#模拟数据集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 LDAfit.lda_cv_MASS = lda(outcome~.            , training_data            , CV=T)pred = fit.lda_cv_MASS$classcaret::confusionMatrix(pred, training_data$outcome)

这给出了大约0.53的准确率

#caret接口LDAfit.fit_cv_CARET = train(outcome ~ .               , data=training_data               , method="lda"               , trControl = trainControl(method = "LOOCV")              )pred = predict(fit.fit_cv_CARET, training_data)caret::confusionMatrix(pred, training_data$outcome)

现在这结果显示大约0.63的准确率。

我原本以为它们应该是相同的,因为两者都使用了留一法交叉验证。

为什么它们不同?


回答:

这里有两个要点,第一个是你的错误,第二个是一个细微的差异。

要点1.

当你在caret的train对象上调用predict时,实际上是在所有训练数据上拟合的模型上调用predict,因此你得到的准确率不是LOOCV的准确率,而是训练准确率。要得到重抽样准确率,你只需调用:

fit.fit_cv_CARET$results#output:  parameter Accuracy       Kappa1      none     0.48 -0.04208417

而不是0.63,这是你对训练数据调用predict时得到的训练准确率。

然而,这仍然与LDA得到的0.53不匹配。为了理解原因:

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

类成员的先验概率。如果未指定,则使用训练集的类比例。如果已给出,概率应按因子级别的顺序指定

所以ldaCV = TRUE时使用与完整训练集相同的先验概率。而caret::train使用由重抽样确定的prior。对于留一法交叉验证,这应该影响不大,因为先验概率只变化了一点点,但是你的数据类别分离度非常低,所以先验概率对后验概率的影响比平时更大一些。为了证明这一点,使用相同的先验概率进行两种方法:

fit.lda_cv_MASS <- lda(outcome~.,                      training_data,                      CV=T,                      prior = c(0.5, 0.5))pred = fit.lda_cv_MASS$classfit.fit_cv_CARET <- train(outcome ~ .,                         data=training_data,                         method="lda",                         trControl = trainControl(method = "LOOCV"),                         prior = c(0.5, 0.5))all.equal(fit.fit_cv_CARET$pred$pred, fit.lda_cv_MASS$class)#outputTRUEcaret::confusionMatrix(pred, training_data$outcome)#outputConfusion Matrix and Statistics          ReferencePrediction  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 fit.fit_cv_CARET$results#output  parameter Accuracy      Kappa1      none     0.51 0.01921537

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注