Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用预测概率的插入符号包中的自定义性能函数_R_R Caret - Fatal编程技术网

R 使用预测概率的插入符号包中的自定义性能函数

R 使用预测概率的插入符号包中的自定义性能函数,r,r-caret,R,R Caret,是关于在插入符号包中使用自定义性能度量功能。您希望找到最佳的预测模型,因此需要构建多个模型,并通过计算单个度量值(通过比较观测值和预测值得出)来比较它们。有用于计算此度量的默认函数,但您也可以定义自己的度量函数。此自定义函数必须将obs和预测值作为输入 在分类问题中(假设只有两类),预测值是0或1。然而,我需要评估的也是模型中计算的概率。有没有办法做到这一点 原因是,在某些应用程序中,您需要知道1预测的实际概率是99%还是51%——而不仅仅是预测是1还是0 有人能帮忙吗 编辑 好的,让我试着更

是关于在
插入符号
包中使用自定义性能度量功能。您希望找到最佳的预测模型,因此需要构建多个模型,并通过计算单个度量值(通过比较观测值和预测值得出)来比较它们。有用于计算此度量的默认函数,但您也可以定义自己的度量函数。此自定义函数必须将obs和预测值作为输入

在分类问题中(假设只有两类),预测值是
0
1
。然而,我需要评估的也是模型中计算的概率。有没有办法做到这一点

原因是,在某些应用程序中,您需要知道
1
预测的实际概率是99%还是51%——而不仅仅是预测是1还是0

有人能帮忙吗


编辑 好的,让我试着更好地解释一下。在5.5.5(备用性能指标)下的
caret
包文档中,有一个关于如何使用自定义性能功能的说明,如

fitControl <- trainControl(method = "repeatedcv",
                           number = 10,
                           repeats = 10,
                           ## Estimate class probabilities
                           classProbs = TRUE,
                           ## Evaluate performance using 
                           ## the following function
                           summaryFunction = twoClassSummary)

fitControl我不确定我是否正确理解了您的问题:

要从模型
mdl
接收预测概率,可以使用
predict(mdl,type=“prob”)
。 即

库(插入符号)
#>加载所需包:lattice
#>加载所需包:ggplot2
df 4 1.875722e-12 1
#>5.2.220446e-16 1
#>6.2.220446e-16 1
由(v0.3.0)于2020-07-02创建

也就是说,我们看到案例4预计是一个100%左右的刚毛(tbh,这个玩具模型太好了,不可能是真的)

现在我们可以创建一个自定义函数,将值折叠为单个度量


true遗憾的是,我刚刚找到了问题的答案。
插入符号
文档中有一句话

“…如果这些参数都不令人满意,用户还可以计算自定义性能指标。trainControl函数有一个名为summaryFunction的参数,指定用于计算性能的函数。该函数应具有以下参数:

数据是数据帧或矩阵的参考,其列称为obs和pred,用于观察和预测结果值(用于回归的数字数据或用于分类的字符值)。目前,类别概率未传递给函数。数据中的值是保留的预测值(及其相关参考值)用于单个调谐组合……”


为了便于文档编制:这是在2020-07-03上用2019-03-27的
caret
程序包文档编写的。

当您在
trainControl
中指定
classProbs=TRUE
时,caret确实支持将类概率传递给自定义摘要函数。在这种情况下,在创建cus时使用
数据
参数tom summary函数将有另外两列命名为类,其中包含每个类的概率。这些类的名称将位于
lev
参数中,该参数是长度为2的向量

请参见示例:

library(caret)
library(mlbench)
data(Sonar)
自定义摘要日志丢失:

LogLoss <- function (data, lev = NULL, model = NULL){ 
  obs <- data[, "obs"] #truth
  cls <- levels(obs) #find class names
  probs <- data[, cls[2]] #use second class name to extract probs for 2nd clas
  probs <- pmax(pmin(as.numeric(probs), 1 - 1e-15), 1e-15) #bound probability, this line and bellow is just logloss calculation, irrelevant for your question 
  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") #important since this is specified in call to train. Output can be a named vector of multiple values. 
  out
}

fitControl <- trainControl(method = "cv",
                           number = 5,
                           classProbs = TRUE,
                           summaryFunction = LogLoss)


fit <-  train(Class ~.,
             data = Sonar,
             method = "rpart", 
             metric = "LogLoss" ,
             tuneLength = 5,
             trControl = fitControl,
             maximize = FALSE) #important, depending on calculated performance measure

fit
#output
CART 

208 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 166, 166, 166, 167, 167 
Resampling results across tuning parameters:

  cp          LogLoss  
  0.00000000  1.1220902
  0.01030928  1.1220902
  0.05154639  1.1017268
  0.06701031  1.0694052
  0.48453608  0.6405134

LogLoss was used to select the optimal model using the smallest value.
The final value used for the model was cp = 0.4845361.
查看插入符号手册的这一部分:


获取更多信息。如果你打算使用插入符号,那就去读一本好书,即使你不是一本好书。

嘿!不幸的是,这不是我想要的。我将编辑这个问题。已经感谢你的努力。你一定要使用插入符号吗?
tidymodels
更新的
tidymodels试图实现同样的目标,但正在积极开发中(这个软件包是由《插入符号》的作者马克斯·库恩推出的。)哦!:)不,我不必使用插入符号。如果您有其他解决方案,请提供答案。(只是不是“这是如何编写您自己的交叉验证函数”——我可以自己做。)似乎?只要在你的R会话中尝试,所有的怀疑都会消失。
LogLoss <- function (data, lev = NULL, model = NULL){ 
 if (length(lev) > 2) {
        stop(paste("Your outcome has", length(lev), "levels. The LogLoss() function isn't appropriate."))
    }
  obs <- data[, "obs"] #truth
  probs <- data[, lev[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
}