我想使用

 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])

最佳答案

我不确定如何/是否可以轻松将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])

关于r - 如何使用资料库(插入符号)变更指标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28232658/

10-12 21:32