2016-08-29 3 views
2

Ich benutze das H2O Deeplearning Feed Forward Deep Neural Netzwerk für eine binäre Klassifizierung. Meine Klassen sind sehr unausgewogen und ich möchte die Parameter verwenden, wieH2O Deeplearning mit Klassenungleichgewicht

balance_classes, class_sampling_factors

Kann jede Stelle mir ein reproduzierbares Beispiel darüber, wie speziell diese Parameter intialize Klasse Ungleichgewicht Probleme zu behandeln.

Antwort

5

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.

+0

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

+0

@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. –