Я работаю с набором данных, который я тренирую с помощью пакета 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)
Я не хочу вручную избавляться от уровня, потому что в рабочей среде после обучения невидимый набор данных проходит через модель как есть. Как я могу справиться с этой ситуацией в наборе данных?