![](/img/trans.png)
[英]In Python sklearn.svm.OneClassSvm, how to calculate ROC and AUC only with predicted label and real label?
[英]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.