将 glmnet 从二项式更改为多项式会产生错误
Changing glmnet from binomial to multinomial gives error
我正在尝试调整二项式 glmnet 的代码,使其适用于多项式问题,但由于某种原因,我不断收到错误代码。
这是完美运行的二项式模型的原始代码:
traininglasso <- stratified(sp_lasso, group = "Cat",
select = list(Cat = c("A","B", "C")),
size = c(86), replace=FALSE)
traininglasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]
check_lasso <- anti_join(sp_lasso, traininglasso, by=c("Accepted Symbol"))
check_lasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]
use_for_lasso <- within(for_lasso, Cat <- relevel(Cat, ref="C"))
lassod <- model.matrix(Cat~., use_for_lasso)[,-1]
cv.lassod <- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "binomial")
lambdad <- cv.lassod
lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "binomial",
lambda = lambdad$lambda.1se)
coefd <- coef(lasso_modeld)
check_lasso_matrix <- model.matrix(Cat~., check_lasso)[,-1]
probslasso4 <- as.data.frame(predict.glmnet(lasso_modeld, type="response", newx = check_lasso_matrix))
不好意思啰嗦了,不过基本上我的步骤是这样的:
- 对原始数据集进行分层 运行dom 样本,以获得三个类别(Cat)中每个类别的 86 个观察值:“A”、“B”和“C”
- 将类别 A 和 B 连接在一起,使结果是二元的(两个类别,只有 B 和 C)
- Assemble 不在 运行dom 样本中的所有观察结果用于最后检查模型准确性并重新分类。
- 运行 推荐的 LASSO glm 步骤
- 然后,在最后一行中,使用非训练数据生成预测以检查模型的准确性。
同样,所有这些都工作得很好。 但是,当我将我的数据保留为三个类别并将系列更改为多项时(从字面上看,这些是我在下面的代码中所做的唯一更改,其他所有内容(包括数据)都是相同的)我明白了错误信息:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'as.matrix': requires numeric/complex matrix/vector arguments
我读到其他人遇到此错误并且只需要重新格式化他们的矩阵,但我怀疑这不是我的问题,因为二项式代码适用于我用于此的矩阵。
这是我为无效的多项式版本尝试过的代码。我再次 运行 上面的整个代码块,但我只在此处包括我编辑的从二项式到多项式的 4 行:
traininglasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]
check_lasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]
cv.lassod<- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "multinomial")
lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "multinomial",
lambda = lambdad$lambda.1se)
想通了。无论出于何种原因,当您使用 glmnet 创建多项式模型时,您需要使用常规 predict()
函数而不是 predict.glmnet()
函数。对多项式和二项式模型使用相同的模型矩阵工作正常 - 似乎错误实际上与矩阵格式无关。
我正在尝试调整二项式 glmnet 的代码,使其适用于多项式问题,但由于某种原因,我不断收到错误代码。
这是完美运行的二项式模型的原始代码:
traininglasso <- stratified(sp_lasso, group = "Cat",
select = list(Cat = c("A","B", "C")),
size = c(86), replace=FALSE)
traininglasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]
check_lasso <- anti_join(sp_lasso, traininglasso, by=c("Accepted Symbol"))
check_lasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]
use_for_lasso <- within(for_lasso, Cat <- relevel(Cat, ref="C"))
lassod <- model.matrix(Cat~., use_for_lasso)[,-1]
cv.lassod <- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "binomial")
lambdad <- cv.lassod
lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "binomial",
lambda = lambdad$lambda.1se)
coefd <- coef(lasso_modeld)
check_lasso_matrix <- model.matrix(Cat~., check_lasso)[,-1]
probslasso4 <- as.data.frame(predict.glmnet(lasso_modeld, type="response", newx = check_lasso_matrix))
不好意思啰嗦了,不过基本上我的步骤是这样的:
- 对原始数据集进行分层 运行dom 样本,以获得三个类别(Cat)中每个类别的 86 个观察值:“A”、“B”和“C”
- 将类别 A 和 B 连接在一起,使结果是二元的(两个类别,只有 B 和 C)
- Assemble 不在 运行dom 样本中的所有观察结果用于最后检查模型准确性并重新分类。
- 运行 推荐的 LASSO glm 步骤
- 然后,在最后一行中,使用非训练数据生成预测以检查模型的准确性。
同样,所有这些都工作得很好。 但是,当我将我的数据保留为三个类别并将系列更改为多项时(从字面上看,这些是我在下面的代码中所做的唯一更改,其他所有内容(包括数据)都是相同的)我明白了错误信息:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'as.matrix': requires numeric/complex matrix/vector arguments
我读到其他人遇到此错误并且只需要重新格式化他们的矩阵,但我怀疑这不是我的问题,因为二项式代码适用于我用于此的矩阵。
这是我为无效的多项式版本尝试过的代码。我再次 运行 上面的整个代码块,但我只在此处包括我编辑的从二项式到多项式的 4 行:
traininglasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]
check_lasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]
cv.lassod<- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "multinomial")
lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "multinomial",
lambda = lambdad$lambda.1se)
想通了。无论出于何种原因,当您使用 glmnet 创建多项式模型时,您需要使用常规 predict()
函数而不是 predict.glmnet()
函数。对多项式和二项式模型使用相同的模型矩阵工作正常 - 似乎错误实际上与矩阵格式无关。