预测 glmnet() 时出现问题:"contrasts can be applied only to factors with 2 or more levels"

Problem predicting glmnet(): "contrasts can be applied only to factors with 2 or more levels"

我使用 R 的 glmnet 包训练了一个惩罚回归模型,并使用 sparse.model.matrix 和公式“~ . * (var1)”构建了 X,以从我的数据中获取每个项并与 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 转换为 model.matrix 以与 predict.glmnet() 一起使用时,如下所示:

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 + isOF[nn]]) : contrasts can be applied only to factors with 2 or more levels

我认为这可能是由 X_holdout 中的几列基本不变引起的(这是正确的,因为我现在正在尝试预测,我已经训练成功)。

如何避免这个问题?我的理解是,由于我使用交互训练我的模型,所以我必须在我的预测中创建一个具有相同交互的模型矩阵。

找到问题的根源:一些预测 X 列是不变的,因为保留数据明显小于训练数据。

为了解决这个问题,我需要在为训练数据和预测数据创建稀疏矩阵时使用“xlevs”参数,并且两者都具有相同的 xlev。

如果您不知道“xlev”是什么,它基本上是一个字符向量列表,指示将因子变量扩展到 dummy/one-hot 列时要使用的水平。这样,即使您的列只有 1 个值,sparse.matrix.model() 也可以理解还有更多级别,只是它们不存在于数据中。此参数还将帮助您确保训练矩阵和预测矩阵具有相同的列数,这对于 predict.glmnet()

很重要