Сообщение об ошибке при использовании предиката с моделью LARS в тестовых данных
Я использую lars
моделировать и применять его к большому набору данных (75 признаков) с числовыми данными и коэффициентами.
Я тренирую модель
mm <- model.matrix(target~0+.,data=data)
larsMod <- lars(mm,data$target,intercept=FALSE)
что дает хорошую подгонку в образце. Если я применю его к
mm.test <- model.matrix(target~0+.,,data=test.data)
predict(larsMod,mm.test,type="fit",s=length(larsMod$arc.length))
тогда я получаю сообщение об ошибке
Error in scale.default(newx, object$meanx, FALSE) :
length of 'center' must equal the number of columns of 'x'
Я предполагаю, что это связано с тем, что уровни факторов различаются в наборах данных. тем не мение
which(! colnames(mm.test) %in% colnames(mm) )
дает пустой результат, а
which(! colnames(mm) %in% colnames(mm.test) )
дает 3 индекса. Таким образом, 3 факторных уровня появляются в тренировочном наборе, но не в тестовом наборе. Почему это вызывает проблемы? Как я могу решить это?
Удар кода иллюстрирует это на игрушечном примере. В тестовом наборе данных коэффициент не имеет уровня "l3".
require(lars)
data.train = data.frame( target = c(0,1,0,1,1,1,1,0,0,0), f1 = rep(c("l1","l2","l1","l2","l3"),2), n1 = rep(c(1,2,3,4,5),2))
test.data = data.frame(f1 = rep(c("l1","l2","l1","l2","l2"),2),n1 = rep(c(7,4,3,4,5),2) )
mm <- model.matrix(target~0+f1+n1,data = data.train)
colnames(mm)
length(colnames(mm))
larsMod <- lars(mm,data.train$target,intercept=FALSE)
mm.test <- model.matrix(~0+f1+n1,data=test.data)
colnames(mm.test)
length( colnames(mm.test) )
which(! colnames(mm.test) %in% colnames(mm) )
which(! colnames(mm) %in% colnames(mm.test) )
predict(larsMod,mm.test,type="fit",s=length(larsMod$arc.length))
1 ответ
Я мог бы быть очень далеко отсюда, но в моем поле предсказание не работает, если он не может найти переменную, которую он ожидает. Поэтому я попробовал, что случилось, если бы я принудил матрицу модели к 0 для фактора (f1l3), которого не было в данных испытаний.
Примечание 1: я создал целевую переменную в testdata, потому что я не мог заставить ваш код работать иначе
set.seed(123)
test.data$target <- rbinom(nrow(test.data),1,0.2)
#proof of concept:
mm.test <- model.matrix(target~0+f1+n1,data=test.data)
mm.test1 <- cbind(f1l3=0,mm.test)
predict(larsMod,mm.test1[,colnames(mm)],type="fit",s=length(larsMod$arc.length)) #runs
#runs!
Теперь обобщите, чтобы создать "полную" матрицу модели, когда в тестовых данных отсутствуют факторы.
#missing columns
mis_col <- setdiff(colnames(mm), colnames(mm.test))
#matrix of missing levels
mis_mat <- matrix(0,ncol=length(mis_col),nrow=nrow(mm.test))
colnames(mis_mat) <- mis_col
#bind together
mm.test2 <- cbind(mm.test,mis_mat)[,colnames(mm)] #to ensure ordering, yielded different results in my testing
predict(larsMod,mm.test2,type="fit",s=length(larsMod$arc.length)) #runs
Примечание 2: я не знаю, что происходит, если проблема заключается в другом (факторы, присутствующие в тестовых данных, которых не было в данных поезда)