关于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。
我会假设它们是相同的,因为它们都使用了一次性交叉验证。
为什么他们不同?
答案 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
:
班级成员资格的先验概率。如果未指定,则为班级 使用训练集的比例。如果在场的话 概率应按因子水平
的顺序指定
所以lda
与CV = 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