r语言 - 基于两个变量创建分区



我有一个包含两个结果变量的数据集,案例1和案例2。案例 1 有 4 个级别,而案例 2 有 50 个级别(案例 2 中的级别以后可能会增加(。我想为训练创建数据分区,并在这两种情况下保持比率。案例 1 和案例 2 的实际数据都是不平衡的。举个例子,

library(caret)
set.seed(123)
matris=matrix(rnorm(10),1000,20)
case1 <- as.factor(ceiling(runif(1000, 0, 4)))
case2 <- as.factor(ceiling(runif(1000, 0, 50)))
df <- as.data.frame(matris)
df$case1 <- case1
df$case2 <- case2
split1 <- createDataPartition(df$case1, p=0.2)[[1]]
train1 <- df[-split1,]
test1 <- df[split1,]
length(split1)
201
split2 <- createDataPartition(df$case2, p=0.2)[[1]]
train2 <- df[-split2,]
test2 <- df[split2,]
length(split2)
220

如果我进行单独的拆分,我会得到不同的数据框长度。如果我基于 case2 进行一次拆分(具有更多类的拆分(,则会丢失 case1 的类比率。

我将分别预测这两种情况,但最后我的准确性将通过两种情况的精确匹配来给出(例如,ix = which(pred1 == case1 & pred2 == case2(,所以我需要数组的大小相同。

有没有聪明的方法可以做到这一点?

谢谢!

如果我理解正确(我不保证(,我可以提供以下方法:

按大小写 1 和大小写 2 分组并获取组索引

library(tidyverse)
df %>%
  select(case1, case2) %>%
  group_by(case1, case2) %>%
  group_indices() -> indeces

在创建数据分区中使用以下 indeces 作为结果变量:

split1 <- createDataPartition(as.factor(indeces), p=0.2)[[1]]

检查是否满意:

table(df[split1,22])
#output
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 
 5  6  5  8  5  5  6  6  4  6  6  6  6  6  5  5  5  4  4  7  5  6  5  6  7  5  5  8  6  7  6  6  7 
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 
 4  5  6  6  6  5  5  6  5  6  6  5  4  5  6  4  6
table(df[-split1,22])
#output
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 
15 19 13 18 12 13 16 15  8 13 13 15 21 14 11 13 12  9 12 20 17 15 16 19 16 11 14 21 13 20 18 13 16 
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 
 9  6 12 19 14 10 16 19 17 17 16 14  4 15 14  9 19 
table(df[split1,21])
#output
 1  2  3  4 
71 70 71 67 
table(df[-split1,21])
  1   2   3   4 
176 193 174 178 

最新更新