Я написал небольшую функцию для разделения моего набора данных на обучающие и тестовые наборы. Тем не менее, я столкнулся с трудностями при работе с факторными переменными. На этапе проверки модели моего кода я получаю сообщение об ошибке, если модель была построена на наборе данных, который не имеет представления с каждого уровня фактора. Как я могу исправить эту функцию partition(), чтобы включить хотя бы одно наблюдение с каждого уровня фактор-переменной?Как я могу обеспечить, чтобы раздел имел репрезентативные наблюдения с каждого уровня фактора?
test.df <- data.frame(a = sample(c(0,1),100, rep = T),
b = factor(sample(letters, 100, rep = T)),
c = factor(sample(c("apple", "orange"), 100, rep = T)))
set.seed(123)
partition <- function(data, train.size = .7){
train <- data[sample(1:nrow(data), round(train.size*nrow(data)), rep= FALSE), ]
test <- data[-as.numeric(row.names(train)), ]
partitioned.data <- list(train = train, test = test)
return(partitioned.data)
}
part.data <- partition(test.df)
table(part.data$train[,'b'])
table(part.data$test[,'b'])
EDIT - Новая функция использования 'каретка' пакет и createDataPartition():
partition <- function(data, factor=NULL, train.size = .7){
if (("package:caret" %in% search()) == FALSE){
stop("Install and Load 'caret' package")
}
if (is.null(factor)){
train.index <- createDataPartition(as.numeric(row.names(data)),
times = 1, p = train.size, list = FALSE)
train <- data[train.index, ]
test <- data[-train.index, ]
}
else{
train.index <- createDataPartition(factor,
times = 1, p = train.size, list = FALSE)
train <- data[train.index, ]
test <- data[-train.index, ]
}
partitioned.data <- list(train = train, test = test)
return(partitioned.data)
}
Я знаю, что это не отвечает на ваш вопрос, но разве даже хорошая идея обусловить факторную переменную с таким небольшим количеством наблюдений? Они должны быть очень неточно оценены и могут сделать ваши прогнозы вне образца хуже, чем лучше. – RoyalTS
Вы правы, что это была бы плохая идея. Тем не менее, я бы никогда не использовал эту функцию на таком небольшом наборе данных на практике. Я сделал это маленьким, так что в секционированном test.df в значительной степени гарантировано наличие некоторых факторов с 0 наблюдениями. – zap2008
У меня такая же проблема, но, по-видимому, второе определение функции 'partition' применяется только для одного фактора за раз. Я понял, что ваш вопрос касается наличия раздела в наборе данных «train», который содержит все уровни факторов для входных столбцов: 'b' и' c', но 'createDataPartition' работает только для одного столбца, например:' partition (test.df, factor = test.df [, c ("b", "c")]) 'не работает. –