首页 > 解决方案 > 当按列传递损失时,H2O.GeneralizedLowRankModel 目标为 NA

问题描述

我正在使用h2o glrm功能。当我试图传递loss_by_col参数以便为我的 DataFrame 中的每一列指定不同的损失函数时(我有正常、泊松和二项式变量,所以我传递“二次”、“泊松”和“逻辑”损失),目标没有得到计算。testmodel@model$objective回报NaN。_ 但同时总结表明,几乎没有迭代,所有迭代的目标都是 NA。模型的质量很差,但原型是通过某种方式计算出来的。所以我很困惑。应该如何为我的数据集中的每个变量传递不同的损失?这是一个(我希望)可重现的例子:

df <- data.frame(p1 = rpois(100, 5), n1 = rnorm(100), b1 = rbinom(100, 1, 0.5))
df$b1 <- factor(df$b1)
h2df <- as.h2o(df)

testmodel <- h2o.glrm(h2df,
         k=3,
         loss_by_col=c("Poisson", "Quadratic", "Logistic"),
         transform="STANDARDIZE")
testmodel@model$objective
summary(testmodel)
plot(testmodel)

标签: rh2o

解决方案


请注意,这里有一张 jira

有趣的是,当您运行代码片段时不会出现错误。当我运行您的代码片段时,我收到以下错误:

Error: DistributedException from localhost/127.0.0.1:54321: 'Poisson loss L(u,a) requires variable a >= 0', caused by java.lang.AssertionError: Poisson loss L(u,a) requires variable a >= 0

我可以通过删除来解决这个错误transform="STANDARDIZE",因为标准化会导致负值。有关转换的更多信息,您可以查看此处的用户指南为方便起见,这里是如何使用标准化的定义标准化:标准化减去平均值,然后将每个变量除以其标准差。


推荐阅读