簡體   English   中英

如何在python中計算一類SVM的AUC?

[英]How to calculate AUC for One Class SVM in python?

我很難在 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').

請參閱對類似問題的回答。 要點是:

  • OneClassSVM 從根本上不支持將決策轉換為概率分數,因此您無法將必要的分數傳遞給需要改變分數閾值的函數,例如 ROC 或 Precision-Recall 曲線和分數。

  • 您可以通過計算輸入數據中 OneClassSVM 決策函數的最大值來近似這種類型的分數,將其稱為MAX ,然后通過計算y_score = MAX - decision_function(y)對給定觀察y的預測進行評分。

  • 使用這些分數作為y_score傳遞給average_precision_score等函數,這些函數將接受非閾值分數而不是概率。

  • 最后,請記住 ROC 對 OneClassSVM 的物理意義較小,特別是因為 OneClassSVM 適用於存在預期和巨大類不平衡(異常值與非異常值)的情況,並且 ROC 不會准確地增加相對成功的權重在少量異常值上。

使用 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()之間的區別,你需要預測的分數。

共享編輯刪除標志

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM