2016-11-29 3 views
1

Я использую Spark (1.5.2) DataFrames и пытаюсь получить стратифицированный набор данных. Мои данные были нацелены на бинарную классификацию и существует только два значения для class, 1 и 0.sampleBy возвращает очень искаженные результаты

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()) 

На консоли я получаю выход, показывая значительно неправильное соотношение 1 класса 0:

Training True Class = 799845 
Training False Class = 32797260 

ответ

2

Фракция, предоставленная sampleBy для DataFrames, как и для «sampleByKeyExact» и sampleByKey для RDD, - это не процент, который вы хотите получить в конечном наборе результатов. Скорее это процент, который вы хотите сохранить от исходного набора данных.

Чтобы получить раскол 50/50, вам нужно сравнить значения класса 1 и класса 0 в полном наборе данных, получить соотношение, а затем использовать их, чтобы помочь вам выбрать свои фракции.

Так, например, если 98% записей относятся к классу 0 и 2% относятся к классу 1, и вы хотите разделить 50/50, то вы можете использовать долю класса 1 = 100% и класс 0 = 2%.

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

Возможно, вы ищете http://stackoverflow.com/a/32241887/3415409 – eliasah

Смежные вопросы