我工作在一个特定的二元分类问题具有高度不平衡的数据集,我想知道是否有人试图实现特定的技术来处理数据集不平衡(如SMOTE)的分类问题,用放电的MLlib。
我正在使用MLLib的Random Forest实现,并且已经尝试了对较大的类进行随机欠采样的最简单方法,但是效果并不理想。
对于您在类似问题上的经历,我们将不胜感激。
谢谢,
到目前为止,Random Forest算法的类加权仍在开发中(请参阅此处)
但是,如果您愿意尝试其他分类器,则此功能已添加到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
}
然后,我们创建一个分类器,如下所示:
new LogisticRegression().setWeightCol("classWeightCol").setLabelCol("label").setFeaturesCol("features")
有关更多详细信息,请在此处观看:https : //issues.apache.org/jira/browse/SPARK-9610
您应该检查的另一个问题-您的功能是否对您要预测的标签具有“预测能力”。在欠采样后您仍然具有较低的精度的情况下,可能与您的数据集天生不平衡这一事实无关。
我将进行探索性的数据分析-如果分类器的性能不比随机选择好,则存在要素与类之间根本没有联系的风险。
过度拟合-训练集上的错误率低而测试集上的错误率高则可能表明您使用了过于灵活的功能集而过度拟合。
偏差偏差-检查您的分类器是否存在高偏差或高偏差问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句