【问题标题】:Error with class probabilities using R caret使用 R 插入符号的类概率错误
【发布时间】:2017-03-27 06:42:10
【问题描述】:

我正在使用 R 插入符号进行分类。我在训练时收到以下错误消息:

train.default(train[, predictorsNames], train[, resultsName], 中的错误: 使用 ROC 曲线下的面积对模型进行评分需要类概率。在 trainControl() 函数中设置classProbs = TRUE

我对这个问题进行了一些搜索。以下两个链接正在讨论类似的问题。 Error when I try to predict class probabilities in R - caretR caret train Error in evalSummaryFunction: cannnot compute class probabilities for regression 根据给出的答案,问题可能是由于未将结果名称定义为因子或级别名称无效。但是我已经将结果名转换为一个因子,尝试了不同的级别名称并设置了classProbs=TRUE,但它仍然不起作用。

library(caret)
library(gbm)

我使用的数据集是dat,有6个变量。我需要对变量"FlagD60"进行分类。

> dput(droplevels(head(dat,5)))
structure(list(FICO = c(689L, 689L, 689L, 783L, 783L), Line = c(4000.001686, 
3700.002962, 3600.001866, 14500.00101, 5262.002105), Balance = c(1686L, 
2962L, 1866L, 1014L, 2105L), Payment = c(53L, 79L, 33L, 21L, 
15L), Age = c(6L, 81L, 82L, 235L, 57L), FlagD60 = c(0L, 0L, 0L, 
0L, 0L)), .Names = c("FICO", "Line", "Balance", "Payment", "Age", 
"FlagD60"), row.names = c(NA, 5L), class = "data.frame")

我生成了一个具有“是”和“否”级别的新因子,用于分类并拆分数据。由于不知道这个准备阶段是否出现错误,所以我也留给大家参考。

### prepare for classification ###
outcomeName <- 'FlagD60'
predictorsNames <- names(dat)[names(dat) != outcomeName]
dat$FlagD60b=ifelse(dat$FlagD60==1,'yes','no')
dat$FlagD60b=as.factor(dat$FlagD60b)
outcomeName='FlagD60b'

trainIndex=createDataPartition(dat[,outcomeName],p=0.75,list = 
                               FALSE,times=1)
train=dat[ trainIndex,]
test =dat[-trainIndex,]

下面是levels(train$FlagD60b)的结果。

[1] "no"  "yes"

然后我像这样构建模型。

#### repeated 10-fold CV, grid, gbm ####
ctrl=trainControl(method = "repeatedcv",number = 10,repeats = 10, 
                  summaryFunction = twoClassSummary, 
                  classProbs = TRUE)

set.seed(520)
gbmfit=train(train[,predictorsNames], train[,outcomeName],
             method="gbm",
             trcontrol=ctrl,
             verbose=FALSE, 
             metric="ROC")

这给出了我上面所说的错误。您的任何想法都将不胜感激。

sessionInfo() 的输出也包含在内,供您参考。

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936    

attached base packages:
[1] parallel  splines   stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.8.4      gbm_2.1.3       survival_2.39-4 caret_6.0-73    ggplot2_2.2.1   lattice_0.20-34

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.9        magrittr_1.5       MASS_7.3-45        munsell_0.4.3      colorspace_1.3-2  
 [6] foreach_1.4.3      minqa_1.2.4        stringr_1.2.0      car_2.1-4          tools_3.3.1       
[11] nnet_7.3-12        pbkrtest_0.4-7     grid_3.3.1         gtable_0.2.0       nlme_3.1-128      
[16] mgcv_1.8-12        quantreg_5.29      MatrixModels_0.4-1 iterators_1.0.8    lme4_1.1-12       
[21] lazyeval_0.2.0     assertthat_0.1     tibble_1.2         Matrix_1.2-6       nloptr_1.0.4      
[26] reshape2_1.4.2     ModelMetrics_1.1.0 codetools_0.2-14   stringi_1.1.2      scales_0.4.1      
[31] stats4_3.3.1       SparseM_1.76   

【问题讨论】:

  • 您可以制作一小部分数据并分享吗?或者,理想情况下,模拟一些产生相同结果的数据。请参阅here,了解如何以最不痛苦的方式分享您的数据。
  • @RomanLuštrik 我添加了训练数据的子集和 sessionInfo() 的输出。希望这会有所帮助。
  • 好的,很好。现在淡化代码,只显示重现错误所需的必要部分。
  • @RomanLuštrik 我尽量删了,只留下数据准备、traincontrol 和 train 可能出错的部分。
  • 请在新的 R 会话中复制/粘贴代码,并确认您遇到了同样的错误。例如,我们无权访问dat 来创建trainIndex

标签: r prediction r-caret


【解决方案1】:

我也遇到了同样的问题。 我认为问题在于 train 函数中的参数名称应该是 trControl 而不是 trcontrol。大写 C!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2013-08-26
    • 2014-07-27
    • 1970-01-01
    • 2016-03-24
    • 2020-01-25
    • 2017-08-13
    相关资源
    最近更新 更多