2016-08-29 8 views
2

Я использую H2O deeplearning Feed Forward Deep Neural network для выполнения двоичной классификации. Мои классы являются очень несбалансированной, и я хочу, чтобы использовать параметры, такие какH2O deeplearning с классовым дисбалансом

balance_classes, class_sampling_factors

Может ли тело дать мне воспроизводимый пример о том, как конкретно инициализировать эти параметры для решения проблем класса дисбаланса.

ответ

5

Во-первых, вот полный, воспроизводимые, например:

library(h2o) 
h2o.init() 

data(iris) #Not required? 
iris <- iris[1:120,] #Remove 60% of virginica 
summary(iris$Species) #50/50/20 

d <- as.h2o(iris) 
splits = h2o.splitFrame(d,0.8,c("train","test"), seed=77) 
train = splits[[1]] 
test = splits[[2]] 
summary(train$Species) #41/41/14 
summary(test$Species) #9/9/6 

m1 = h2o.randomForest(1:4, 5, train, model_id ="RF_defaults", seed=1) 
h2o.confusionMatrix(m1) 

m2 = h2o.randomForest(1:4, 5, train, model_id ="RF_balanced", seed=1, 
    balance_classes = TRUE) 
h2o.confusionMatrix(m2) 

m3 = h2o.randomForest(1:4, 5, train, model_id ="RF_balanced", seed=1, 
    balance_classes = TRUE, 
    class_sampling_factors = c(1, 1, 2.5) 
) 
h2o.confusionMatrix(m3) 

Первые строки инициализации H2O, то я намеренно изменить данные диафрагмы, установленные отбрасывать 60% одного из 3-х классов, чтобы создать дисбаланс.

Следующие несколько строк загружают эти данные в H2O и создают разделение поезда/теста на 80%/20%. Семена были выбраны намеренно, так что в данных обучения virginica составляет 14,58% данных по сравнению с 16,67% в исходных данных и 25% в данных испытаний.

Затем я тренирую три случайных лесных модели. m1 это все по умолчанию, и его растерянность матрица выглядит следующим образом:

  setosa versicolor virginica Error  Rate 
setosa   41   0   0 0.0000 = 0/41 
versicolor  0   39   2 0.0488 = 2/41 
virginica  0   1  13 0.0714 = 1/14 
Totals   41   40  15 0.0312 = 3/96 

Ничто не увидеть здесь: он использует данные, которые он находит.

Теперь вот такой же вывод для m2, который включается balance_classes. Вы можете видеть, что он перевыбочен классом virginica, чтобы максимально сбалансировать их. (Самый правый столбцы говорит 41,41,40 вместо 41,41,14, как и в предыдущем выходе.)

  setosa versicolor virginica Error  Rate 
setosa   41   0   0 0.0000 = 0/41 
versicolor  0   41   0 0.0000 = 0/41 
virginica  0   2  38 0.0500 = 2/40 
Totals   41   43  38 0.0164 = 2/122 

В m3 мы еще включить balance_classes, но и сказать ему правду о ситуации , То есть что фактические данные составляют 16,67% virginica, а не 14,58%, которые он видит в данных train. Матрица путаницы для m3 показывает, что она, таким образом, превратила 14 образцов образцов в 37 образцов вместо 40 образцов.

  setosa versicolor virginica Error  Rate 
setosa   41   0   0 0.0000 = 0/41 
versicolor  0   41   0 0.0000 = 0/41 
virginica  0   2  35 0.0541 = 2/37 
Totals   41   43  35 0.0168 = 2/119 

Как я знаю, что писать c(1, 1, 2.5), а не c(2.5, 1, 1) или c(1, 2.5, 1)? Документы говорят, что это должно быть в «лексикографическом порядке». Вы можете узнать, что это заказ с:

h2o.levels(train$Species) 

, который говорит мне:

[1] "setosa"  "versicolor" "virginica" 

Мнение бит: balance_classes хорош для включения, но class_sampling_factors следует использовать только тогда, когда у вас есть на самом деле повод считать, что ваши данные обучения не являются репрезентативными.

ПРИМЕЧАНИЕ: Код и пояснения, адаптированные из моей будущей книги «Практическая машина обучения с использованием H2O».

+0

Как мы вычисляем 'class_sampling_factors'? Например, если у меня есть dataste, который содержит 1000 datapoints из положительного класса и 50000 datapoints из отрицательного класса, каковы будут здесь коэффициенты выборки и как их вычислить? – Newbie

+0

@Newbie Они всего лишь то, что вы хотите перепробовать (или под-образец, если меньше 1.0) каждого класса. Итак, в вашем случае, я думаю, вы хотите перепробовать каждый «положительный» образец 50 раз? Таким образом, вы даете 'class_sampling_factors = c (50, 1)' (предполагая, что «положительный» - это первый класс). НО ПРИМЕЧАНИЕ: это поведение по умолчанию, просто устанавливающее 'balance_classes'! Только нужно установить 'class_sampling_factors', если вам нужен другой коэффициент. –