2

R我基于具有 12 个分类预测变量的训练数据集构建了一个分类模型,每个变量包含数十到数百个类别。

问题是在我用于验证的数据集中,一些变量的类别少于训练数据中的类别。

例如,如果我在训练数据变量 v1 中有 3 个类别 - 'a','b','c',则在验证数据集中 v1 只有 2 个类别 - 'a','b'

在决策树或随机森林等基于树的方法中,这没有问题,但在LASSO需要准备虚拟变量矩阵的逻辑回归方法(我使用 )中,训练数据矩阵和验证数据矩阵中的列数没有匹配。如果我们回到变量 v1 的示例,在训练数据中我得到 v1 的三个虚拟变量,而在验证数据中我只得到 2 个。

知道如何解决这个问题吗?

4

1 回答 1

1

您可以尝试通过正确设置级别来避免此问题。看看以下非常愚蠢的例子:

set.seed(106)
thedata <- data.frame(
  y = rnorm(100),
  x = factor(sample(letters[1:3],100,TRUE))
)
head(model.matrix(y~x, data = thedata))
thetrain <- thedata[1:7,]
length(unique(thetrain$x))
head(model.matrix(y~x, data = thetrain))

我用 ax 和 ay 变量制作了一个数据集,x 是一个具有 3 个级别的因子。训练数据集只有 2 个级别的 x,但模型矩阵仍然构造正确。那是因为 R 保留了原始数据集的级别数据:

> levels(thetrain$x)
[1] "a" "b" "c"

当您的训练集以某种方式使用例如函数data.frame()或任何其他丢弃levels因子信息的方法构建时,就会出现问题。

尝试以下操作:

thetrain$x <- factor(thetrain$x) # erases the levels
levels(thetrain$x)
head(model.matrix(y~x, data = thetrain))

您在第二行中看到级别“b”已被删除,因此模型矩阵不再是您想要的。因此,请确保您的训练数据集中的所有因素实际上都具有所有级别,例如:

thetrain$x <- factor(thetrain$x, levels = c("a","b","c"))

附带说明:如果您使用model.frame()or自己构建模型矩阵model.matrix(),则该参数xlev可能会有所帮助:

thetrain$x <- factor(thetrain$x) # erases the levels
levels(thetrain$x)
head(model.matrix(y~x, data = thetrain,
                  xlev = list(x = c('a','b','c'))))

请注意,此xlev参数实际上来自model.frame,并且model.matrix并非model.frame在每种情况下都调用。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。

于 2016-02-16T14:07:04.000 回答