首页 > 解决方案 > 尝试使用 gl_model 函数时,数据框具有不同的维度

问题描述

我有一个关于R代码的问题......

当我尝试将功能添加到我的模型中时,我遇到了问题。我们的教授给了我们一些代码来对 Magic The Gathering 卡的价格进行 lasso 回归。如果我按原样运行他的代码,它将起作用。每当我尝试将另一列作为功能添加到他的代码中时,我都会遇到问题。

这是错误:“cbind2(1, newx) %*% nbeta 中的错误:文件 ../MatrixOps/cholmod_sdmult.c 第 90 行中的 Cholmod 错误‘X 和/或 Y 有错误的尺寸’”

我的命令行的屏幕截图 然后,如果我在较大的训练数据集中删除一些列,那么我仍然会得到同样的错误。

使数据框具有相同的列数后

在运行代码时,我检查了数据帧“测试”和“训练”的尺寸,并找出了哪些行正在改变测试和训练数据帧。

这些行:

dummies <- dummyVars(future_price ~ ., data = train)
train<-predict(dummies, newdata = train)
test<-predict(dummies, newdata = test)

因此,在运行这些行之前,训练数据集和测试数据集都正好有 23 个变量(列)。运行这三个虚拟行后,测试数据集有 41 列,训练数据集有 47 列。如果除了替换“train”和“test”之外,代码行相同,我真的不明白如何将不同数量的列添加到每个数据帧中。

请帮忙!谢谢。

标签: rmachine-learningmodel

解决方案


问题是您添加的新功能需要使用转换为因子as.factor

让我们重现您的错误

df <- data.frame(cat = c('A','B','C','B','A'),target=c(0,0,1,1,0))
df$cat <- as.character(df$cat)
train <- df[1:2,]
test <- df[3:5,]
dv_train <- dummyVars(target~.,train)
predict(dv_train,train)
# no column catC is created because in train there is no row where cat=="C"
#      catA     catB
#1        1        0
#2        0        1
predict(dv_train,test)
#  catA catB catC
#3    0    0    1
#4    0    1    0
#5    1    0    0

您可以看到您获得了具有不同列数的数据框,因为您在训练和测试中具有不同数量的级别

为了解决这个问题,你应该在测试和训练之间分割你的数据帧之前将你的所有字符变量转换为因子,这样当 dummyVars 被执行时,每个级别都会创建一个新列

# Convert cat column to factor
df$cat <- as.factor(df$cat)
train <- df[1:2,]
test <- df[3:5,]
dv_train <- dummyVars(target~.,train)
predict(dv_train,train)
#   cat.A cat.B cat.C
# 1     1     0     0
# 2     0     1     0

现在有一个 cat C 的列,即使 C 仍然没有出现在 train


推荐阅读