我在R
基于具有12个分类预测变量的训练数据集构建了一个分类模型,每个变量包含数十到数百个类别。
问题在于,在我用于验证的数据集中,某些变量的类别少于训练数据。
例如,如果我在训练数据变量v1中有3个类别 - 'a','b','c'
,则在验证数据集v1中只有2个类别 - 'a','b'
。
在基于树的方法(如决策树或随机林)中没有问题,但在逻辑回归方法(我使用LASSO
)中需要准备虚拟变量矩阵,训练数据中的列数矩阵和验证数据矩阵不匹配。如果我们回到变量v1的例子,在训练数据中我得到v1的三个虚拟变量,而在验证数据中我只得到2.
知道如何解决这个问题吗?
答案 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
。因此,不能保证解决方案始终有效,但应该用于数据框。