Вот заказное решение R:
stratified.sample <- function(var, p) {
obs <- seq_along(var)
grps <- unique(var)
inds <- numeric()
for(g in grps) {
inds <- c(inds, sample(obs[var==g], floor(sum(var==g)*p)))
}
inds
}
Вы можете использовать вышеупомянутую функцию для стратификации в тест и обучения для любой переменной, даже если она имеет более 2 уровней. Вот демонстрация с использованием iris
:
tinds <- stratified.sample(iris$Species, 0.7)
train <- iris[tinds,]
test <- iris[-tinds,]
Убедитесь, что баланс классов был сохранен:
table(train$Species)
table(test$Species)
Использование sample.split
и ваших данных:
inds <- sample.split(data$DiseasePositive, SplitRatio = 0.7)
train <- data[inds,]
test <- data[!inds,]