我正在研究一个高度不平衡的数据集的二进制分类问题,我想知道是否有人尝试过使用Spark的MLlib实现特定的技术来处理分类问题中的不平衡数据集(例如SMOTE)。
我正在使用MLLib的随机森林实现,并且已经尝试了对较大的类进行随机欠采样的最简单方法,但它的效果并不像我预期的那样好。
如果您对类似问题的经验有任何反馈,我将不胜感激。
谢谢,
发布于 2017-04-07 21:02:18
我使用了@Serendipity的解决方案,但我们可以优化balanceDataset函数以避免使用自定义函数。我还添加了更改正在使用的标签列的功能。这是我最终使用的函数版本:
def balanceDataset(dataset: DataFrame, label: String = "label"): DataFrame = {
// Re-balancing (weighting) of records to be used in the logistic loss objective function
val (datasetSize, positives) = dataset.select(count("*"), sum(dataset(label))).as[(Long, Double)].collect.head
val balancingRatio = positives / datasetSize
val weightedDataset = {
dataset.withColumn("classWeightCol", when(dataset(label) === 0.0, balancingRatio).otherwise(1.0 - balancingRatio))
}
weightedDataset
}
我们创建分类器,就像他说的那样:
new LogisticRegression().setWeightCol("classWeightCol").setLabelCol("label").setFeaturesCol("features")
https://stackoverflow.com/questions/33372838
复制相似问题