r studio caret train factor нет данных

Я работаю с набором данных, который я тренирую с помощью пакета Caret. Моя переменная класса имеет 7 уровней, которые я создаю метками с документацией набора данных. Случилось так, что на одном из уровней вообще нет данных в наборе данных, и у меня возникает следующая ошибка... Error in train.default(x, y, weights = w, ...) : One or more factor levels in the outcome has no data: 'vwnfp'. Самый простой способ — просто избавиться от этого уровня, и это должно сработать. Но мне интересно, есть ли в пакетах каретки какой-либо параметр, который может обрабатывать ситуации такого типа. Я пытался добавить na.action = 'na.omit'. Мне также интересно, может ли с этим справиться использование аргумента preProcess, но я никогда раньше не использовал preProcess, и мои попытки не увенчались успехом. Вот мой код для обучения данных...

fit.control <- trainControl(method = 'cv', number = 10)
grid <- expand.grid(cp = seq(0, 0.05, 0.005))
trained.tree <- train(Type_of_glass ~ ., data = data.train, method = 'rpart',
                  trControl = fit.control, metric = 'Accuracy', maximize = TRUE,
                  tuneGrid = grid, na.action = 'na.omit')

Набор данных находится по следующему адресу... http://archive.ics.uci.edu/ml/machine-learning-databases/glass/glass.data

Это код, который я использую для управления набором данных...

 # Loading dataset and transform
data <- read.csv(file = 'data.csv',
             head = FALSE)
colnames(data) <- c('Id', 'Ri', 'Na', 'Ma', 'Al', 
                'Si', 'K', 'Ca', 'Ba', 'Fe', 
                'Type_of_glass')
str(data)
data <- subset(data, select = -Id)
data$Type_of_glass <- factor(data$Type_of_glass, 
                         levels = c(1, 2, 3, 4, 5, 6, 7), 
                         labels = c('bwfp', 'bwnfp', 'vwfp', 'vwnfp', 
                                    'c', 't', 'h'))
str(data)

# Spliting training and test dataset
set.seed(2)
sample.train <- sample(1:nrow(data), nrow(data) * .8)
sample.test <- setdiff(1:nrow(data), sample.train)
data.train <- data[sample.train, ]
data.test <- subset(data[sample.test, ], select = -Type_of_glass)

Я не хочу вручную избавляться от уровня, потому что в рабочей среде после обучения невидимый набор данных проходит через модель как есть. Как я могу справиться с этой ситуацией в наборе данных?


person Gilbert    schedule 28.10.2016    source источник
comment
Это плохое разделение тренировки/тестирования. Если ваши данные недостаточно велики, чтобы сделать вероятность такой неудачи незначительной, вы должны либо проверить апостериорно, чтобы убедиться, что это не произойдет (и повторно разделить, если это произойдет), либо выполнить стратифицированное разделение, чтобы гарантировать, что это не произойдет. т случится.   -  person Gregor Thomas    schedule 28.10.2016
comment
см. обсуждение здесь. В основном удалите неизвестный уровень. У вас нет данных для обучения с ним, и пока это факторный уровень, большинству моделей потребуются некоторые данные для этого.   -  person phiver    schedule 29.10.2016
comment
Я сделал именно так, и это сработало. Мне интересно, если это подход, если модель находится в производстве с миллионами дорог.   -  person Gilbert    schedule 29.10.2016