R中ranger与H2O.ai随机森林同参数下性能差异原因及对齐方法问询
在完全相同的数据集上,R::ranger或h2o.ai::randomForest中的哪些设置会导致二者表现存在显著差异?
我正在使用高度不平衡数据集开展分类任务,采用的评价指标是caret输出的Kappa值。数据集共约7万行、400列,其中99.3%的样本属于类别"0",仅0.7%属于类别"1"。
ranger调用参数片段如下:
est_ranger <- ranger(y~., data=df, num.trees = 100, max.depth = 20, min.node.size = 5, mtry = sqrt(ncol(df)) %>% round(), splitrule = "gini", sample.fraction = 0.632)
h2o.ai随机森林调用参数片段如下:
est_h2o <- h2o.randomForest(x=2:ncol(df1), y=1, training_frame = "df1.hex", ntrees = 100, max_depth = 20, min_rows = 5, sample_rate = 0.632, mtries = sqrt(ncol(df1)) %>% round())
备注:我尝试将二者的max depth分别设置为12、20、null,均未能缩小性能差异。
重复10次训练-预测-评估流程后,ranger的Kappa值统计结果如下:
> summary(perf_ranger) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.2134 0.2261 0.2458 0.2410 0.2564 0.2633
h2o.ai随机森林的Kappa值统计结果如下:
> summary(perf_h2o) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5408 0.5575 0.6264 0.6182 0.6727 0.6922
经测算h2o.randomForest的平均Kappa值约为ranger的2.56倍。
H2O实现了哪些ranger未包含的机制导致该性能差异?
初步猜想:
- H2O.ai可能内置了动态学习率相关逻辑
- 差异可能和H2O.ai中"histogram"与"bins"的相关实现有关
- 尝试在ecdf域使用paa人工压缩直方图后,ranger的Kappa值大幅下降,结论是降低列特征多样性会影响模型性能。
- 尝试强制平衡类别(部分统计人员不推荐该操作),同时将min rows设置为1,二者的Kappa值均有大幅提升,结果如下:
ranger的结果:
summary(store1) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5113 0.5192 0.5252 0.5262 0.5299 0.5494
h2o.ai的结果:
summary(store2) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.9377 0.9512 0.9571 0.9550 0.9595 0.9662
不平衡数据集下二者平均Kappa差值为0.377,平衡类别后差值为0.428,虽仍存在差距,但基于重采样的数据训练能提升测试集表现。
ranger有两类类别平衡方式:一类是重采样,一类是"weight"权重模式,推测后者和最优分裂点的计算逻辑相关。
ranger使用权重驱动的类别平衡的结果如下:
summary(store1) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.3491 0.3896 0.4051 0.4079 0.4381 0.4520
ranger使用重采样驱动的类别平衡的结果如下:
summary(store1) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5170 0.5239 0.5310 0.5332 0.5425 0.5559
同时使用两类平衡方式的结果如下:
summary(store1) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.5113 0.5212 0.5275 0.5295 0.5393 0.5544
前两类结果无重叠,重采样方式表现明显更优。同时使用两类方式时,相比仅使用重采样仅有极微(可忽略)的性能下降,因此在不开展网格搜索和参数微调的情况下,更推荐使用重采样类平衡方式。
尝试将分裂规则从"gini"替换为与H2O不一致、近似列子采样的"extratrees"规则后,ranger的结果大幅提升:
summary(store1) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.6267 0.6431 0.6500 0.6473 0.6535 0.6578
这是目前得到的最优结果,但相关结论仍属推测。
内容的提问来源于stack exchange,提问作者EngrStudent

