R中的分层k倍交叉验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R中的分层k倍交叉验证相关的知识,希望对你有一定的参考价值。

假设我有一个多类数据集(例如,iris)。我要执行分层的10折CV以测试模型性能。我在包splitstackchange中找到了一个名为stratified的函数,该函数根据我想要的数据的比例对我进行分层折叠。因此,如果我想要测试折痕,那将是数据行的0.1。

#One Fold
library(splitstackchange)
stratified(iris,c("Species"),0.1)

我想知道如何在10折循环中实现此功能或任何其他形式的分层简历。我无法破解其背后的逻辑。在这里,我提供了一个可重现的示例。

    library(splitstackshape)
    data=iris
    names(data)[ncol(data)]=c("Y")
    nFolds=10

    for (i in 1:nFolds)
      testing=stratified(data,c("Y"),0.1,keep.rownames=TRUE)
      rn=testing$rn
      testing=testing[,-"rn"]
      row.names(testing)=rn
      trainingRows=setdiff(1:nrow(data),as.numeric(row.names(testing)))
      training=data[trainingRows,]
      names(training)[ncol(training)]="Y"
    
答案

使用插入符包进行n折简历。我建议插入符号上的this非常有用的链接。

您发现以下解决方案很有用。

library(tidyverse)
library(splitstackshape)
library(caret)
library(randomForest)

data=iris

## split data into train and test using stratified sampling
d <- rownames_to_column(data, var = "id") %>% mutate_at(vars(id), as.integer)
training <- d %>% stratified(., group = "Species", size = 0.90)
dim(training)

## proportion check
prop.table(table(training$Species)) 

testing <- d[-training$id, ]
dim(testing)
prop.table(table(testing$Species)) 


## Modelling

set.seed(123)

tControl <- trainControl(
  method = "cv", #cross validation
  number = 10, #10 folds
  search = "random" #auto hyperparameter selection
)


trRf <- train(
  Species ~ ., #formulae
  data = training[,-1], #data without id field
  method = "rf", # random forest model
  trControl = tControl # train control from previous step.
)

以上是关于R中的分层k倍交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-Learn 中的分层标记 K 折交叉验证

一种热编码标签和分层 K 折交叉验证

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

glm() 模型的交叉验证

R语言编写自定义K折交叉验证(k-fold crossValidation)函数使用使用bootstrap包中的crossval函数来交叉验证模型的R方指标验证模型的效能的可靠性和稳定性

R:训练数据集的 k 折交叉验证