权重列在h2o DRF中的作用

时间:2018-09-06 15:21:09

标签: random-forest h2o

h2o documentation声明的weights_column选项

  

此选项指定确定权重时要使用的训练框中的列。权重是每行观察权重,不会增加数据帧的大小。这通常是重复行的次数,但也支持非整数值。在训练过程中,由于损失函数的前置因子较大,权重较高的行更为重要。

我对权重列对DRF(随机森林)的回归树的影响特别感兴趣。 我发现“这通常是重复行的次数”的描述令人困惑。尽管他们说帧的大小实际上并没有增加,但它暗示了权重更高/更低的行会被过度/欠采样(根据sample_rate选择每棵树训练数据时)。但是,查看github上的h2o源代码,似乎并非如此。 使用权重的代码的相关部分在DHistogram.java中并读取

double wy = weight * y;
double wyy = wy * y;  // This is the correct implementation.
int b = bin(col_data);
_vals[3*b + 0] += weight;
_vals[3*b + 1] += wy;
_vals[3*b + 2] += wyy;

这表示权重仅用于计算加权的行数(_vals[3*b + 0])和加权平方误差的总和(通过{ {1}}和_vals[3*b + 1],请参阅DTree.java)。

此外,我在_vals[3*b + 2]中做了一些权重不同的测试。我训练了不同的R模型,每个模型在所有观察结果中的权重均一,但是在各个模型中的权重大小均不同。我怀疑权重仅用于加权行数和加权平方误差,这似乎得到了证实。

DRF

从上面可以看到,尽管重量大小不同,但所有3种森林都是相同的。唯一要做的调整是library(h2o) h2o.init() #different weights for each model iris$weight0=0.5 iris$weight1=1 iris$weight2=2 irisH=as.h2o(iris) predNames=setdiff(colnames(irisH),c("Sepal.Length","weight2","weight1","weight0")) exludeLinesRegex="(.*DRF_model_R_.*)|(.*AUTOGENERATED.*)|(.*UUID.*)|(.*weight.*)" pojoList=list() #train 3 models, each with different weights magnitude for (i in 0:2) { weightColName=paste0("weight",i) tmpRf=h2o.randomForest(y="Sepal.Length", x=predNames, training_frame = irisH, seed = 1234, ntrees = 10, #min_rows has to be adjusted-it refers to weighted rows min_rows= 20*irisH[1,weightColName], max_depth = 3, mtries = 4, weights_column = weightColName) tmpPojo=capture.output(h2o.download_pojo(tmpRf)) pojoList[[length(pojoList)+1]]=tmpPojo[!grepl(exludeLinesRegex,tmpPojo)] } h2o.shutdown(FALSE) # all forests are the same length(unique(pojoList)) # 1 ,因为它是指加权的行号。 如果这些行确实会被过度/欠采样,那么我期望看到模型之间的(小)差异。

因此,我的问题是:

  1. 除了计算加权行数和平方误差总和以外,其他地方是否还使用了权重?
  2. 回归min_rows模型在权重的均匀缩放下通常是不变的,即,如果我将权重列乘以标量DRF并相应地调整a>0,则模型是否保持不变相同? (如上面的R代码示例所示。)
  3. 如果是,这是否也适用于具有分类树和min_rows模型的森林?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

从概念上讲,权重可以指示哪些行是正确的重要位置,也可以指示 要复制或压缩的行。但是,包含weights_column不会更改实际的 您的数据集的大小;它只会影响DRF的数学计算。

注意:无论您要解决分类问题还是回归问题,H2O都会训练回归树。

漏洞详细信息

  • weights_column不会影响采样率。
  • 权重乘以一个因子不会改变结果(即,所有1的权重列与所有2的权重列相同)

  • 砝码在多个位置使用,以下是一些示例:

    • 每棵树中的第一个节点
    • 损失函数,用于决定在每个内部节点上拆分哪个特征。
    • 终端节点。
    • 所有性能指标计算。