【问题标题】:Possible bug with bagging wrapper in mlrmlr 中的 bagging 包装器可能存在错误
【发布时间】:2016-09-23 21:57:40
【问题描述】:

bagging wrapper 似乎给出了奇怪的结果。如果我将其应用于简单的逻辑回归,那么 logloss 会放大 10 倍:

library(mlbench)
library(mlr)

data(PimaIndiansDiabetes)

trainTask1 <- makeClassifTask(data = PimaIndiansDiabetes,target = "diabetes",positive = "pos")

bagged.lrn = makeBaggingWrapper(makeLearner("classif.logreg"), bw.iters = 10, bw.replace = TRUE, bw.size = 0.8, bw.feats = 1)
bagged.lrn = setPredictType(bagged.lrn,"prob")
non.bagged.lrn = setPredictType(makeLearner("classif.logreg"),"prob")

rdesc = makeResampleDesc("CV", iters = 5L)

resample(learner = non.bagged.lrn, task = trainTask1, resampling = rdesc, show.info = FALSE,measures = logloss)
resample(learner = bagged.lrn, task = trainTask1, resampling = rdesc, show.info = FALSE,measures = logloss)

给予

Resample Result
Task: PimaIndiansDiabetes
Learner: classif.logreg
logloss.aggr: 0.49
logloss.mean: 0.49
logloss.sd: 0.02
Runtime: 0.0699999

对于第一个学习者和

Resample Result
Task: PimaIndiansDiabetes
Learner: classif.logreg.bagged
logloss.aggr: 5.41
logloss.mean: 5.41
logloss.sd: 0.80

运行时间:0.645

对于袋装的。因此,袋装的性能要差得多。 是有错误还是我做错了什么?

这是我的sessionInfo()

R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

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

other attached packages:
[1] mlr_2.9          stringi_1.1.1    ParamHelpers_1.8 ggplot2_2.1.0    BBmisc_1.10      mlbench_2.1-1   

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.6      magrittr_1.5     splines_3.3.1    munsell_0.4.3    lattice_0.20-33  xtable_1.8-2     colorspace_1.2-6
 [8] R6_2.1.2         plyr_1.8.4       dplyr_0.5.0      tools_3.3.1      parallel_3.3.1   grid_3.3.1       checkmate_1.8.1 
[15] data.table_1.9.6 gtable_0.2.0     DBI_0.4-1        htmltools_0.3.5  ggvis_0.4.3      survival_2.39-4  assertthat_0.1  
[22] digest_0.6.9     tibble_1.1       Matrix_1.2-6     shiny_0.13.2     mime_0.5         parallelMap_1.3  scales_0.4.0    
[29] backports_1.0.3  httpuv_1.3.3     chron_2.3-47    

【问题讨论】:

  • 您是否使用过任何特定的种子?这没什么大不了的,但是如果不设置种子,你得到的结果与我们运行它时得到的结果会有一些随机变化。
  • 对,我应该用种子。感谢您的评论。错误仍然是没有装袋的 10 倍,因此我认为存在错误。只是想先在这里问。
  • 没问题。这不是错误,请参阅下面的答案。干杯。

标签: r mlr


【解决方案1】:

这个结果不一定有什么问题,尽管可以更好地指定 bagging 模型。

Bagging 不一定总能为您提供更好的性能统计数据,而是帮助您避免过度拟合并提高准确性。

因此,您的非 bagging 模型具有更好的性能统计数据的原因可能仅仅是它过度拟合或以其他方式产生了具有误导性性能统计数据的更偏颇的结果。

但是,这里有一个大大改进的 bagging 模型规范,它使平均 logloss 降低了 70%:

pacman::p_load(mlbench,mlr)

data(PimaIndiansDiabetes)
set.seed(1)

trainTask1 <- makeClassifTask(data = PimaIndiansDiabetes,target = "diabetes",positive = "pos")

bagged.lrn     = makeBaggingWrapper(makeLearner("classif.logreg"), 
                                    bw.iters = 100, 
                                    bw.replace = TRUE, 
                                    bw.size = .6, 
                                    bw.feats = .5)
bagged.lrn     = setPredictType(bagged.lrn,"prob")
non.bagged.lrn = setPredictType(makeLearner("classif.logreg"),"prob")

rdesc = makeResampleDesc("CV", iters = 10L)

resample(learner    = non.bagged.lrn, 
         task       = trainTask1, 
         resampling = rdesc, 
         show.info  = T,
         measures   = logloss)


resample(learner    = bagged.lrn, 
         task       = trainTask1, 
         resampling = rdesc, 
         show.info  = T, 
         measures   = logloss)

关键结果在哪里

Resample Result
Task: PimaIndiansDiabetes
Learner: classif.logreg.bagged
logloss.aggr: 1.65
logloss.mean: 1.65
logloss.sd: 0.90
Runtime: 14.0544

【讨论】:

  • 感谢您的回答。我只是想知道... bw.iteres = 100 我想说的很多(对于具有大型数据集的实际应用程序)。也许示例集太小了。我应用它的数据集要大得多,而且我认为进行超过 10 次迭代的 bagging 几乎是不可行的 ..
  • 但是是的。也许我的应用程序很糟糕,因为我宁愿将 bagging 与小偏差但高方差结合使用。在逻辑回归的情况下,我可能有更大的偏差和更小的方差......因此 bagging 可能会损害偏差。 ...谢谢
  • @Richard 通过 10 次迭代,您仍然可以将其降低至少 50%,但我通常在大数据中使用这么多。我只是通过并行化来抵消数据的大小。因此,如果您有 20 列和 200,000 行,例如,您可能希望在具有 50 个左右内核的服务器上运行它(并为您的操作系统使用并行化包或利用内置的多核选项(如果可用)——idk关于这个包,但caret 有)。您还可以利用其他大数据策略,例如分块、采样、特征工程等。
  • 是的,mlr 具有并行化功能——请参阅the tutorial。对于 bw.iters 之类的东西,您可以使用 mlr 的内置参数调整(请参阅 the tutorial 自动确定数据的最佳值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2013-10-11
  • 2019-12-22
相关资源
最近更新 更多