【问题标题】:Create partition based in two variables基于两个变量创建分区
【发布时间】:2018-01-29 21:17:25
【问题描述】:

我有一个包含两个结果变量的数据集,case1 和 case2。 Case1 有 4 个级别,而 case2 有 50 个(case2 中的级别可能会在以后增加)。我想为训练创建数据分区并测试在这两种情况下保持比率。 case1 和 case2 的真实数据是不平衡的。例如,

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),所以我需要数组大小相同。

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

谢谢!

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

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

    按 case1 和 case2 分组,得到分组索引

    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 
    

    【讨论】:

    • 谢谢!它适用于某些情况,对于其他情况,当频率非常低(约 10 例)时,它会警告某些类有单个记录。不过,我会使用你的解决方案。
    • 警告是关于组索引的,是数据集固有的。在示例数据集中,实际类别的最小样本量为 4。
    • 是的,是的。如果某些班级的人数很少,我认为没有办法进行良好的拆分。我在其他情况下尝试了您的代码,在这些情况下计数更高,并且可以正常工作。再次感谢!
    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多