【问题标题】:Problem predicting glmnet(): "contrasts can be applied only to factors with 2 or more levels"预测 glmnet() 的问题:“对比只能应用于具有 2 个或更多级别的因素”
【发布时间】:2021-01-24 02:51:53
【问题描述】:

我使用 R 的 glmnet 包训练了一个惩罚回归模型,并使用 sparse.model.matrix 构造了一个 X,其公式为“~ . * (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 转换为 model.matrix 以与 predict.glmnet() 一起使用时,如下所示:

X_pred <- sparse.model.matrix(object = ~.*(var1), data = X_holdout)
predict(object =  cv_lasso,
        newx = X_pred,
        s = "lambda.min")

但我收到以下错误:

contrasts&lt;-(*tmp*, value = contr.funs[1 + isOF[nn]]) 中的错误: 对比只能应用于具有 2 个或更多级别的因素

我相信这可能是由于 X_holdout 中的几列基本保持不变(这是正确的,因为我现在正在尝试预测,我已经成功训练了)。

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

【问题讨论】:

    标签: r sparse-matrix glmnet


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2020-05-03
      • 2020-04-22
      • 2020-03-27
      • 2023-03-23
      • 2018-10-22
      相关资源
      最近更新 更多