首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >H2O randomForest生产出奇大的POJO

H2O randomForest生产出奇大的POJO
EN

Stack Overflow用户
提问于 2018-12-07 17:03:18
回答 1查看 56关注 0票数 0

我正在使用基于树的模型,并且注意到GBMrandomForest在训练数据集的大小如何影响生成的POJO的大小方面有很大的不同。

我不认为训练数据集的大小会对模型对象的大小产生很大的影响,*对于GBM,这几乎是正确的。

但是,对于randomForest,训练集行数与导出POJO的大小之间似乎存在线性关系。这一结果:

代码语言:javascript
复制
Size of GBM with m =  1000 and p = 10: 0.15 MB (3281 lines)
Size of GBM with m =  1000 and p = 20: 0.16 MB (3501 lines)
Size of GBM with m = 10000 and p = 10: 0.18 MB (3833 lines)
Size of GBM with m = 10000 and p = 20: 0.19 MB (3899 lines)

Size of RF  with m =  1000 and p = 10:  4.38 MB ( 63908 lines)
Size of RF  with m =  1000 and p = 20:  4.40 MB ( 63606 lines)
Size of RF  with m = 10000 and p = 10: 45.84 MB (637168 lines) <- note 10x increase
Size of RF  with m = 10000 and p = 20: 46.08 MB (635059 lines)    on 10x training rows

从我的基准脚本中获得:

代码语言:javascript
复制
library(data.table)
library(h2o)

pojo_path <- getwd() # your folder here

options("h2o.use.data.table"=TRUE)
h2o.init(max_mem_size = '8G')
h2o.no_progress()

m_range <- c(1e3,1e4)  # of rows
p_range <- c(10,20)    # of columns

for(p in p_range){
  for(m in m_range){
    # bunch of random data
    set.seed(1)
    mtrx <- matrix(runif(n=m*p), nrow=m, ncol=p)

    # some really random outcome
    set.seed(2)
    y = rowSums(t( t(mtrx)*runif(n=p) )) + rnorm(n=m,sd=0.1)

    dt   <- data.table( mtrx) 
    dt[, `:=`(y = y, id = .I)]
    setkey(dt,id)

    gbm_nm <- paste0('gbm_m_',m,'_p_',p)
    rf_nm <- paste0('rf_m_',m,'_p_',p)
    dt_h2o <- as.h2o(dt)


    gbm <- h2o.gbm(
             x = paste0('V',1:p),
             y = 'y',
             training_frame = dt_h2o,
             nfolds=10,
             model_id = gbm_nm
           )
    rf <- h2o.randomForest(
             x = paste0('V',1:p),
             y = 'y',
             training_frame = dt_h2o,
             nfolds=10,
             model_id = rf_nm
           )

    pojo_gbm_path <- file.path(pojo_path,h2o.download_pojo(gbm, path=pojo_path ) )
    writeLines(paste0('Size of GBM with m = ', m,
                      ' and p = ',p,': ',
                      round(file.info(pojo_gbm_path
                                      )$size/(2^20),2),
                      ' MB (',length(readLines(pojo_gbm_path)),
                      ' lines)'
                      )
    )
    pojo_rf_path <- file.path(pojo_path,h2o.download_pojo(rf, path=pojo_path))
    writeLines(paste0('Size of RF  with m = ', m,
                      ' and p = ',p,': ',
                      round(file.info(pojo_rf_path
                                      )$size/(2^20),2),
                      ' MB (',length(readLines(pojo_rf_path)),
                      ' lines)'
    )
    )
  }
}

在我正在使用的数据集上,randomForest对象的大小变得非常大。

为什么会发生这种情况?这种行为是randomForest固有的(所以决定是降低样本还是使用其他东西),还是有什么我可以做的?

*我知道,如果min_leaf_size这样的参数是绑定的,那么更多的培训数据将允许更多的分裂。但在某一时间点之后,我们认为这些都足够了,而且物体的大小也会停止增长。

**我在H2O v 3.20.0.8,R版本3.5.1上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-07 17:38:46

试着用更小的深度。DRF的默认深度要比GBM大得多,而且大部分尺寸的增长可能是由于这个原因。

你也可以使用较小数量的树木。

切换到MOJO可能也会减少大约10倍的大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53673953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档