【问题标题】:sampleBy returns very skewed resultssampleBy 返回非常偏斜的结果
【发布时间】:2016-11-30 02:05:30
【问题描述】:

我正在使用 Spark (1.5.2) DataFrames 并尝试获取分层数据集。我的数据已经准备好进行二进制分类,class 只有两个值,1 和 0。

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    提供给 sampleBy 的 DataFrames 的分数,就像 'sampleByKeyExact' 和 RDD 的 sampleByKey 一样,不是您想要在最终结果集中的百分比。而是您希望从原始数据集中保留的百分比。

    要获得 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)
    

    【讨论】:

    猜你喜欢
    • 2012-05-28
    • 2017-01-14
    • 2021-08-25
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多