Machine learning 使用不同输入模型的H2O叠加系综

Machine learning 使用不同输入模型的H2O叠加系综,machine-learning,h2o,medical,Machine Learning,H2o,Medical,使用h2o流,是否有一种方法可以基于单个模型创建堆叠的集合模型,这些模型可能不采用相同的输入,但在相同的响应标签上进行预测 例如,我正在尝试预测错误编码的医疗保健索赔,即费用,并希望为以下表格的堆叠集合训练模型: model1(diagnosis1, diagnosis2, ..., diagnosis5) -> denied or paid (by insurer) model2(procedure, procedure_detail1, ..., procedure_detail5)

使用h2o流,是否有一种方法可以基于单个模型创建堆叠的集合模型,这些模型可能不采用相同的输入,但在相同的响应标签上进行预测

例如,我正在尝试预测错误编码的医疗保健索赔,即费用,并希望为以下表格的堆叠集合训练模型:

model1(diagnosis1, diagnosis2, ..., diagnosis5) -> denied or paid (by insurer)
model2(procedure, procedure_detail1, ..., procedure_detail5) -> denied or paid 
model3(service_date, insurance_amount, insurer_id) -> (same)
model4(pat_age, pat_sex, ...) -> (same)
...

有没有办法在h2o flow中做到这一点?我不知道如何使用堆叠集合的h2o flow gui中显示的内容来做到这一点?这是一种明智的方法,还是在某种程度上对机器学习比较陌生?谢谢。

堆叠的集成无法做到这一点,因为它需要为每个模型提供相同的输入。但是你可以建立一个更宽松的组合。。。这几乎可以,但不完全可以,在流程中完成

基本上,您将创建四个模型。然后你会对每一个进行预测。每次预测都会给你一个新的h2o框架。然后,您需要将这四个预测绑定在一起,以获得一个包含4个二进制列的新h2o帧*。然后输入第五个模型,得到一个综合结果

*当前位置这是我认为你在Flow中做不到的一点。您需要导出数据,将其合并到另一个应用程序中,然后将其带回


更好的方法是使用所有输入建立一个单一的模型。这将更简单,并为您提供更准确的结果,例如,可以发现保险金额和个人年龄之间的相互作用。但是,潜在的主要缺点是,您无法再将模型解释为四组是/否。也就是说,它变得更像黑匣子。

Darren的回答是,在H2O中不能这样做,直到最近才是正确的-H2O只是基本模型必须在同一组输入上进行训练,因为堆叠集成算法实际上并不需要它。但是,这仅在脱离master时可用,因此即使您使用的是最新的稳定版本,如果您尝试使用不使用完全相同列的模型,在Flow、R、Python等中也会看到类似的错误:

Error: water.exceptions.H2OIllegalArgumentException: Base models are inconsistent: they use different column lists.  Found: [x6, x7, x4, x5, x2, x3, x1, x9, x8, x10, response] and: [x10, x16, x15, x18, x17, x12, x11, x14, x13, x19, x9, x8, x20, x21, x28, x27, x26, x25, x24, x23, x22, x6, x7, x4, x5, x2, x3, x1, response].  
堆叠集成算法中的metalearning步骤结合了基本模型的输出,因此用于训练基本模型的输入数量实际上并不重要。目前,H2O仍然要求输入都是同一原始training_框架的一部分,但如果喜欢,可以为每个基础模型使用不同的x参数,x参数指定要在模型中使用training_框架中的哪些列

堆叠集成在Flow中工作的方式是,它寻找所有兼容的模型,换句话说,在同一数据帧上进行训练。然后从该列表中选择要包含在集合中的集合。因此,只要您使用的是最新的H2O开发版本,那么这就是如何在Flow中完成您想要做的事情

下面是一个R示例,说明如何集成在特征空间的不同子集上训练的模型:

library(h2o)
h2o.init()

# Import a sample binary outcome training set into H2O
train <- h2o.importFile("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")
test <- h2o.importFile("https://s3.amazonaws.com/erin-data/higgs/higgs_test_5k.csv")

# Identify predictors and response
y <- "response"
x <- setdiff(names(train), y)

# For binary classification, response should be a factor
train[,y] <- as.factor(train[,y])
test[,y] <- as.factor(test[,y])

# Train & Cross-validate a GBM using a subset of features
my_gbm <- h2o.gbm(x = x[1:10],
                  y = y,
                  training_frame = train,
                  distribution = "bernoulli",
                  nfolds = 5,
                  keep_cross_validation_predictions = TRUE,
                  seed = 1)

# Train & Cross-validate a RF using a subset of features
my_rf <- h2o.randomForest(x = x[3:15],
                          y = y,
                          training_frame = train,
                          nfolds = 5,
                          keep_cross_validation_predictions = TRUE,
                          seed = 1)

# Train a stacked ensemble using the GBM and RF above
ensemble <- h2o.stackedEnsemble(y = y, training_frame = train,
                                base_models = list(my_gbm, my_rf))

# Check out ensemble performance
perf <- h2o.performance(ensemble, newdata = test)
h2o.auc(perf)