Spark、MLlib:调整分类器判别阈值

Spark, MLlib: Adjusting classifier descrimination threshold

我尝试使用 Spark MLlib 逻辑回归 (LR) and/or 随机森林 (RF) class 生成器来创建模型来区分两个 class 由集合表示的基数差别很大。
一组有 150 000 000 个负例,另一组只有 50 000 个正例。

在使用默认参数训练 LR 和 RF classifier 之后,我得到了两个 classifier 非常相似的结果,例如,对于以下测试集:

Test instances: 26842
Test positives = 433.0 
Test negatives = 26409.0

分类器检测到:

truePositives = 0.0  
trueNegatives = 26409.0  
falsePositives = 433.0  
falseNegatives = 0.0 
Precision = 0.9838685641904478
Recall = 0.9838685641904478

看起来 classifier 根本无法检测到任何正实例。 此外,无论数据如何分为训练集和测试集,classifier 提供的 false positives 等于 的数量与 positives那个测试集真的有

LR classifier 默认阈值设置为 0.5 将阈值设置为 0.8 没有任何区别。

val model =  new LogisticRegressionWithLBFGS().run(training)
model.setThreshold(0.8)

问题:

1) 请告知如何操纵 classifier 阈值以使 classifier 对 class 与 class有大量的负面实例?

2) 任何其他 MLlib classfiers 来解决这个问题?

3) itercept 参数对逻辑回归算法有什么作用?

val model = new LogisticRegressionWithSGD().setIntercept(true).run(training)

嗯,我认为你这里有一个非常不平衡的数据集问题: 150 000 000 Class1 50 000 Class2。小了 3000 倍。

所以如果你训练一个假设所有都是 Class1 的 classifier 你将拥有: 0.999666 精度。所以最好的 classifier 永远是 ALL are Class1。这就是您的模型在这里学习的内容。

有不同的方法来评估这些情况,一般来说你可以这样做,对较大的采样进行下采样 Class,或者对较小的采样进行上采样 class,或者你可以做一些其他的事情以随机森林为例,当您以平衡的方式(分层)或添加权重进行采样时:

http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf

还存在其他方法,如 SMOTE 等(也在做样本),您可以在此处阅读更多详细信息:

https://www3.nd.edu/~dial/papers/SPRINGER05.pdf

您可以为逻辑回归更改的阈值将是概率,您可以尝试在此处的逻辑回归示例的参数中使用 "probabilityCol":

http://spark.apache.org/docs/latest/ml-guide.html

但是 MLlib 现在的一个问题是并非所有 classifier 都返回一个概率,我问过他们这个问题并且在他们的路线图中。