首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预测glmnet()的问题:“对比只能适用于2级或2级以上的因素”

预测glmnet()的问题:“对比只能适用于2级或2级以上的因素”
EN

Stack Overflow用户
提问于 2020-10-09 02:10:32
回答 1查看 230关注 0票数 0

我使用R的glmnet软件包训练了一个受惩罚的回归模型,X使用一个sparse.model.matrix构造,公式为"~ .* (var1)“,以便从我的数据和与var1的交互中获得每个术语:

代码语言:javascript
复制
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时,如下所示:

代码语言:javascript
复制
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的几个列造成的,这些列基本上是常量的(这是正确的,因为我现在正试图预测,我已经成功地训练了)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-12 12:14:50

找到了问题的根源:一些预测X列是常量的,因为持久化数据明显小于训练数据。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64273001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档