【问题标题】:Caret package Custom metric插入符号包自定义指标
【发布时间】:2016-10-06 14:20:39
【问题描述】:

我在我的一个项目中使用插入符号函数“train()”,我想添加 “自定义指标”F1 分数。我看了这个网址caret package 但我不明白如何使用可用参数来建立这个分数。

有一个自定义指标示例如下:

## Example with a custom metric
madSummary <- function (data,
lev = NULL,
model = NULL) {
out <- mad(data$obs - data$pred,
na.rm = TRUE)
names(out) <- "MAD"
out
}
robustControl <- trainControl(summaryFunction = madSummary)
marsGrid <- expand.grid(degree = 1, nprune = (1:10) * 2)
earthFit <- train(medv ~ .,
data = BostonHousing,
method = "earth",
tuneGrid = marsGrid,
metric = "MAD",
maximize = FALSE,
trControl = robustControl)

更新:

我尝试了您的代码,但问题是它不适用于多个类,例如下面的代码(显示 F1 分数,但很奇怪)我不确定,但我认为函数 F1_score 仅适用关于二进制类

library(caret)
library(MLmetrics)

set.seed(346)
dat <- iris

## See http://topepo.github.io/caret/training.html#metrics
f1 <- function(data, lev = NULL, model = NULL) {

print(data)
  f1_val <- F1_Score(y_pred = data$pred, y_true = data$obs)
  c(F1 = f1_val)
}

# Split the Data into .75 input
in_train <- createDataPartition(dat$Species, p = .70, list = FALSE)

trainClass <- dat[in_train,]
testClass <- dat[-in_train,]



set.seed(35)
mod <- train(Species ~ ., data = trainClass ,
             method = "rpart",
             metric = "F1",
             trControl = trainControl(summaryFunction = f1, 
                                  classProbs = TRUE))

print(mod)

我还编写了一个手动 F1 分数,其中一个输入是混淆矩阵:(我不确定我们是否可以在“summaryFunction”中有一个混淆矩阵

F1_score <- function(mat, algoName){

##
## Compute F1-score
##


# Remark: left column = prediction // top = real values
recall <- matrix(1:nrow(mat), ncol = nrow(mat))
precision <- matrix(1:nrow(mat), ncol = nrow(mat))
F1_score <- matrix(1:nrow(mat), ncol = nrow(mat))


for(i in 1:nrow(mat)){
  recall[i] <- mat[i,i]/rowSums(mat)[i]
  precision[i] <- mat[i,i]/colSums(mat)[i]
}

for(i in 1:ncol(recall)){
   F1_score[i] <- 2 * ( precision[i] * recall[i] ) / ( precision[i] + recall[i])
 }

 # We display the matrix labels
 colnames(F1_score) <- colnames(mat)
 rownames(F1_score) <- algoName

 # Display the F1_score for each class
 F1_score

 # Display the average F1_score
 mean(F1_score[1,])
}

【问题讨论】:

  • 不清楚您在流程的哪个部分遇到了问题。是关于编写自定义 summaryFunction 还是在 train 输出中使用其结果。你能详细说明一下吗?
  • 它在火车输出中使用它的结果。启动 train() 后,我想显示 F1 分数(只有准确率和 cohen 的 kappa 直接编码)
  • 因此,如果您完成了自定义函数的编码,那么使用您的函数编辑您的问题来发布您的可重现示例会有所帮助。

标签: r r-caret


【解决方案1】:

对于二分类的情况,可以尝试如下:

mod <- train(Class ~ ., 
             data = dat,
             method = "rpart",
             tuneLength = 5,
             metric = "F",
             trControl = trainControl(summaryFunction = prSummary, 
                                      classProbs = TRUE))

或定义一个自定义汇总函数,它结合了 twoClassSummary 和 prSummary 当前收藏夹,它提供了以下可能的评估指标 - AUROC、Spec、Sens、AUPRC、Precision、Recall、F - 其中任何一个都可以用作metric争论。这还包括我在对已接受答案的评论中提到的特殊情况(F 是 NA)。

comboSummary <- function(data, lev = NULL, model = NULL) {
  out <- c(twoClassSummary(data, lev, model), prSummary(data, lev, model))

  # special case missing value for F
  out$F <- ifelse(is.na(out$F), 0, out$F)  
  names(out) <- gsub("AUC", "AUPRC", names(out))
  names(out) <- gsub("ROC", "AUROC", names(out))
  return(out)
}

mod <- train(Class ~ ., 
             data = dat,
             method = "rpart",
             tuneLength = 5,
             metric = "F",
             trControl = trainControl(summaryFunction = comboSummary, 
                                      classProbs = TRUE))


【讨论】:

    【解决方案2】:

    您应该查看The caret Package - Alternate Performance Metrics 了解详情。一个工作示例:

    library(caret)
    library(MLmetrics)
    
    set.seed(346)
    dat <- twoClassSim(200)
    
    ## See https://topepo.github.io/caret/model-training-and-tuning.html#metrics
    f1 <- function(data, lev = NULL, model = NULL) {
      f1_val <- F1_Score(y_pred = data$pred, y_true = data$obs, positive = lev[1])
      c(F1 = f1_val)
    }
    
    set.seed(35)
    mod <- train(Class ~ ., data = dat,
                 method = "rpart",
                 tuneLength = 5,
                 metric = "F1",
                 trControl = trainControl(summaryFunction = f1, 
                                          classProbs = TRUE))
    

    【讨论】:

    • 这很好,因为我认为应该明确说明prSummary 仅适用于二分类问题。
    • 正类总是lev[1]吗?找不到here
    • 使用自定义函数可能更可取,因为 F1 = NA 如果 Precision = NA... 和 Precision = NA 如果模型从不预测任何样本的“正”类(例如,0/0 =不)。在这种情况下,您可以将您的 F1 函数特例化为报告 0 以避免train() 中的错误。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多