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