【问题标题】:How to calculate AUC for One Class SVM in python?如何在 python 中计算一类 SVM 的 AUC?
【发布时间】:2015-03-17 07:23:41
【问题描述】:

我很难在 python 中绘制 OneClassSVM 的 AUC 图(我正在使用 sklearn 生成混淆矩阵,如 [[tp, fp],[fn,tn]]fn=tn=0

from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_nb_predicted)
roc_auc = auc(fpr, tpr) # this generates ValueError[1]
print "Area under the ROC curve : %f" % roc_auc
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)

我想处理错误 [1] 并为 OneClassSVM 绘制 AUC

[1] ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

【问题讨论】:

    标签: python machine-learning scikit-learn auc


    【解决方案1】:

    使用 predprobs 函数计算 auc(y_true, y_score) 中要求的分数或概率/分数,问题是因为 y_score。您可以将其转换为如下代码行所示

    # Classifier - Algorithm - SVM
    # fit the training dataset on the classifier
    SVM = svm.SVC(C=1.0, kernel='linear', degree=3, gamma='auto',probability=True)
    SVM.fit(Train_X_Tfidf,Train_Y)
    # predict the labels on validation dataset
    predictions_SVM = SVM.predict(Test_X_Tfidf)
    # Use accuracy_score function to get the accuracy
    print("SVM Accuracy Score -> ",accuracy_score(predictions_SVM, Test_Y))
    
    probs = SVM.predict_proba(Test_X_Tfidf)
    preds = probs[:,1]
    fpr, tpr, threshold = roc_curve(Test_Y, preds)
    print("SVM Area under curve -> ",auc(fpr, tpr))
    

    看看accuracy_score和auc()的区别,你需要预测的分数。

    共享编辑删除标志

    【讨论】:

      【解决方案2】:

      有关类似问题,请参阅my answer。要点是:

      • OneClassSVM 基本上不支持将决策转换为概率分数,因此您无法将必要的分数传递给需要改变分数阈值的函数,例如 ROC 或 Precision-Recall 曲线和分数。

      • 您可以通过计算输入数据中 OneClassSVM 决策函数的最大值来近似这种类型的分数,将其命名为 MAX,然后通过计算 @987654326 对给定观察值 y 的预测进行评分@。

      • 使用这些分数作为y_score 传递给average_precision_score 等函数,这些函数将接受非阈值分数而不是概率。

      • 最后,请记住 ROC 对 OneClassSVM 的物理意义较小,特别是因为 OneClassSVM 适用于存在预期和巨大的类不平衡(异常值与非异常值)的情况,并且 ROC 不能准确在少量异常值上提高相对成功率。

      【讨论】:

      • 计算AUROC,你能确认为什么需要MAX吗?在我的估计中,否定decision_score 应该就足够了,因为向所有值添加偏移量不会影响 AUROC。如果您有其他想法,请纠正我。
      • @ZaydH MAX 不是必需的。有许多转换可以工作,只是否定也可以。但是,使用MAX 的转换是一种流行且有点标准的方法,因为它将异常值重新缩放到正 x 轴(较低的分数意味着较大的异常值),这对于绘制这些“分数”和对它们做其他操作,知道你可以很容易地与零进行比较。
      • @ely 你有使用MAX 转换的论文参考吗?我知道的唯一一篇使用否定的论文(scores = (-1.0) * self.svm.decision_function(self.K_test) 这里:github.com/lukasruff/Deep-SVDD/blob/master/src/svm.py
      • @ely 抱歉,但我不明白为什么我们不能根据 score_samples 进行 roc 雕刻。你能详细说明一下吗? github.com/scikit-learn/scikit-learn/blob/95d4f0841/sklearn/svm/…
      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 2020-04-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2022-06-13
      • 2016-05-12
      相关资源
      最近更新 更多