zor*_*ork 6 random-forest logistic-regression apache-spark apache-spark-mllib
我尝试使用Spark MLlib Logistic回归(LR)和/或随机森林(RF)分类器来创建模型来描述由基数重新组合的两个类之间的基数差异很大.
其中一组有1.5亿个负面因素,另有一组只有5万个正面情况.
在使用默认参数训练LR和RF分类器之后,我得到两个分类器的非常相似的结果,例如,对于以下测试集:
Test instances: 26842
Test positives = 433.0
Test negatives = 26409.0
Run Code Online (Sandbox Code Playgroud)
分类器检测到:
truePositives = 0.0
trueNegatives = 26409.0
falsePositives = 433.0
falseNegatives = 0.0
Precision = 0.9838685641904478
Recall = 0.9838685641904478
Run Code Online (Sandbox Code Playgroud)
看起来分类器根本无法检测到任何正面实例.此外,无论数据是如何分成训练和测试集,分类提供相同数量的false positives
相等的若干positives
该测试设置真的有.
LR分类器默认阈值设置为0.5设置阈值为0.8没有任何区别.
val model = new LogisticRegressionWithLBFGS().run(training)
model.setThreshold(0.8)
Run Code Online (Sandbox Code Playgroud)
问题:
1)请告知如何操纵分类器阈值,使分类器对具有一小部分正实例的类与具有大量负实例的类更具敏感性?
2)任何其他MLlib分类器来解决这个问题?
3)itercept
Logistic回归算法有哪些参数?
val model = new LogisticRegressionWithSGD().setIntercept(true).run(training)
Run Code Online (Sandbox Code Playgroud)
好吧,我认为您在这里遇到的是一个非常不平衡的数据集问题:150 000 000 Class1 50 000 Class2。小了 3000 倍。
因此,如果您训练一个假设所有都是 Class1 的分类器,您将获得:0.999666 的准确度。所以最好的分类器永远是 ALL are Class1。这就是您的模型在这里学习的内容。
有不同的方法来评估这些情况,通常你可以做,对较大的类进行下采样,或对较小的类进行上采样,或者你可以用随机森林做一些其他的事情,例如当你以平衡的方式进行采样时(分层),或添加权重:
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 现在的一个问题是并非所有分类器都返回一个概率,我向他们询问了这个问题,这在他们的路线图中。
归档时间: |
|
查看次数: |
2539 次 |
最近记录: |