gpt4 book ai didi

r - 插入符 - 使用 train()、predict() 和 resamples() 的不同结果

转载 作者:行者123 更新时间:2023-11-30 08:31:05 25 4
gpt4 key购买 nike

我正在使用 Caret 包来分析各种模型,并使用以下方法评估结果:

  • print() [打印train()的结果],
  • 预测(),并且
  • 重新采样()。

为什么以下示例中的结果不同?

我对敏感性(真阳性)感兴趣。为什么 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 查看每次折叠的性能。然后为了确认,您可以使用 mean(J48_fit$resample[,1]) 取第一列 ROC 的平均值,您将得到 0.865799。

当您在完整数据集上使用 predict() 时,您最终会得到不同的结果,因为数据与重新采样中使用的数据不同 - 您将获得模型性能整个数据,而不是一次 10%。

关于r - 插入符 - 使用 train()、predict() 和 resamples() 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37008604/

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