关于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 回答
这里有两点,首先是你的错误,另一个是微妙的差异 .
第1点 .
当您在插入符号列车对象上调用预测时,您实际上是在适合所有训练数据的模型上调用预测,因此您获得的准确性不是列车准确性 . 要获得重新采样的准确性,您只需致电:
而不是0.63,这只是你在列车数据上调用预测时获得的列车精度 .
但是这仍然与LDA获得的0.53不匹配 . 要理解原因:
点2.在拟合模型时,
lda
也使用参数prior
:所以
lda
与CV = TRUE
使用相同的先验列车全套 . 而caret::train
使用重新采样确定的prior
. 对于LOOCV而言,这应该不重要,因为先前的更改只是一点点,但是您的数据具有非常低的类别分离,因此先验影响后验概率比平常更多 . 为了证明这一点,对两种方法使用相同的先验: