代码之家  ›  专栏  ›  技术社区  ›  qwertz

Spark/Pyspark:SVM-如何获得曲线下的面积?

  •  1
  • qwertz  · 技术社区  · 6 年前

    我最近一直在处理随机森林和朴素贝叶斯。现在我想使用支持向量机。

    拟合模型后,我想使用输出列“概率”和“标签”来计算AUC值。但是现在我看到SVM没有“概率”列了?!

    在这里,您可以看到我迄今所做的工作:

    from pyspark.ml.classification import LinearSVC
    
    svm = LinearSVC(maxIter=5, regParam=0.01)
    model = svm.fit(train)
    
    scores = model.transform(train)
    results = scores.select('probability', 'label')
    
    # Create Score-Label Set for 'BinaryClassificationMetrics'
    results_collect = results.collect()
    results_list = [(float(i[0][0]), 1.0-float(i[1])) for i in results_collect]
    scoreAndLabels = sc.parallelize(results_list)
    
    metrics = BinaryClassificationMetrics(scoreAndLabels)
    print("AUC-value: " + str(round(metrics.areaUnderROC,4)))
    

    这就是我过去对随机森林和朴素贝叶斯的做法。我想我也可以用svm。。。但这不起作用,因为没有输出列“概率”。

    有人知道为什么“概率”一栏不存在吗?现在如何计算AUC值?

    2 回复  |  直到 3 年前
        1
  •  1
  •   desertnaut user1552891    3 年前

    使用最新的 spark/pyspark 截至回答时:

    如果您使用 pyspark.ml 模块(不同于 mllib ),您可以使用Dataframe作为接口:

    svm = LinearSVC(maxIter=5, regParam=0.01)
    model = svm.fit(train)
    test_prediction = model.transform(test)
    

    创建计算器(有关设置,请参阅其源代码):

    from pyspark.ml.evaluation import BinaryClassificationEvaluator
    evaluator = BinaryClassificationEvaluator()
    

    将evaluator应用于数据(同样,源代码显示了更多选项):

    evaluation = evaluator.evaluate(test_prediction)
    

    的结果 evaluate 默认情况下为“曲线下面积”:

    print("evaluation (area under ROC): %f" % evaluation)
    
        2
  •  0
  •   Kal-ko    6 年前

    SVM算法不提供概率估计,只提供一些分数。

    Platt提出了一种算法来计算给定SVM分数的概率,但这一算法受到了批评,但有一些显然没有在Spark中实现。

    顺便说一句,还有一个类似的问题 What does the score of the Spark MLLib SVM output mean?