K折交叉验证在R语言中的应用

K折交叉验证是评估机器学习模型性能的一种常用方法。尽管它不如验证集方法流行,但它能为数据和模型提供更深入的见解。与验证集方法一次性分割数据集不同,K折交叉验证会进行五次或十次分割。想象一下,使用不同的数据组重复进行十次验证集方法。

假设有100行数据。随机将它们分成十个折叠组。每个折叠组将包含大约10行数据。第一个折叠组将用作验证集,其余的用作训练集。然后使用这个数据集训练模型并计算准确率或损失。重复这个过程,但使用不同的折叠组作为验证集。

代码实现

使用的库是这两个:

library(tidyverse) library(caret)

这里使用的数据是UCI的心脏病数据,可以在Kaggle上下载。也可以使用任何分类数据进行这个实验。

data <- read.csv("../input/heart-disease-uci/heart.csv")

以下是加载数据的前六行。它有十三个预测变量,最后一列是响应变量。也可以使用tail()函数检查最后几行。

数据分布

在这里,想要确认两个标签数据之间的分布不会太不同。因为不平衡的数据集可能导致不平衡的准确率。这意味着模型将总是预测一个标签,无论是总是预测0还是1。

hist(data$target,col="coral") prop.table(table(data$target))

这个图表显示数据集略有不平衡,但仍然足够好。它的比例是46:54。如果数据集中一个类别的数据超过60%,那么应该开始担心。在这种情况下,可以使用SMOTE来处理不平衡的数据集。

K折交叉验证

set.seed(100) trctrl <- trainControl(method = "cv", number = 10, savePredictions=TRUE) nb_fit <- train(factor(target) ~., data = data, method = "naive_bayes", trControl=trctrl, tuneLength = 0) nb_fit

第一行是设置伪随机数生成器的种子,以便可以重现相同的结果。可以使用任何数字作为种子值。接下来,可以在trainControl()函数中设置K折设置。将method参数设置为“cv”,number参数设置为10。这意味着设置了十折交叉验证。可以设置任何数量的折叠,但最常见的方法是将其设置为五或十。

train()函数用于确定使用的方法。这里使用朴素贝叶斯方法,并将tuneLength设置为零,因为专注于评估每个折叠上的方法。也可以设置tuneLength,如果想要在交叉验证期间进行参数调整。例如,如果使用K-NN方法,想要分析多少K对模型是最好的。

请记住,K折交叉验证可能需要一段时间,因为它需要十次运行训练过程。一旦完成,它将在控制台中打印详细信息。控制台中显示的准确率是所有训练折叠的平均准确率。可以看到,模型平均准确率为83%。

展开K折

可以通过查看每个折叠的准确率来确定模型在每个折叠上的表现。为了做到这一点,请确保在trainControl()函数中将savePredictions参数设置为TRUE。

pred <- nb_fit$pred pred$equal <- ifelse(pred$pred == pred$obs, 1,0) eachfold <- pred %>% group_by(Resample) %>% summarise_at(vars(equal), list(Accuracy = mean)) eachfold

这是每个折叠的准确率表。也可以将其绘制成图表,以便更容易分析。在这种情况下,使用箱线图来表示准确率。

ggplot(data=eachfold, aes(x=Resample, y=Accuracy, group=1)) + geom_boxplot(color="maroon") + geom_point() + theme_minimal()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485