考虑以下拟合:
fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")
如何指示哪些列x
是分类/多项式?是否可以指定分组变量的索引?
该文档描述了该选项type.multinomial
,如下所示:
如果“分组”,则对变量的多项式系数使用分组套索惩罚。这确保他们都在我们的外面。默认为“未分组”。
考虑以下拟合:
fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")
如何指示哪些列x
是分类/多项式?是否可以指定分组变量的索引?
该文档描述了该选项type.multinomial
,如下所示:
如果“分组”,则对变量的多项式系数使用分组套索惩罚。这确保他们都在我们的外面。默认为“未分组”。
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
,但您可以尝试一下。