2016-11-29 133 views
1

我正在使用Spark(1.5.2)DataFrames并尝试获取分层数据集。我的数据已经被准备向二元分类并且只有这两个值用于class,1和0sampleBy返回非常偏斜的结果

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

为DataFrames提供的分数为sampleBy,与'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