在测试数据上使用带有 LARS 模型的预测时出现错误消息
Error message when using predict with LARS model on testdata
我使用 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))
我可能离题很远,但在我的领域中,如果找不到预期的变量,预测就不起作用。因此,我尝试了如果针对不在测试数据中的因子 (f1l3) 强制模型矩阵为 0 会发生什么情况。
注意 1:我在测试数据中创建了一个目标变量,因为我无法将您的代码获取到 运行 否则
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!
现在进行概括以允许创建 'complete' 模型矩阵
当测试数据中缺少因素时。
#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:我不知道如果问题反过来会发生什么(测试数据中存在的因素不在训练数据中)
我使用 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))
我可能离题很远,但在我的领域中,如果找不到预期的变量,预测就不起作用。因此,我尝试了如果针对不在测试数据中的因子 (f1l3) 强制模型矩阵为 0 会发生什么情况。
注意 1:我在测试数据中创建了一个目标变量,因为我无法将您的代码获取到 运行 否则
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!
现在进行概括以允许创建 'complete' 模型矩阵 当测试数据中缺少因素时。
#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:我不知道如果问题反过来会发生什么(测试数据中存在的因素不在训练数据中)