h2o.deeplearning中的意外预测

时间:2016-08-19 18:57:43

标签: r h2o

我正在尝试使用h2o包来加深学习二进制分类器。当我构建模型然后在一些新的(保持的)数据集上使用h2o.predict时,我注意到对于某些行,Predict输出与具有最高概率的值不匹配。

这是一个可重现的示例,改编自h2o's deeplearning tutorial

library(h2o)

h2o.init(nthreads=-1, max_mem_size="2G")
h2o.removeAll()


df <- h2o.importFile(path = "https://raw.githubusercontent.com/h2oai/h2o-tutorials/master/tutorials/data/covtype.full.csv")

splits <- h2o.splitFrame(df, c(0.6,0.2), seed=1234)
train  <- h2o.assign(splits[[1]], "train.hex") # 60%
valid  <- h2o.assign(splits[[2]], "valid.hex") # 20%
test   <- h2o.assign(splits[[3]], "test.hex")  # 20%

response <- "Cover_Type"
predictors <- setdiff(names(df), response)

train$bin_response <- ifelse(train[,response]=="class_1", 0, 1)
train$bin_response <- as.factor(train$bin_response) ##make categorical

# apply same transforms to test
test$bin_response <- ifelse(test[,response]=="class_1", 0, 1)
test$bin_response <- as.factor(test$bin_response)

dlmodel <- h2o.deeplearning(
  x=predictors,
  y="bin_response", 
  training_frame=train,
  hidden=c(10,10),
  epochs=0.1
  #balance_classes=T    ## enable this for high class imbalance
)

pred <- h2o.predict(dlmodel, test)

现在让我们操纵它将它带入R并添加一些新列,为简单起见使用dplyr

pred_df <- bind_cols(
  select(as.data.frame(test), actual = bin_response),
  as.data.frame(pred)
) %>%
  tbl_df %>%
  mutate(
    derived_predict = factor(as.integer(p1 > p0)),
    match = predict == derived_predict
  )

现在我认为预测应始终与概率最高的列匹配,但情况并非总是如此:

> pred_df %>% summarize(sum(match) / n())
# A tibble: 1 x 1
  sum(match)/n()
           <dbl>
1      0.9691755

为什么这个值不是1?在我最近运行的上述代码中,p0p1值非常接近

> pred_df %>% filter(!match)
# A tibble: 3,575 x 6
   actual predict        p0        p1 derived_predict match
   <fctr>  <fctr>     <dbl>     <dbl>          <fctr> <lgl>
1       1       1 0.5226679 0.4773321               0 FALSE
2       0       1 0.5165302 0.4834698               0 FALSE
3       0       1 0.5225683 0.4774317               0 FALSE
4       0       1 0.5120126 0.4879874               0 FALSE
5       1       1 0.5342851 0.4657149               0 FALSE
6       0       1 0.5335089 0.4664911               0 FALSE
7       0       1 0.5182881 0.4817119               0 FALSE
8       0       1 0.5094492 0.4905508               0 FALSE
9       0       1 0.5309947 0.4690053               0 FALSE
10      0       1 0.5234880 0.4765120               0 FALSE
# ... with 3,565 more rows

但仍然没有解释为什么h2o.predict选择不太可能的值。

我在这里做错了吗?这是h2o中的错误吗? h2o是否故意在选择预测时使用的信息多于它在这里给我的信息?

有趣的是,使用我的derived_predict产生的准确度略高一些:

> pred_df %>%
+   summarize(
+     original = sum(actual == predict)         / n(),
+     derived  = sum(actual == derived_predict) / n()
+   )
# A tibble: 1 x 2
   original   derived
      <dbl>     <dbl>
1 0.7794946 0.7827452

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。试图解释预测值与p1值的关系。

H2O默认使用最高F1分数进行分类。使用p1列,您可以指定自己的阈值。

阅读文档并不是很明显。但你可以在R小册子中找到它。奇怪的是,没有de DRF,GBM或Deep Learning小册子。