我对Spark ML API有点陌生。我正在尝试通过训练160个分类器(物流或随机森林等)对160个标签进行多标签分类。一旦对Dataset [LabeledPoint]进行了训练,我发现很难获得一个API,而我无法通过一个示例获得每个类的概率。我已经阅读了SO文章,您可以使用管道API并获得概率,但是对于我的用例而言,这将非常困难,因为我将不得不为评估功能确定160个RDD,为每个类获取概率,然后进行联接以根据其概率对课程进行排名。相反,我只想拥有一份评估功能,广播160个模型,然后在map函数中进行预测。我发现自己必须实现这一点,但是我想知道Spark中是否还有另一个便捷的API对不同的分类器(例如Logistic / RF)执行相同的操作,该分类器将表示特征的Vector转换为属于一个类的概率。请让我知道Spark中是否有更好的方法来处理多标签分类。
编辑:我试图创建一个函数来将向量转换为随机森林的标签,但是这很烦人,因为我现在必须在Spark中克隆大树遍历,几乎所有遇到死角的地方都因为某些函数或变量为私有或受保护。如果有错,请纠正我,但是如果还没有实现该用例,我认为它是合理的,因为Scikit-learn已经具备执行此操作的API。
谢谢
答案 0 :(得分:0)
在Spark MLLib代码中找到罪魁祸首:https://github.com/apache/spark/blob/5ad644a4cefc20e4f198d614c59b8b0f75a228ba/mllib/src/main/scala/org/apache/spark/ml/Predictor.scala#L224
预测方法被标记为受保护的,但实际上对于支持这种用例,它应该是公开的。
此问题已在版本2.4中修复,如下所示: https://github.com/apache/spark/blob/branch-2.4/mllib/src/main/scala/org/apache/spark/ml/Predictor.scala
因此升级到版本2.4应该可以解决问题……尽管我认为2.4尚未发布,所以需要等待。
编辑:对于感兴趣的人,这显然不仅对多标签预测有利,而且据观察,针对单实例/小批量预测的常规分类/回归,延迟也提高了3-4倍(请参见https://issues.apache.org/jira/browse/SPARK-16198了解详情)。