2016-11-29 3 views
1

Ich benutze Spark (1.5.2) DataFrames und versuche, ein geschichtetes Dataset zu erhalten. Meine Daten wurden für binäre Klassifizierung vorbereitet und es gibt nur die beiden Werte für class, 1 und 0.sampleBy liefert sehr verzerrte Ergebnisse

val Array(trainingData, testData) = df.randomSplit(Array(0.7, 0.3)) 
val fractions: Map[Int, Double] = Map(1 -> 0.5, 0 -> 0.5) 

val trainingData3 = trainingData.stat.sampleBy("class", fractions, new Random().nextLong) 

println("Training True Class = " + trainingData3.where("class=1").count()) 
println("Training False Class = " + trainingData3.where("class=0").count()) 

Auf der Konsole erhalte ich eine Ausgabe ein erheblich falsches Verhältnis der Klasse 1 auf 0 zeigt:

Training True Class = 799845 
Training False Class = 32797260 

Antwort

2

Der für sampleBy bereitgestellte Bruchteil für DataFrames, wie bei 'sampleByKeyExact' und sampleByKey für RDDs, ist nicht der Prozentsatz, den Sie im Endergebnissatz haben möchten. Es ist vielmehr der Prozentsatz, den Sie vom ursprünglichen Datensatz beibehalten möchten.

Um eine 50/50-Teilung zu erhalten, müssen Sie die Zählungen der Klassen 1 und 0 im vollständigen Datensatz vergleichen, das Verhältnis ermitteln und diese dann zur Auswahl Ihrer Brüche verwenden. Wenn beispielsweise 98% der Datensätze Klasse 0 und 2% Klasse 1 sind und Sie eine 50/50-Aufteilung wünschen, können Sie beispielsweise einen Bruch der Klasse 1 = 100% und Klasse 0 = 2% verwenden.

val fractions: Map[Int, Double] = Map(1 -> 1.0, 0 -> 0.02) 
+0

Sie könnten nach dieser http://stackoverflow.com/a/32241887/3415409 suchen – eliasah

Verwandte Themen