Ответ 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])