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
,因为它是指加权的行号。
如果这些行确实会被过度/欠采样,那么我期望看到模型之间的(小)差异。
因此,我的问题是:
min_rows
模型在权重的均匀缩放下通常是不变的,即,如果我将权重列乘以标量DRF
并相应地调整a>0
,则模型是否保持不变相同? (如上面的R代码示例所示。)min_rows
模型的森林?谢谢您的帮助!
答案 0 :(得分:2)
从概念上讲,权重可以指示哪些行是正确的重要位置,也可以指示
要复制或压缩的行。但是,包含weights_column
不会更改实际的
您的数据集的大小;它只会影响DRF的数学计算。
注意:无论您要解决分类问题还是回归问题,H2O都会训练回归树。
漏洞详细信息
weights_column
不会影响采样率。权重乘以一个因子不会改变结果(即,所有1的权重列与所有2的权重列相同)
砝码在多个位置使用,以下是一些示例: