验证数据中缺少类别
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
。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。
我在 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
。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。