【问题标题】:LASSO-type regressions with non-negative continuous dependent variable (dependent var)具有非负连续因变量(因变量)的 LASSO 型回归
【发布时间】:2020-09-23 23:54:27
【问题描述】:

我主要使用“glmnet”包(在 R 中)来执行正则化线性回归。

但是我想知道它是否可以使用 非负(整数)连续(依赖)结果变量执行 LASSO 类型的回归。

我可以使用family = poisson,但结果变量不是特别是“计数”变量。它只是一个下限为0的连续变量。

我知道“lower.limits”函数,但我猜它是针对协变量(因变量)的。 (如果我对这个功能的理解不正确,请纠正我。)

期待大家的回音!谢谢:-)

【问题讨论】:

    标签: r machine-learning glmnet lasso-regression


    【解决方案1】:

    您说得对,在 glmnet 中设置下限是针对协变量的。泊松会将下限设置为零,因为您取幂以取回“计数”。

    按照这些思路,如果您转换响应变量,它很可能会起作用。一种快速的方法是记录您的响应变量,进行拟合并将其转换回来,这将确保它始终为正。你必须处理零

    另一种方法是电源转换。有很多事情要考虑,我只能尝试使用带有数据集的 two parameter box-cox,因为您没有提供您的数据集:

    library(glmnet)
    library(mlbench)
    library(geoR)
    data(BostonHousing)
    data = BostonHousing
    data$chas=as.numeric(data$chas)
    
    # change it to min 0 and max 1
    data$medv = (data$medv-min(data$medv))/diff(range(data$medv))
    

    然后在这里我通过 pca 使用快速近似(不拟合所有变量)来获得合适的 lambda1 和 lambda2 :

    bcfit = boxcoxfit(object = data[,14], 
    xmat = prcomp(data[,-14],scale=TRUE,center=TRUE)$x[,1:2],
    lambda2=TRUE)
    
    bcfit
    Fitted parameters:
         lambda     lambda2       beta0       beta1       beta2     sigmasq 
     0.42696313  0.00001000 -0.83074178 -0.09876102  0.08970137  0.05655903 
    
    Convergence code returned by optim: 0
    

    检查 lambda2,它是决定是否得到负值的关键。它应该相当小。

    创建功率变换的函数:

    bct = function(y,l1,l2){((y+l2)^l1 -1)/l1}
    bctinverse = function(y,l1,l2){(y*l1+1)^(1/l1) -l2}
    

    现在我们转换响应:

    data$medv_trans = bct(data$medv,bcfit$lambda[1],bcfit$lambda[2])
    

    并适合 glmnet:

    fit = glmnet(x=as.matrix(data[,1:13]),y=data$medv_trans,nlambda=500)
    

    获取所有 lambdas 的预测,一旦转换回来,您可以看到没有负面预测:

    pred = predict(fit,as.matrix(data[,1:13]))
    range(bctinverse(pred,bcfit$lambda[1],bcfit$lambda[2]))
    [1] 0.006690685 0.918473356
    

    假设我们与 cv 匹配:

    fit = cv.glmnet(x=as.matrix(data[,1:13]),y=data$medv_trans)
    pred = predict(fit,as.matrix(data[,1:13]))
    pred_transformed = bctinverse(pred,bcfit$lambda[1],bcfit$lambda[2]
    plot(data$medv,pred_transformed,xlab="orig response",ylab="predictions")
    

    【讨论】:

    • 我真诚地感谢它,@StupidWolf。确实,我认为您应该将用户名更改为 SmartWolf! :-)
    • 我刚收到几个问题。 (1) 为什么使用 pca 进行 Box-Cox 变换?如果两台 PC 的累积比例(方差)只有 50% 左右,还值得使用 pca 吗? (2) 我猜第一个问题导致我的预测系数低。在您的情况下,预测系数从 0 扩展到 0.8。然而,在我的例子中,预测系数几乎在 0 到 0.1 之间。您对这个问题有什么想法吗?
    • 要做boxcox,需要找到合适的lambda1和lambda2。你也可以对所有变量进行回归,但如果你的数据很大,这可能会很费力,我用 PCA 减少了它。如果你有一个大数据集,50% 是可以的。我的意思是找到一个好的 lambda 参数就足够了
    • 你的意思是我猜的预测值。你的数据集是什么样的?到底用了多少个变量?您可以使用fit = cv.glmnet(...) ; plot(fit) 进行一些检查,看看偏差低点如何......
    • 非常感谢您重温这个问题帖子,@StupidWlof!数据集不太大(50 X 24 维矩阵)。我有 50 个受试者(人)和 23 个协变量(其中 19 个从负 inf. 到正 inf. 是连续的,其余 4 个是正整数值。)。而且,当然,有 1 个结果变量(范围从 0 到 55)。当我绘制 cv.glmnet 时,mse 非常高,如 6 或 7(尽管正如预期的那样......)。很遗憾,我无法通过评论上传图片。
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2020-05-20
    • 2019-07-30
    • 2015-03-30
    • 2021-07-29
    • 2014-01-27
    相关资源
    最近更新 更多