不同的结果使用train(),predict()和resamples()
我正在使用Caret软件包来分析各种模型,并使用以下方法评估结果:
为什么这些结果在以下示例中有所不同?
我对灵敏度(真正的好处)感兴趣。 为什么J48_fit被评估为0.71的敏感度,然后是0.81,然后是0.71
当我运行其他模型时会发生同样的情况 - 灵敏度根据评估而变化。
注意:我在这里包含了两个模型,以便说明resamples()函数,它必须以两个模型作为输入,但我的主要问题是关于结果之间的差异取决于使用的方法。
换句话说,train()(C5.0_fit / J48_fit),predict()和resamples()的结果有什么区别? '幕后'发生了什么,我应该信任哪个结果?
例:
library(C50)
data(churn)
Seed <- 10
# Set train options
set.seed(Seed)
Train_options <- trainControl(method = "cv", number = 10,
classProbs = TRUE,
summaryFunction = twoClassSummary)
# C5.0 model:
set.seed(Seed)
C5.0_fit <- train(churn~., data=churnTrain, method="C5.0", metric="ROC",
trControl=Train_options)
# J48 model:
set.seed(Seed)
J48_fit <- train(churn~., data=churnTrain, method="J48", metric="ROC",
trControl=Train_options)
# Get results by printing the outcome
print(J48_fit)
# ROC Sens Spec
# Best (sensitivity): 0.87 0.71 0.98
# Get results using predict()
set.seed(Seed)
J48_fit_predict <- predict(J48_fit, churnTrain)
confusionMatrix(J48_fit_predict, churnTrain$churn)
# Reference
# Prediction yes no
# yes 389 14
# no 94 2836
# Sens : 0.81
# Spec : 0.99
# Get results by comparing algorithms with resamples()
set.seed(Seed)
results <- resamples(list(C5.0_fit=C5.0_fit, J48_fit=J48_fit))
summary(results)
# ROC mean
# C5.0_fit 0.92
# J48_fit 0.87
# Sens mean
# C5.0_fit 0.76
# J48_fit 0.71
# Spec mean
# C5.0_fit 0.99
# J48_fit 0.98
顺便说一句,这是一个将所有三个结果汇总在一起的功能:
Get_results <- function(...){
Args <- list(...)
Model_names <- as.list(sapply(substitute({...})[-1], deparse))
message("Model names:")
print(Model_names)
# Function for getting max sensitivity
Max_sens <- function(df, colname = "results"){
df <- df[[colname]]
new_df <- df[which.max(df$Sens), ]
x <- sapply(new_df, is.numeric)
new_df[, x] <- round(new_df[, x], 2)
new_df
}
# Find max Sens for each model
message("Max sensitivity from model printout:")
Max_sens_out <- lapply(Args, Max_sens)
names(Max_sens_out) <- Model_names
print(Max_sens_out)
# Find predict() result for each model
message("Results using predict():")
set.seed(Seed)
Predict_out <- lapply(Args, function(x) predict(x, churnTrain))
Predict_results <- lapply(Predict_out, function(x) confusionMatrix(x, churnTrain$churn))
names(Predict_results) <- Model_names
print(Predict_results)
# Find resamples() results for each model
message("Results using resamples():")
set.seed(Seed)
results <- resamples(list(...),modelNames = Model_names)
# names(results) <- Model_names
summary(results)
}
# Test
Get_results(C5.0_fit, J48_fit)
非常感谢!
您打印的最佳灵敏度是10倍(来自您的简历)每个模型的平均性能。 您可以使用J48_fit$resample
查看每次弃J48_fit$resample
的表现。 然后确认,您可以用mean(J48_fit$resample[,1])
取第一列ROC的mean(J48_fit$resample[,1])
,您将得到0.865799。
在完整数据集中使用predict()
时,最终会得到不同的结果,因为数据与resample中使用的数据不同 - 您将在整个数据上获得模型性能,而不是在10%时间。
上一篇: different results using train(), predict() and resamples()