h2o
パッケージを使用してバイナリクラシファイアのデフェーブルを試しています。モデルを作成した後、新しい(保留された)データセットにh2o.predict
を使用すると、一部の行でPredict
の出力が最も高い確率の値と一致しないことがわかりました。h2o.deeplearningでの予期しない予測
ここ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)
今
のは、簡単にするためにdplyr
を使用して、Rにそれを持参し、いくつかの新しい列を追加することを操作してみましょう:今すぐ
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ではありませんか?上記のコードの私の最新の実行では、p0
とp1
値は
> 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
恐ろしい!他の人がhttps://groups.google.com/forum/#!topic/h2ostream/TkNkMFprzf0に私に指摘しましたが、少し古くなっていましたが、私は 'h2o.find_threshold_by_max_metric(h2o.performance(dlmodel) f1 ")'は実際に使用されているような閾値でした – ClaytonJY