gpt4 book ai didi

r - 使用 MASS 和插入符进行判别分析时相同的数据,不同的结果

转载 作者:行者123 更新时间:2023-11-30 08:40:43 24 4
gpt4 key购买 nike

关于 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 点。

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

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

而不是 0.63,这只是您在训练数据上调用预测时获得的训练精度。

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

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

the prior probabilities of class membership. If unspecified, the class proportions for the training set are used. If present, the probabilities should be specified in the order of the factor levels

so lda with 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

关于r - 使用 MASS 和插入符进行判别分析时相同的数据,不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49735619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com