代码之家  ›  专栏  ›  技术社区  ›  Andres

基于两个变量创建分区

  •  1
  • Andres  · 技术社区  · 8 年前

    我有一个包含两个结果变量的数据集,案例1和案例2。案例1有4个级别,而案例2有50个级别(案例2中的级别稍后可能会增加)。我想为train创建数据分区,并在这两种情况下保持比率。案例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
    

    如果进行单独拆分,则数据帧的长度会不同。如果我基于案例2进行一次拆分(一次包含多个类),我将失去案例1的类比率。

    我将分别预测这两种情况,但在最后,我的准确度将通过两种情况的精确匹配得到(例如,ix=which(pred1==case1&pred2==case2),因此我需要数组的大小相同。

    有什么聪明的方法可以做到这一点吗?

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  3
  •   missuse    8 年前

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

    按案例1和案例2分组并获得组索引

    library(tidyverse)
    
    df %>%
      select(case1, case2) %>%
      group_by(case1, case2) %>%
      group_indices() -> 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