【问题标题】:Keep same ratios between groups in training and test datasets在训练和测试数据集中保持组之间的相同比率
【发布时间】:2020-09-29 05:14:09
【问题描述】:

对于机器学习项目,我想将我的数据拆分为训练集和测试集,以保持特定组的比例在各组之间保持一致。我创建了一个 40 行的虚拟 data.frame 来解释自己。在这里,对于“地区”组,20% 的数据是“北美”,50% 是“欧洲”,20% 是亚洲,10% 是大洋洲。我想得到一个随机子集,例如整个数据的 25% ,其中“区域”组的百分比组成保持不变。

换句话说,我想从这个开始:

    City    County  Region
1   Shangai China   Asia
2   Tokyo   Japan   Asia
3   Osaka   Japan   Asia
4   Hanoi   Vietnam Asia
5   Beijing China   Asia
6   Sapporo Japan   Asia
7   Tottori Japan   Asia
8   Saigon  Vietnam Asia
9   Rome    Italy   Europe
10  Paris   France  Europe
11  Lisbon  Portugal    Europe
12  Berlin  Germany Europe
13  Madrid  Spain   Europe
14  Vienna  Austria Europe
15  Naples  Italy   Europe
16  Nice    France  Europe
17  Porto   Portugal    Europe
18  Frankfurt   Germany Europe
19  Sevilla Spain   Europe
20  Salzburg    Austria Europe
21  Barcelona   Spain   Europe 
22  Amsterdam   Netherlands Europe 
23  Bern    Switzerland Europe 
24  Milan   Italy   Europe 
25  San Sebastian   Spain   Europe 
26  Rotterdam   Netherlands Europe 
27  Zurich  Switzerland Europe 
28  Turin   Italy   Europe 
29  Ney York City   US  North America
30  Toronto Canada  North America
31  Mexico City Mexico  North America
32  Atlanta US  North America
33  Chicago US  North America
34  Atlanta US  North America
35  Vancouver   Canada  North America
36  Guadalajara Mexico  North America
37  Sydney  Australia   Oceania
38  Wellington  New Zealand Oceania
39  Melbourne   Australia   Oceania
40  Auckland    New Zealand Oceania

并以此结束(随机选择行对我很重要):

    City    County  Region
1   New York    US  North America
2   Mexico City Mexico  North America
3   Amsterdam   Netherlands Europe 
4   Madrid  Spain   Europe
5   Lisbon  Portugal    Europe
6   Rome    Italy   Europe
7   Paris   France  Europe
8   Tokyo   Japan   Asia
9   Osaka   Japan   Asia
10  Wellington  New Zealand Oceania

【问题讨论】:

    标签: r machine-learning train-test-split


    【解决方案1】:

    caret 包中的 createDataPartition() 函数可用于将观察结果分配给训练和测试组,同时保留拆分变量的每个类别内的百分比分布。我们将使用来自应用预测建模的阿尔茨海默病数据来说明它的用途。

    library(caret)
    library(AppliedPredictiveModeling)
    set.seed(90125)
    data(AlzheimerDisease)
    adData = data.frame(diagnosis,predictors)
    inTrain = createDataPartition(adData$diagnosis, p = .6)[[1]]
    training = adData[ inTrain,]
    testing = adData[-inTrain,]
    

    我们现在将为每个数据框中的因变量生成表格,每个数据框中的 Impaired 百分比略低于 38%。

    > table(training$diagnosis)
    
    Impaired  Control 
          55      146 
    > table(testing$diagnosis)
    
    Impaired  Control 
          36       96 
    > 55/146
    [1] 0.3767123
    > 36/96
    [1] 0.375
    > 
    

    使用原始帖子中的数据

    如果我们从问题提供的数据中抽取 75% 的样本,我们可以划分为 30 行的训练数据框和 10 行的测试数据框。

    # OP data
    textFile <- "id|City|County|Region
    1|Shangai|China|Asia
    2|Tokyo|Japan|Asia
    3|Osaka|Japan|Asia
    4|Hanoi|Vietnam|Asia
    5|Beijing|China|Asia
    6|Sapporo|Japan|Asia
    7|Tottori|Japan|Asia
    8|Saigon|Vietnam|Asia
    9|Rome|Italy|Europe
    10|Paris|France|Europe
    11|Lisbon|Portugal|Europe
    12|Berlin|Germany|Europe
    13|Madrid|Spain|Europe
    14|Vienna|Austria|Europe
    15|Naples|Italy|Europe
    16|Nice|France|Europe
    17|Porto|Portugal|Europe
    18|Frankfurt|Germany|Europe
    19|Sevilla|Spain|Europe
    20|Salzbourg|Austria|Europe
    21|Barcelona|Spain|Europe
    22|Amsterdam|Netherlands|Europe
    23|Bern|Switzerland|Europe
    24|Milan|Italy|Europe
    25|SanSebastian|Spain|Europe
    26|Rotterdam|Netherlands|Europe
    27|Zurich|Switzerland|Europe
    28|Turin|Italy|Europe
    29|New York City|US|North America
    30|Toronto|Canada|North America
    31|Mexico City|Mexico|North America
    32|Atlanta|US|North America
    33|Chicago|US|North America
    34|Atlanta|US|North America
    35|Vancouver|Canada|North America
    36|Guadalajara|Mexico|North America
    37|Syndey|Australia|Oceania
    38|Wellington|New Zealand|Oceania
    39|Melbourn|Australia|Oceania
    40|Auckland|New Zealand|Oceania"
    
    data <- read.table(text = textFile,header = TRUE,sep = "|", 
                       stringsAsFactors = FALSE)
    set.seed(901250)
    inTrain = createDataPartition(data$Region, p = .75)[[1]]
    training = data[ inTrain,]
    testing = data[-inTrain,]
    

    当我们打印一张测试数据表时,我们看到Region 按照问题中的要求分布:20% 亚洲、50% 欧洲、20% 北美和 10% 大洋洲。

    > table(testing$Region)
    
            Asia       Europe NorthAmerica      Oceania 
               2            5            2            1 
    > 
    

    最后,我们将打印testing 数据框。

    > testing
       id        City      County        Region
    2   2       Tokyo       Japan          Asia
    8   8      Saigon     Vietnam          Asia
    9   9        Rome       Italy        Europe
    17 17       Porto    Portugal        Europe
    19 19     Sevilla       Spain        Europe
    21 21   Barcelona       Spain        Europe
    22 22   Amsterdam Netherlands        Europe
    32 32     Atlanta          US North America
    36 36 Guadalajara      Mexico North America
    38 38  Wellington New Zealand       Oceania
    >
    

    【讨论】:

    • 这正是我想要的,非常感谢 Len!
    • @elbicho - 不客气。如果您认为答案有用,请勾选问题旁边的复选标记接受它。
    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 2017-05-11
    • 2019-03-07
    • 2015-05-25
    • 2021-01-17
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多