在testdata上使用predict with LARS模型时出现错误消息

在testdata上使用predict with LARS模型时出现错误消息,r,machine-learning,lars,R,Machine Learning,Lars,我使用了一个lars模型,并将其应用于一个包含数值数据和因子的大型数据集(75个特征) 我用计算机训练模型 mm <- model.matrix(target~0+.,data=data) larsMod <- lars(mm,data$target,intercept=FALSE) 我认为这与数据集中的因子水平不同这一事实有关。然而 which(! colnames(mm.test) %in% colnames(mm) ) 给出一个空结果 当 给出了3个独立。 因此,3个因子水

我使用了一个
lars
模型,并将其应用于一个包含数值数据和因子的大型数据集(75个特征)

我用计算机训练模型

mm <- model.matrix(target~0+.,data=data)
larsMod <- lars(mm,data$target,intercept=FALSE)
我认为这与数据集中的因子水平不同这一事实有关。然而

which(! colnames(mm.test) %in% colnames(mm) )
给出一个空结果 当

给出了3个独立。 因此,3个因子水平确实出现在训练集中,但没有出现在测试集中。 为什么这会引起问题?我怎样才能解决这个问题

代码blow用一个玩具示例说明了这一点。在测试数据集中,因子没有级别“l3”

require(lars)
数据链=数据帧(目标=c(0,1,0,1,1,1,1,1,0,0),f1=代表(c(“l1”、“l2”、“l1”、“l2”、“l3”),2),n1=代表(c(1,2,3,4,5),2))
测试数据=数据帧(f1=代表(c(“l1”,“l2”,“l1”,“l2”,“l2”),2),n1=代表(c(7,4,3,4,5),2))

mm我可能在这方面做得很差,但在我的领域,如果预测不能找到它期望的变量,它就不起作用。因此,我尝试了如果我强制模型矩阵为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!
set.seed(123)

test.data$target是创建
mm.test时的双逗号?你能分享一些(可能是生成的,但类似的)数据吗?额外的通信是有意的,是的。。。我将尽力提供数据。谢谢@Heroka我添加了一个玩具示例。我现在离线,但我怀疑是这样的。在我看来,测试数据中缺少某些内容的情况是最自然的……这是我的设置
which(! colnames(mm.test) %in% colnames(mm) )
which(! colnames(mm) %in% colnames(mm.test) )
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))
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