使用 F1 指标在 Caret 中训练模型 [英] Training Model in Caret Using F1 Metric

查看:30
本文介绍了使用 F1 指标在 Caret 中训练模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将随机森林模型拟合到我的数据集,并且我想根据 F1 分数选择最佳模型.我在这里看到了一篇描述必要代码的帖子.我试图复制代码,但出现错误

I am trying to fit a random forest model to my dataset and I would like to select the best model based off of the F1 score. I saw a post here describing the code necessary. I attempted to copy the code but I am getting the error

{中的错误:任务 1 失败 -"找不到函数F1_Score"

"Error in { : task 1 failed - "could not find function "F1_Score"

当我运行 train 函数时.(仅供参考,我试图预测的变量(通过")是一个两类因素失败"和通过")

while I run the train function. (FYI the variable I am trying to predict ("pass") is a two class factor "Fail" and "Pass")

见下面的代码:

library(MLmetrics)
library(caret)
library(doSNOW)

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



train.control <- trainControl(method = "repeatedcv",
                              number = 10,
                              repeats = 3,
                              classProbs = TRUE,
                              summaryFunction = f1,
                              search = "grid")


tune.grid <- expand.grid(.mtry = seq(from = 1, to = 10, by = 1))


cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)
random.forest.orig <- train(pass ~ manufacturer+meter.type+premise+size+age+avg.winter+totalizer, 
                     data = meter.train,
                     method = "rf",
                     tuneGrid = tune.grid,
                     metric = "F1",
                     weights = model_weights,
                     trControl = train.control)
stopCluster(cl)

推荐答案

我不使用 MLmetrics 库重写了 f1 函数,它似乎可以工作.有关创建 f1 分数的工作代码,请参见下文:

I've rewritten the f1 function not using the MLmetrics library and it seems to work. See below for a working code to create a f1 score:

f1 <- function (data, lev = NULL, model = NULL) {
  precision <- posPredValue(data$pred, data$obs, positive = "pass")
  recall  <- sensitivity(data$pred, data$obs, postive = "pass")
  f1_val <- (2 * precision * recall) / (precision + recall)
  names(f1_val) <- c("F1")
  f1_val
} 

train.control <- trainControl(method = "repeatedcv",
                          number = 10,
                          repeats = 3,
                          classProbs = TRUE,
                          #sampling = "smote",
                          summaryFunction = f1,
                          search = "grid")


tune.grid <- expand.grid(.mtry = seq(from = 1, to = 10, by = 1))


cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)
random.forest.orig <- train(pass ~ manufacturer+meter.type+premise+size+age+avg.winter+totalizer, 
                 data = meter.train,
                 method = "rf",
                 tuneGrid = tune.grid,
                 metric = "F1",
                 trControl = train.control)
stopCluster(cl)

这篇关于使用 F1 指标在 Caret 中训练模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆