验证数据中缺少类别

时间:2016-02-16 12:15:43

标签: r validation categorical-data dummy-variable

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

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

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

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

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

1 个答案:

答案 0 :(得分: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))

我使用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))

你在第二行看到了关卡&#34; b&#34;已被删除,因此模型矩阵不再是您想要的。因此,请确保训练数据集中的所有因素实际上都包含所有级别,例如:

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。因此,不能保证解决方案始终有效,但应该用于数据框。