我最好还是要做以下事情: 本质上,我想要做的是我的数据集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()
答案 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进行模型构建。