Предположим, что мой набор данных для обучения машинному обучению содержит 3 столбца с категориями до 50 различных уровней.Я горячо кодирую столбцы.Тестовый набор данных имеет только одну строку.Как я могу сохранить структуру обучающего набора данных при кодировании тестового набора данных?
Все отлично работает для обучающих данных ...
v1 <- factor(c("a","b","c","a"))
v2 <- factor(c("A","A","B","C"))
train <- data.frame(v1 = v1,v2 = v2)
train_dummy <- as.data.frame(model.matrix(~ v1 + v2 -1 , data=train,
contrasts.arg=list(v1=contrasts(train$v1, contrasts=F),
v2=contrasts(train$v2, contrasts=F))))
print(train)
v1 v2
a A
b A
c B
a C
print(train_dummy )
v1a v1b v1c v2A v2B v2C
1 0 0 1 0 0
0 1 0 1 0 0
0 0 1 0 1 0
1 0 0 0 0 1
... но для тестовых данных не получается.Когда я пытаюсь применить уровни фактора обучающих данных к тестовым данным, это не работает:
test <- data.frame(v1 = factor("a"),v2 = factor("A"))
test_dummy <- as.data.frame(model.matrix(~ v1 + v2 -1 , data=test,
contrasts.arg=list(v1=contrasts(train$v1, contrasts=F),
v2=contrasts(train$v2, contrasts=F))))
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
Конечно, я могу Row связать обучающие и тестовые данные, а затем выполнить фиктивное кодирование, но это рабочий коди я не могу принять это как единственное решение:
train_test <- rbind(train,test)
train_test_dummy <- as.data.frame(model.matrix(~ v1 + v2 -1 , data=train_test,
contrasts.arg=list(v1=contrasts(train_test$v1, contrasts=F),
v2=contrasts(train_test$v2, contrasts=F))))
print(train_test_dummy)
v1a v1b v1c v2A v2B v2C
1 0 0 1 0 0
0 1 0 1 0 0
0 0 1 0 1 0
1 0 0 0 0 1
1 0 0 1 0 0
Есть ли что-нибудь лучше?
Это дубликат , но на вопрос не ответили, а все остальные вопросы касаются только создания фиктивных переменных из одного набора данных.