【问题标题】:How to change metrics using the library(caret)?如何使用库(插入符号)更改指标?
【发布时间】:2015-03-29 17:42:44
【问题描述】:

我想使用

将指标从 RMSE 更改为 RMSLE
 caret library

给定一些示例数据:

  ivar1<-rnorm(500, mean = 3, sd = 1)
  ivar2<-rnorm(500, mean = 4, sd = 1)
  ivar3<-rnorm(500, mean = 5, sd = 1)
  ivar4<-rnorm(500, mean = 4, sd = 1)
  dvar<-rpois(500, exp(3+ 0.1*ivar1 - 0.25*ivar2))

  data<-data.frame(dvar,ivar4,ivar3,ivar2,ivar1)



  ctrl <- rfeControl(functions=rfFuncs,
                  method="cv",
                  repeats = 5,
                  verbose = FALSE,
                  number=5)

model <- rfe(data[,2:4], data[,1], sizes=c(1:4), rfeControl=ctrl)

这里我想改成 RMSLE 并保持图表的想法

plot <-ggplot(model,type=c("g", "o"), metric="RMSE")+ scale_x_continuous(breaks = 2:4, labels = names(data)[2:4])

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    我不确定如何/是否可以轻松地将 RMSE 转换为 RMSLE,因此您可以尝试更改控制功能。

    看rfFuncs$summary,它调用了一个函数postResample。这是计算 RMSE 的地方 - 查看该部分

    mse <- mean((pred - obs)^2)
    n <- length(obs)
    out <- c(sqrt(mse), resamplCor^2)
    

    所以你可以修改这个函数来计算 RMSLE:

    msle <- mean((log(pred) - log(obs))^2)
    out <- sqrt(msle)
    }
    names(out) <- "RMSLE"
    

    如果这个修改后的函数已经保存在一个名为mypostResample的函数中,那么你需要更新rfFuncs$summary。


    完全是这样:

    首先更新汇总函数 - 这将使用 RMSLE 调用新函数

    newSumm <- function (data, lev = NULL, model = NULL) 
              {
              if (is.character(data$obs)) 
              data$obs <- factor(data$obs, levels = lev)
              mypostResample(data[, "pred"], data[, "obs"])
              }
    

    然后定义新的函数来计算RMSLE

    mypostResample <- function (pred, obs) 
                   {
                   isNA <- is.na(pred)
                   pred <- pred[!isNA]
                   obs <- obs[!isNA]
    
                   msle <- mean((log(pred) - log(obs))^2)
                   out <- sqrt(msle)
                   names(out) <- "RMSLE"
    
                   if (any(is.nan(out))) 
                      out[is.nan(out)] <- NA
                   out
                   }
    

    更新 rfFuncs

    # keep old settings for future use
    oldSumm <- rfFuncs$summary 
    
    # update with new function
    rfFuncs$summary <- newSumm
    
    ctrl <- rfeControl(functions=rfFuncs,
                       method="cv",
                       repeats = 5,
                       verbose = FALSE,
                       number=5)
    set.seed(1)
    model <- rfe(data[,2:4], data[,1], sizes=c(1:4), rfeControl=ctrl, metric="RMSLE")
    
    # plot
    ggplot(model,type=c("g", "o"), metric="RMSLE")+ scale_x_continuous(breaks = 2:4, labels = names(data)[2:4])
    

    【讨论】:

    • 我可以再问你一个问题:你将如何在 mypostResample 函数中加入零的存在?
    • 我猜你可以做 (log(1 + obs) - log(1 + pred))^2 。这就是Metrics 包所做的检查功能sle。 .也就是说,也许这是一个更适合stats.stackexchange.com 上的统计学家的问题
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2012-07-21
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多