我使用R的glmnet软件包训练了一个受惩罚的回归模型,X使用一个sparse.model.matrix构造,公式为"~ .* (var1)“,以便从我的数据和与var1的交互中获得每个术语:
X3 <- sparse.model.matrix(object = ~.*(var1), data = X)[,-1]
cv_lasso <- cv.glmnet(x = X3, y = Y3,
alpha = 1,
nfold = 10,
family = "binomial",
nlambda = 100,
lambda.min.ratio=0.001,
type.measure="auc",
keep = TRUE,
parallel = TRUE)
现在,我正在尝试预测几个数据点,但是当将newX转换为与predict.glmnet()一起使用的model.matrix时,如下所示:
X_pred <- sparse.model.matrix(object = ~.*(var1), data = X_holdout)
predict(object = cv_lasso,
newx = X_pred,
s = "lambda.min")
但我得到了以下错误:
Error in
contrasts<-
(*tmp*
,value = contr.funs[1 + isOFnn]):对比只适用于2级或2级以上的因素
我相信这可能是由X_holdout的几个列造成的,这些列基本上是常量的(这是正确的,因为我现在正试图预测,我已经成功地训练了)。
我怎样才能避免这个问题?我的理解是,由于我使用交互来训练我的模型,所以我必须在我的预测中创建一个具有相同交互作用的模型矩阵。
发布于 2020-10-12 04:14:50
找到了问题的根源:一些预测X列是常量的,因为持久化数据明显小于训练数据。
为了解决这个问题,我需要使用"xlevs“参数来为训练数据和预测数据创建稀疏矩阵,并且都使用相同的xlev。
如果您不知道"xlev“是什么,它基本上是一个字符向量列表,它指示将因子变量展开为虚拟/一个热列时要使用的级别。这样,即使您有一个只有一个值的列,sparse.matrix.model()也可以理解有更多的级别,只是它们不存在于数据中。这个参数还将帮助您确保训练矩阵和预测矩阵都有相同的列数,这对于predict.glmnet()非常重要。
https://stackoverflow.com/questions/64273001
复制相似问题