处理Spark MLlib中的不平衡数据集

dba*_*akr 28 classification machine-learning apache-spark apache-spark-mllib

我工作在一个特定的二元分类问题具有高度不平衡的数据集,我想知道是否有人试图实现特定的技术来处理数据集不平衡(如SMOTE)的分类问题,用放电的MLlib.

我正在使用MLLib的随机森林实现,并且已经尝试了最简单的方法来随机地对较大的类进行采样,但它没有像我预期的那样工作.

如果您对类似问题的体验有任何反馈,我将不胜感激.

谢谢,

Ser*_*ity 50

Spark ML的等级重量

截至目前,随机森林算法的类权重仍处于开发阶段(见此处)

但是如果您愿意尝试其他分类器 - 此功能已添加到Logistic回归中.

考虑一下我们在数据集中有80%的正数(标签== 1)的情况,因此从理论上讲,我们希望"对样本"进行"欠采样".逻辑损失目标函数应该用较高权重处理负类(标签== 0).

下面是Scala中生成此权重的示例,我们为数据集中的每条记录向数据框添加一个新列:

def balanceDataset(dataset: DataFrame): DataFrame = {

    // Re-balancing (weighting) of records to be used in the logistic loss objective function
    val numNegatives = dataset.filter(dataset("label") === 0).count
    val datasetSize = dataset.count
    val balancingRatio = (datasetSize - numNegatives).toDouble / datasetSize

    val calculateWeights = udf { d: Double =>
      if (d == 0.0) {
        1 * balancingRatio
      }
      else {
        (1 * (1.0 - balancingRatio))
      }
    }

    val weightedDataset = dataset.withColumn("classWeightCol", calculateWeights(dataset("label")))
    weightedDataset
  }
Run Code Online (Sandbox Code Playgroud)

然后,我们创建一个分类如下:

new LogisticRegression().setWeightCol("classWeightCol").setLabelCol("label").setFeaturesCol("features")
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请在此处观看:https://issues.apache.org/jira/browse/SPARK-9610

- 预测能力

您应该检查的另一个问题 - 您的功能是否具有您正在尝试预测的标签的"预测能力".在欠采样后仍然具有低精度的情况下,这可能与您的数据集本质上不平衡的事实无关.


我会做一个探索性的数据分析 - 如果分类器没有比随机选择做得好,那么就有可能在功能和类之间没有连接.

  • 使用标签对每个要素执行相关性分析.
  • 生成特征的类特定直方图(即绘制每个类的数据的直方图,对于同一轴上的给定特征)也可以是显示特征是否在两个类之间很好地区分的好方法.

过度拟合 - 训练集上的低错误和测试集上的高错误可能表示您使用过于灵活的功能集进行过度拟合.


偏差方差 - 检查您的分类器是否存在高偏差或高偏差问题.

  • 训练错误与验证错误 - 绘制验证错误和训练集错误,作为训练示例的函数(执行增量学习)
    • 如果线条似乎收敛到相同的值并且在末尾接近,那么您的分类器具有高偏差.在这种情况下,添加更多数据将无济于事.更改具有更高方差的分类器,或者只是降低当前分类的正则化参数.
    • 另一方面,如果线条相距很远,并且训练集错误较低但验证错误较高,则分类器的方差过高.在这种情况下,获取更多数据很可能会有所帮助.如果获得更多数据后方差仍然过高,则可以增加正则化参数.

  • 这非常有帮助,谢谢.事实上这没有记录在任何地方,没有例子等,你必须参考GH PR和JIRA任务是我的想法.这个很棒的功能存在于ml库中,找到它的唯一方法是挖掘GH PR/Spark源代码/ JIRAS.到目前为止,Spark有更糟糕的文档,这太糟糕了. (2认同)