验证数据中缺少类别

Missing Categories in Validation Data

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

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

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

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

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

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

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))

我制作了一个包含 x 和 y 变量的数据集,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()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。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。