2017-11-11 5 views
0

キャレット・パッケージを使用して、次のユーザー定義のサマリー機能を正常に動作させることができません。それはloglossを計算することになっていますが、私はそのloglossが見つからないことを続けています。以下は、再現性の例:ユーザー定義サマリー機能キャレット、ログロス

data <- data.frame('target' = sample(c('Y','N'),100,replace = T), 'X1' = runif(100), 'X2' = runif(100)) 

log.loss2 <- function(data, lev = NULL, model = NULL) { 
    logloss = -sum(data$obs*log(data$Y) + (1-data$obs)*log(1-data$Y))/length(data$obs) 
    names(logloss) <- c('LL') 
    logloss 
} 

fitControl <- trainControl(method="cv",number=1, classProbs = T, summaryFunction = log.loss2) 

my.grid <- expand.grid(.decay = c(0.05), .size = c(2)) 

fit.nnet2 <- train(target ~., data = data, 
        method = "nnet", maxit = 500, metric = 'LL', 
        tuneGrid = my.grid, verbose = T) 

答えて

1

エラーは、訓練するの呼び出しでtrControl = fitControlが含まれていなかった事実によるものでした。しかしdata$obsdata$predが要因であることに起因する別のエラーにあなたをもたらすこと - 1は、注意することが01

log.loss2 <- function(data, lev = NULL, model = NULL) { 
    data$pred <- as.numeric(data$pred)-1 
    data$obs <- as.numeric(data$obs)-1 
    logloss = -sum(data$obs*log(data$Y) + (1-data$obs)*log(1-data$Y))/length(data$obs) 
    names(logloss) <- c('LL') 
    logloss 
} 

fitControl <- trainControl(method="cv",number=1, classProbs = T, summaryFunction = log.loss2) 

fit.nnet2 <- train(target ~., data = data, 
        method = "nnet", maxit = 500, metric = "LL" , 
        tuneGrid = my.grid, verbose = T, trControl = fitControl) 
#output 
Neural Network 

100 samples 
    2 predictor 
    2 classes: 'N', 'Y' 

No pre-processing 
Resampling: Cross-Validated (1 fold) 
Summary of sample sizes: 0 
Resampling results: 

    LL  
    0.6931472 

Tuning parameter 'size' was held constant at a value of 2 
Tuning parameter 'decay' was held constant at a value of 0.05 

いくつかのことを希望与える1を差し引く、1または2を与える数値に変換する必要があります:

この損失関数は、確率がdata$Yと定義されているため、N/Yをクラスとして含むデータでのみ機能します。より良い方法は、クラスの名前を見つけて使用することです。さらにlog(0)ので、確率値を切り捨てるようにその良い練習は良いアイデアではありません。

LogLoss <- function (data, lev = NULL, model = NULL) 
    { 
    obs <- data[, "obs"] 
    cls <- levels(obs) #find class names 
    probs <- data[, cls[2]] #use second class name 
    probs <- pmax(pmin(as.numeric(probs), 1 - 1e-15), 1e-15) #bound probability 
    logPreds <- log(probs)   
    log1Preds <- log(1 - probs) 
    real <- (as.numeric(data$obs) - 1) 
    out <- c(mean(real * logPreds + (1 - real) * log1Preds)) * -1 
    names(out) <- c("LogLoss") 
    out 
    } 
+0

これは完璧です!本当にありがとう、私は両方のエラーに遭遇したので、あなたも後の問題に気づいたことを感謝します – dleal

+0

あなたは歓迎します。追加のメモを編集で確認します。 – missuse

関連する問題