如何在 R 中按类拆分训练/测试数据 50% 并按对象 ID 分组?

数据挖掘 r
2022-02-27 15:37:02

我使用参考多边形从中获取像素值。提取的像素值在数据框中,但一行代表单个像素的提取值。在分类中,我需要按类(树、草地等)将数据集分成测试(50%)和训练(50% )

我知道如何根据类拆分一组。但是,我希望为一个多边形提取的值分配给一组(训练或测试)并且它们没有混合

为此,我想使用多边形 ID(对象标识)。我想使用 createDataPartition 函数来做到这一点。这些只是两个示例类(还有更多)

这是带有提取值的表的一部分:

"band_1"    "band_2"    "band_3"    "CLASS" "Id"
110 134 119 "tree"  1
112 133 118 "tree"  1
105 125 110 "tree"  2
112 132 117 "tree"  2
109 125 115 "meadow"    6
93  110 101 "meadow"    6
86  106 95  "meadow"    7
105 136 116 "meadow"    7
102 128 111 "meadow"    8
108 129 115 "meadow"    8
113 134 119 "meadow"    8

这是代码:

trainIndeks <- caret::createDataPartition(EXTRACTED$CLASS, p = 0.5, list=FALSE, times = 1)

    dataTrain <- EXTRACTED[trainIndeks,]
    dataTest <- EXTRACTED[-trainIndeks,]
1个回答

代替:

dataTrain <- EXTRACTED[trainIndeks,]
dataTest <- EXTRACTED[-trainIndeks,]

尝试:

dataTrain <- EXTRACTED[ID %% 2 == 1,]
dataTest  <- EXTRACTED[ID %% 2 == 0,]

dataTrain 将仅包含奇数 ID, dataTest 仅包含偶数。

使用这种方法可能会失去 dataTrain 和 dataTest 之间的 CLASS 分布的平衡,但你可以通过复制或删除一些记录来改进它,或者通过检查其他拆分中的分布,例如

dataTrain <- EXTRACTED[ID %% 4 < 2,]
dataTest  <- EXTRACTED[ID %% 4 > 1,]

编辑:

对于随机更改拆分,您可以使用:

set.seed(123)
N <- 10
#N <- round(max(EXTRACTED$ID)/10) # for more random grouping
p <- 0.5 # train/(train+test) ratio
idx <- sample(0:(N-1),round(N*p))
dataTrain <- EXTRACTED[ID %% N %in% idx,]
dataTest  <- EXTRACTED[!(ID %% N %in% idx),]