Als erstes ist hier die vollständige, reproduzierbar Beispiel:
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)
Die ersten Zeilen H2O initialisieren, dann erzeuge ich ändern bewusst die Irisdaten auf wegzuwerfen 60% einer der drei Klassen, zu ein Ungleichgewicht.
Die nächsten paar Zeilen laden diese Daten in H2O und erstellen eine 80%/20% Zug/Test-Datenaufteilung. Der Samen wurde absichtlich gewählt, so dass in den Trainingsdaten virginica 14,58% der Daten ist, verglichen mit 16,67% in den ursprünglichen Daten und 25% in den Testdaten.
Ich trainiere dann drei zufällige Waldmodelle. m1
ist alle Standardwerte, und seine Verwirrung Matrix sieht wie folgt aus:
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
Nichts zu sehen: er die Daten verwendet es findet.
Jetzt ist hier der gleiche Ausgang für m2
, der balance_classes
einschaltet. Sie können sehen, dass es die virginica Klasse überbeprobt, um sie so ausgewogen wie möglich zu bekommen. (Die am weitesten rechts stehenden Spalten sagt 41,41,40 statt 41,41,14, wie in der vorherigen Ausgabe.)
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
In m3
schalten wir noch auf balance_classes
, aber es auch die Wahrheit sagen über die Situation . I.e. dass die tatsächlichen Daten 16.67% virginica sind, nicht die 14,58%, die es in den train
Daten sieht. Die Konfusionsmatrix für m3
zeigt, dass sie daher die Proben in 37 Proben anstelle von 40 Proben verwandelte.
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
Wie habe ich kenne c(1, 1, 2.5)
zu schreiben, und nicht c(2.5, 1, 1)
oder c(1, 2.5, 1)
? Die Ärzte sagen, dass es in "lexikographischer Reihenfolge" sein muss. Sie können herausfinden, was diese Ordnung mit ist:
h2o.levels(train$Species)
, die mir sagt:
[1] "setosa" "versicolor" "virginica"
Die Meinung Bit: balance_classes
ist gut auf wechseln, aber class_sampling_factors
sollte nur verwendet werden, wenn Sie ein wirklich haben Ein guter Grund zu glauben, dass Ihre Trainingsdaten nicht repräsentativ sind.
HINWEIS: Code und Erklärung aus meinem kommenden Buch, Practical Machine Learning mit H2O angepasst.
Wie berechnen wir die 'class_sampling_factors'? Zum Beispiel, wenn ich Dataste habe, die 1000 Datenpunkte von der positiven Klasse und 50000 Datenpunkte von der negativen Klasse enthält, was werden die Abtastfaktoren hier sein und wie werde ich sie berechnen? – Newbie
@Newbie Sie sind nur, wie viel Sie pro Klasse überbewerten möchten (oder unter-Probe wenn weniger als 1,0). Also, in Ihrem Fall, ich denke, Sie wollen jede "positive" Probe 50 mal überbewerten? Also geben Sie 'class_sampling_factors = c (50, 1)' (unter der Annahme, dass "positiv" die erste Klasse ist). ABER NOTE: Das ist das Standardverhalten von "balance_classes"! Setzen Sie "class_sampling_factors" nur dann in Frage, wenn Sie ein anderes Verhältnis benötigen. –