Spark:与RDD [LabeledPoint]联合的维度不匹配错误

时间:2016-01-14 00:50:00

标签: apache-spark apache-spark-mllib

我最好还是要做以下事情: 本质上,我想要做的是我的数据集RDD [LabeledPoint],我想控制正面和负面标签的比例。

val training_data: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(spark, "training_data.tsv")

此数据集包含案例和控件。我想控制案例与控件的比例(我的数据集是偏斜的)。所以我想做一些类似于training_data的样本,这样病例与对照的比例是1:2(而不是1:500)。

因此我无法做到这一点,我将训练数据分成如下情况和控件,然后尝试使用union运算符将它们组合起来,这给了我Dimensions不匹配错误。

我有两个数据集(都是Libsvm格式):

val positives: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(spark, "positives.tsv")
val negatives: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(spark, "negatives.tsv")

我想将这两者结合起来形成训练数据。注意两者都是libsvm格式。

training = positives.union(negatives)

当我在模型构建中使用上述训练数据集(例如逻辑回归)时,我得到错误,因为正数和负数都可以具有不同数量的列/维度。我收到此错误:“与其他摘要生成器合并时尺寸不匹配”任何想法如何处理?

此外,我还希望进行诸如

之类的采样
positives_subset = positives.sample()

1 个答案:

答案 0 :(得分:0)

我能够通过以下方式解决这个问题:

  def create_subset(training: RDD[LabeledPoint], target_label: Double, sampling_ratio: Double): RDD[LabeledPoint] = {
    val training_filtered = training.filter { case LabeledPoint(label, features) =>  (label == target_label) }
    val training_subset = training_filtered.sample(false, sampling_ratio)
    return training_subset
  }

然后将上述方法调用为:

  val positives = create_subset(training, 1.0, 1.0)
  val negatives_sampled = create_subset(training, 0.0, sampling_ratio)

然后你可以把工会作为:

  val training_subset_double = positives.union(negatives_double)

然后我就可以使用training_subset_double进行模型构建。