【问题标题】:ROC curve and libsvmROC 曲线和 libsvm
【发布时间】:2025-12-18 23:55:01
【问题描述】:

给定使用plotroc.m 绘制的ROC 曲线(参见here):

  1. 理论问题:如何选择要使用的最佳阈值?
  2. 编程问题:如何诱导libsvm 分类器使用选定的(最佳)阈值?

【问题讨论】:

    标签: matlab classification svm libsvm roc


    【解决方案1】:

    ROC 曲线是通过在 y 轴上绘制真阳性分数与在 x 轴上绘制假阳性分数而生成的图。因此,ROC 曲线上任意点 (x,y) 的坐标表示特定阈值下的 FPR 和 TPR 值。 如图所示,我们在 ROC 曲线上找到点 (x,y),它对应于该点到绘图左上角的最小距离(即由 (0,1) 给出)。该点对应的阈值即为所需阈值。对不起,我不允许放任何图像,所以无法用图解释。但是,更多详情请点击ROC related help

    其次,在 libsvm 中,svmpredict 函数返回数据样本属于特定类的概率。因此,如果该概率(对于正类)大于阈值(从 ROC 图获得),那么我们可以将样本分类为正类。这几行可能对您有用:

        [pred_labels,~,p] = svmpredict(target_labels,feature_test,svmStruct,'-b 1');
    

    % 其中,svmStruct 是 svmtrain 函数返回的结构体。

        op = p(:,svmStruct.Label==1);  % This gives probability for positive
    % class (i.e whose label is 1 )
    

    现在如果这个变量 'op' 大于阈值,那么我们可以将相应的测试样本分类为正类。这可以这样做

    op_labels = op>th; % 其中 'th' 是从 ROC 获得的阈值

    【讨论】: