【问题标题】:How to get the value of the objective function from glmnet in R?如何从 R 中的 glmnet 获取目标函数的值?
【发布时间】:2015-12-24 09:18:02
【问题描述】:

我可以获得套索或岭回归拟合

cvfit <- cv.glmnet(X, y)

我知道如何让 lambda 发挥最大价值

lambda.min <- cvfit$lambda.min

以及如何获得最佳均方误差

mse <- cvfit$cvm[cvfit$lambda == lambda.min]

如何获取目标函数的值?

【问题讨论】:

  • MSE = 线性回归的目标函数。
  • 是的,适用于普通线性回归,但不适用于 lasso 或岭回归。例如,在套索中,目标函数是 MSE+lambda*|A|其中 A 是系数。
  • @rhombidodedecahedron 你对目标函数是正确的。套索确实最小化了目标函数“残差平方和 + lambda * | 系数 |”。
  • cvfit$lambda[cvfit$lambda == cvfit$lambda.min] 只是cvfit$lambda.min :-)

标签: r glmnet


【解决方案1】:

我不确定glmnet 是否可以访问目标函数的值,但我们自己计算很容易。这是 LASSO 的一个小例子。

library(glmnet)

x <- as.matrix(mtcars[c("hp", "cyl", "wt", "gear")])
y <- mtcars$mpg

cvfit = cv.glmnet(x, y, alpha = 1)  # alpha = 1 for LASSO

我们可以使用coef获取模型的系数,然后根据其定义计算目标函数值。

coefs <- coef(cvfit, s = "lambda.min")
objective <- sum((y - coefs[1] - (x %*% coefs[-1]))^2) + 
             cvfit$lambda.min * sum(abs(coefs[-1]))
objective

岭回归类似:使用 alpha = 0 代替并将 sum(abs(coefs[-1])) 替换为 sum(coefs[-1]^2)

【讨论】:

  • 谢谢,看起来不错。我想知道:我认为 glmnet 在回归期间标准化了所有变量。计算目标函数时是否需要再次标准化它们?
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 2017-04-16
  • 2019-09-11
  • 2012-03-09
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多