【问题标题】:How does glmnet's standardize argument handle dummy variables?glmnet 的标准化参数如何处理虚拟变量?
【发布时间】:2013-07-27 02:25:18
【问题描述】:

在我的数据集中,我有许多连续变量和虚拟变量。对于 glmnet 的分析,我希望对连续变量进行标准化,而不是对虚拟变量进行标准化。

我目前手动执行此操作,首先定义一个只有 [0,1] 值的列的虚拟向量,然后在所有非虚拟列上使用 scale 命令。问题是,这不是很优雅。

但是 glmnet 有一个内置的 standardize 参数。默认情况下,这也会标准化假人吗?如果是这样,有没有一种优雅的方法可以告诉 glmnet 的 standardize 参数跳过假人?

【问题讨论】:

  • 你为什么要做那么多额外的工作?
  • @DWin 我没有看到其他方法。如果 glmnet 不歧视,那么我需要。正如我刚刚在下面发布的那样,如果我们无法解释标准化虚拟变量的系数,那么我需要在标准化之前将虚拟变量与非虚拟变量分开。

标签: r dataset machine-learning glmnet


【解决方案1】:

简而言之,是的 - 这将使虚拟变量标准化,但这样做是有原因的。 glmnet 函数将矩阵作为其X 参数的输入,而不是数据框,因此它不会区分factor 列,如果参数是data.frame,您可能拥有的列。如果你看一下 R 函数,glmnet 在内部将 standardize 参数编码为

    isd = as.integer(standardize)

将 R 布尔值转换为 0 或 1 整数,以提供给任何内部 FORTRAN 函数(elnet、lognet 等)

如果您进一步检查 FORTRAN 代码(固定宽度 - 老派!),您将看到以下代码块:

          subroutine standard1 (no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr)    989
          real x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni)                        989
          integer ju(ni)                                                        990
          real, dimension (:), allocatable :: v                                     
          allocate(v(1:no),stat=jerr)                                           993
          if(jerr.ne.0) return                                                  994
          w=w/sum(w)                                                            994
          v=sqrt(w)                                                             995
          if(intr .ne. 0)goto 10651                                             995
          ym=0.0                                                                995
          y=v*y                                                                 996
          ys=sqrt(dot_product(y,y)-dot_product(v,y)**2)                         996
          y=y/ys                                                                997
    10660 do 10661 j=1,ni                                                       997
          if(ju(j).eq.0)goto 10661                                              997
          xm(j)=0.0                                                             997
          x(:,j)=v*x(:,j)                                                       998
          xv(j)=dot_product(x(:,j),x(:,j))                                      999
          if(isd .eq. 0)goto 10681                                              999
          xbq=dot_product(v,x(:,j))**2                                          999
          vc=xv(j)-xbq                                                         1000
          xs(j)=sqrt(vc)                                                       1000
          x(:,j)=x(:,j)/xs(j)                                                  1000
          xv(j)=1.0+xbq/vc                                                     1001
          goto 10691                                                           1002

看看标有 1000 的行 - 这基本上是将标准化公式应用于X 矩阵。

现在从统计学上讲,通常不会对分类变量进行标准化以保留估计回归量的可解释性。然而,正如 Tibshirani here 所指出的,“套索方法需要对回归变量进行初始标准化,以便惩罚方案对所有回归变量都是公平的。对于分类回归变量,使用虚拟变量对回归变量进行编码,然后对虚拟变量进行标准化" - 所以虽然这会导致连续变量和分类变量之间的任意缩放,但它是为了平等惩罚处理而完成的。

【讨论】:

  • 我做了一些similar dig up 来确认 glmnet 在拟合标准化变量后重新转换系数的方式。 Funtran :-)
  • 来自glmnet 的帮助:“系数始终以原始比例返回”。因此,系数的可解释性应该不是问题。
  • 虽然系数是“在原始尺度上”,但 L1 和 L2 惩罚固有地偏向回归系数以尝试减少方差(请参阅Bias-Variance Tradeoff),这意味着它们不应被视为无偏对因变量值的影响估计。只是一个澄清:)
【解决方案2】:

glmnet 对虚拟变量一无所知,因为它没有公式接口(因此不会触及model.framemodel.matrix。)如果您希望它们受到特殊对待,您必须自己做。

【讨论】:

  • 让假人标准化可以吗?
  • 回答我自己的问题,上面。 不,标准化虚拟变量是不行的。 引用 sagepub.com/upm-data/21120_Chapter_7.pdf,第 140 页:“虚拟回归器的未标准化系数可解释为特定类别与基线类别之间的预期响应变量差异对于虚拟回归器集(当然,控制模型中的其他解释变量)。如果虚拟回归器系数是标准化的,那么这种直接的解释就会丢失。”
  • @R_User 您想根据您的评论添加答案吗?然后我可以接受你的答案。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2018-11-06
  • 2020-12-01
  • 1970-01-01
  • 2021-03-13
  • 2021-10-27
相关资源
最近更新 更多