R中带有glmnet的Ridge回归多项式和相互作用项

时间:2018-06-25 09:55:19

标签: r dataframe machine-learning regression

我有一个包含9000个观测值和13个解释变量的数据集。 其中一些是类别变量,因此我将它们转换为虚拟变量,并且由于是基本类别,因此始终将类别设置为NULL。现在我已经准备好53个实验变量。我想进行一次岭回归,以得出最佳的模型以进行样本预测。为此,我想使用glmnet软件包。在13个解释变量中,我想创建2-10级的多项式,并建立所有可能的正态变量以及所有政治变量的交互项,此外,我还希望获得多项式到交互项2-10的多项式

我的问题是glmnet包仅使用矩阵或数据帧作为参数,因此我不能使用公式。如果我尝试使用所有这些变量生成一个数据框,那么我的数据框中就会有曼迪·科鲁姆的话,那我就关机了。

我该怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以使用model.matrix进行指定。这是使用iris数据的示例

首先,我将创建一个具有某些级别的虚拟因子列:

df <- iris
df$factor <- as.factor(sample(1:2, nrow(iris), replace = TRUE))
head(df)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species factor
1          5.1         3.5          1.4         0.2  setosa      1
2          4.9         3.0          1.4         0.2  setosa      1
3          4.7         3.2          1.3         0.2  setosa      1
4          4.6         3.1          1.5         0.2  setosa      2
5          5.0         3.6          1.4         0.2  setosa      2
6          5.4         3.9          1.7         0.4  setosa      2

现在制作模型矩阵

x <- model.matrix(Species ~ poly(Sepal.Length, 10)*factor-1, #-1 means no intercept
              data = df)
ncol(x) #output is 22, do head(x) to see what the columns are

基本上,对于Sepal,Length与第一级交互有10列poly;对于Sepal.Length与第二级交互交互,有10列poly +与因子变量相对应的两个单列。

现在使用cv查找最佳的lambda:

model <- cv.glmnet(y = iris$Species,
                   x = x,
                   alpha = 0,
                   family = "multinomial",
                   lambda.min.ratio = 1e-6) #changed it from the default since it looked the optimum is lower then the min lambda tried

plot(model)

enter image description here

答案 1 :(得分:0)

这不是一个完整的答案-解释了为什么如此困难的原因-但绝对无法发表评论。

首先,套索/岭/弹性网方法从根本上建立在对模型矩阵的操作上(即每个观测值一行,每个 predictor 变量,即从输入变量),因此实际上在某种程度上无法构建模型矩阵(尽管您可以分段完成,请参见下文)。

稀疏模型矩阵模型将有助于构建主要涉及因素的模型矩阵(这些因子会转换为指标或虚拟变量),但我认为这不会给您太大帮助。

math overflow question解释了n变量的阶数k的多项式需要choose(n+k,k)派生变量(用R表示:这是二项式系数,给出了可能样本的数量k个对象中n+k的大小)。构造一个报告模型矩阵的列数,如果有r行的情况下元素总数以及模型矩阵的总大小(以Mb为单位)的函数:

calc_size <- function(deg,nvars,r=9000) {
  cc <- choose(deg+nvars,nvars)
  return(c(cc,cc*r,cc*r*8/2^20))
}
calc_size(10,13,r=9000)

告诉您您需要1.14个百万列,10.2个 billion 条目以及77 Gb的空间来存储此问题的模型矩阵。无需担心扩展分类变量还需要多少空间。如果您真的想处理53个全数字列至第10位,则需要1.27 * 10 ^ 11列和PB级的存储空间。 (对于稀疏模型矩阵较少,但是将稀疏(虚拟变量)和非稀疏列组合在一起可能会很棘手...)

如果您确实要执行此操作,则可以使用biglasso软件包。 vignette给出了从文件支持的31 G数据集中拟合n = 2898,p = 1,339,511的数据集的示例。这比您预期的要小,但是至少是相同的数量级(4个核的拟合大约需要51分钟...)如果这样做,我首先会构建模型矩阵(可能分成小块) (例如一次500或1000行),然后将块存储/连接到磁盘上的数据文件中,然后使用biglasso来拟合模型。

但是,取决于您可用的硬件和技术专家的水平,您可能不得不缩减目标(对C(10,53)列施加强力是不太可能的。)