H2O randomForest 产生惊人的大 POJO
H2O randomForest produces surprisingly large POJOs
我正在使用基于树的模型,并且注意到 GBM
和 randomForest
在训练数据集的大小如何影响生成的 POJO 的大小方面存在很大差异。
我不希望训练数据集的大小对模型对象的大小有太大影响,*这几乎适用于 GBM
。
然而,对于 randomForest
,训练集行数与导出的 POJO 大小之间似乎存在线性关系。这个结果:
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
是从我的基准测试脚本中获得的:
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
尝试使用较小的深度。 DRF 中的默认深度比 GBM 大得多,大部分尺寸增长可能是由于此。
您也可以使用较少数量的树。
切换到 MOJO 可能还会减少大约 10 倍的大小。
我正在使用基于树的模型,并且注意到 GBM
和 randomForest
在训练数据集的大小如何影响生成的 POJO 的大小方面存在很大差异。
我不希望训练数据集的大小对模型对象的大小有太大影响,*这几乎适用于 GBM
。
然而,对于 randomForest
,训练集行数与导出的 POJO 大小之间似乎存在线性关系。这个结果:
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
是从我的基准测试脚本中获得的:
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
尝试使用较小的深度。 DRF 中的默认深度比 GBM 大得多,大部分尺寸增长可能是由于此。
您也可以使用较少数量的树。
切换到 MOJO 可能还会减少大约 10 倍的大小。