【问题标题】:Missing Categories in Validation Data验证数据中缺少类别
【发布时间】:2016-05-27 17:18:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 可能更多的是交叉验证的问题
  • 你能举一个可重现的例子吗?你看过 model.matrix 中的 xlev 参数了吗?

标签: r validation categorical-data dummy-variable


【解决方案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))

您在第二行中看到级别“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。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2013-08-05
    • 2014-01-05
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多