如何在python中计算一类SVM的AUC?

时间:2015-01-19 10:06:24

标签: python machine-learning scikit-learn auc

我难以在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]并为AUC绘制OneClassSVM

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

2 个答案:

答案 0 :(得分:1)

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

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

  • 您可以通过计算输入数据中OneClassSVM决策函数的最大值,称之为UPDATE menu_items SET build_items = t.newValue FROM (WITH temp AS (SELECT id, UNNEST(build_items) b FROM menu_items) SELECT id, array_agg(b - 'item_id' || jsonb_build_object('value', coalesce(b -> 'item_id', b -> 'value'))) AS newValue FROM temp GROUP BY id) AS t WHERE menu_items.id = t.id; ,然后对给定观察的预测进行评分来估算此类评分{ {1}}通过计算MAX

  • 使用这些分数作为y传递给y_score = MAX - decision_function(y)等函数,这些函数将接受非阈值分数而不是概率。

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

答案 1 :(得分:0)

使用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))

查看precision_score和auc()之间的区别,您需要预测的分数。

共享编辑删除标记