Выбор строк для набора обучающих данных, когда цель не распределена равномерно - PullRequest
1 голос
/ 20 марта 2020

Наличие следующего кода для создания набора данных для обучения дерева решений:

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.

Как мне лучше всего подойти к этому, следует ли принимать это во внимание при создании тренировочного набора или я должен игнорировать это? И как я могу принять это во внимание при создании тренировочного набора, если я должен? Есть ли какие-нибудь простые методы для применения?

1 Ответ

0 голосов
/ 20 марта 2020

Одним из вариантов является использование createDataPartition в caret и предоставление метки в функции, например:

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) в соответствии с метками и образцом в каждой группе.

...