2016-11-29 40 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