在 glmnet 中对分类变量进行分组

机器算法验证 分类数据 网络
2022-03-02 03:04:16

考虑以下拟合:

fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")

如何指示哪些列x是分类/多项式?是否可以指定分组变量的索引?

该文档描述了该选项type.multinomial,如下所示:

如果“分组”,则对变量的多项式系数使用分组套索惩罚。这确保他们都在我们的外面。默认为“未分组”。

2个回答

glmnet()预期的前两个参数是预测变量的矩阵(x在您的情况下为 )和响应的向量(g4在您的情况下为 )。对于x矩阵,期望您已经虚拟化了任何分类变量。换句话说,glmnet()实际上并不知道您的任何预测变量是否是分类的,因为它们已经被虚拟化了。

如果您的数据在数据框中,构造x矩阵的好方法是使用该model.matrix()函数。它接受公式语言,将自动排除响应变量,并将为定义为因子的任何预测变量创建虚拟变量。

family="multinomial"type.multinomial="grouped"选项是指具有超过 2 个可能结果的响应变量您可以传入响应变量 ( g4) 作为因子。

包作者提供了一个很好的小插图来解释 的用法glmnet(),但不幸的是它没有给出一个使用model.matrix()来准备x矩阵的例子。

正如 justmarkham 指出的那样,您可以x使用model.matrix. 请注意,您需要排除拦截,因为 glmnet 默认包含一个。您可能还想更改默认对比函数,默认情况下会忽略每个因素的一个级别(治疗编码)。但是由于 lasso 惩罚,这不再是可识别性所必需的,实际上使所选变量的解释更加复杂。为此,请设置

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

现在,无论选择什么水平的因子,您都可以认为它表明这些特定水平很重要,而不是所有省略的水平。在机器学习中,我看到这种编码称为 one-hot 编码。

假设g4具有K级别,该type.multinomial="grouped"选项指定每个线性预测变量的特征都x将同时进入模型K,而不是让每个类别的线性预测变量(通常)具有自己的特征。 glmnet不(目前?)支持预测变量(x矩阵)的分组类型惩罚。该包grplasso确实如此,但它是用纯 R 编写的,因此比 慢glmnet,但您可以尝试一下。