【问题标题】:Selecting rows for a training data set when target is not uniformly distributed当目标不均匀分布时为训练数据集选择行
【发布时间】:2020-07-01 09:49:47
【问题描述】:

使用以下代码创建用于训练决策树的数据集:

set.seed(2)
train_sample <- sample(nrow(X), nrow(X) * 0.7)
X_test <- X[-train_sample,]

这将创建一个包含 70% 数据的训练样本和一个包含其他 30% 数据的测试样本。

我遇到的问题是,这没有考虑到目标列中的某些值比其他值更稀有。例如,目标列可能包含范围从 4 到 8 的值。但是,其中 90% 的范围是从 5 到 7。这​​意味着只有 10% 的整个(目标)数据是 4 或 8。

我应该如何最好地解决这个问题,我应该在构建训练集时考虑到这一点,还是应该忽略它?如果我应该考虑建立一个训练集,我该如何考虑呢?有没有什么简单的方法可以申请?

【问题讨论】:

  • @zx8754 我应该搜索它叫什么:分层抽样?
  • 是的,分层抽样。

标签: r decision-tree


【解决方案1】:

一种选择是在caret 中使用createDataPartition 并在函数中提供标签,例如:

library(caret)
X = iris[c(1:20,51:150),]
X$Species = factor(X$Species=="setosa")
table(X$Species)

FALSE  TRUE 
  100    20 
trainIndex <- createDataPartition(X$Species, p = .7, 
                                  list = FALSE, 
                                  times = 1)

table(X[trainIndex,]$Species)
FALSE  TRUE 
   70    14 

否则你也可以用 tapply 做到这一点:

trainIndex = unlist(tapply(1:nrow(X),
X$Species,function(i){
sample(i,round(length(i)*0.7))
}))

table(X[trainIndex,]$Species)

FALSE  TRUE 
   70    14

在上面的代码中,您根据标签和每个组内的样本拆分 1:nrow(X)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多