代码之家  ›  专栏  ›  技术社区  ›  Julien Massardier

从cva中提取最佳参数。glmnet对象

  •  0
  • Julien Massardier  · 技术社区  · 7 年前

    我相信有一种优雅的方法可以在运行cva后提取出最好的alpha和lambda。但不知为什么我找不到它。

    这是我正在使用的代码。

    非常感谢。

    library(data.table);library(glmnetUtils);library(useful)
    
    # make some dummy data
    
    data(iris)
    
    x <- useful::build.x(data = iris,formula = Sepal.Length ~ .)
    y <- iris$Sepal.Length
    
    # run cv for alpha in c(0,0.5,1)
    
    output.of.cva.glmnet <- cva.glmnet(x=x,y=y,alpha = c(0,0.5,1))
    
    # extract the best parameters
    
    number.of.alphas.tested <- length(output.of.cva.glmnet$alpha)
    
    cv.glmnet.dt <- data.table()
    
    for (i in 1:number.of.alphas.tested){
      glmnet.model <- output.of.cva.glmnet$modlist[[i]]
      min.mse <-  min(glmnet.model$cvm)
      min.lambda <- glmnet.model$lambda.min
      alpha.value <- output.of.cva.glmnet$alpha[i]
      new.cv.glmnet.dt <- data.table(alpha=alpha.value,min_mse=min.mse,min_lambda=min.lambda)
      cv.glmnet.dt <- rbind(cv.glmnet.dt,new.cv.glmnet.dt)
    }
    
    best.params <- cv.glmnet.dt[which.min(cv.glmnet.dt$min_mse)]
    

    enter image description here

    0 回复  |  直到 7 年前
        1
  •  4
  •   Jeff Bezos    6 年前

    基于我在GitHub上读到的一条帖子,作者希望人们使用它 plot(fit) 而不仅仅是输出最佳参数。然而,这并不总是可能的,尤其是当涉及交叉验证时。这些助手函数可以是一个很好的解决方法。

    # Train model.
    fit <- cva.glmnet(X, y)
    
    # Get alpha.
    get_alpha <- function(fit) {
      alpha <- fit$alpha
      error <- sapply(fit$modlist, function(mod) {min(mod$cvm)})
      alpha[which.min(error)]
    }
    
    # Get all parameters.
    get_model_params <- function(fit) {
      alpha <- fit$alpha
      lambdaMin <- sapply(fit$modlist, `[[`, "lambda.min")
      lambdaSE <- sapply(fit$modlist, `[[`, "lambda.1se")
      error <- sapply(fit$modlist, function(mod) {min(mod$cvm)})
      best <- which.min(error)
      data.frame(alpha = alpha[best], lambdaMin = lambdaMin[best],
                 lambdaSE = lambdaSE[best], eror = error[best])
    }
    
    
    推荐文章