2015-01-30 10 views
12

BenKitaplığı (özet) kullanarak metrikler nasıl değiştirilir?

caret library 

Verilen bazı örnek verileri kullanarak RMSLE için RMSE gelen metriği değiştirmek istiyorum:

İşte
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) 

Ben RMSLE geçmek ister ve grafiğin

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

cevap

11

RMSE'yi RMSLE'ye nasıl kolayca dönüştürdüğünüzden emin değilim, böylece kontrol işlevini değiştirmeyi deneyebilirsiniz.

bir işlevi postResample çağıran Bak rfFuncs$summary de

. Bu tadil işlev denilen bir işlevde kaydedildi Sonra

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

: bölüm

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

bakmak Yani onun yerine RMSLE hesaplamak için bu fonksiyonu düzeltebileceksiniz - Bu RMSE hesaplanır nerede mypostResample, daha sonra rfFuncs$summary'u güncellemeniz gerekir. Yani tamamen


:

İlk özet fonksiyonunu güncellemek - bu RMSLE

ile yeni işlevi çağırır
newSumm <- function (data, lev = NULL, model = NULL) 
      { 
      if (is.character(data$obs)) 
      data$obs <- factor(data$obs, levels = lev) 
      mypostResample(data[, "pred"], data[, "obs"]) 
      } 

Sonra

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 
       } 

RMSLE hesaplamak için yeni bir fonksiyon tanımladığınızda Güncelleştirme 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]) 
+0

bu çok açık bir örnektir ... thx –

+0

Size bir soru daha sorabilir miyim: MypostResample fonksiyonunuzda sıfırın varsayımını nasıl eklersiniz? 2'^- –

+0

Sana 'do ((1 + beklenen) log log (1 + obs)) sanırım. Bu [Metrik] (http://cran.r-project.org/web/packages/Metrics/index.html) paket fonksiyonu 'sle' kontrol etmez şeydir. . Bu, belki de bu http://stats.stackexchange.com/ üzerinde istatistikçiler için daha uygun bir soru olduğunu söyledi – user20650