预测 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()
很重要
我使用 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()
很重要