【发布时间】: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 直接编码)
-
因此,如果您完成了自定义函数的编码,那么使用您的函数编辑您的问题来发布您的可重现示例会有所帮助。