如何计算 python 中一个 Class 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
通过计算 y_score = MAX - decision_function(y)
.
使用这些分数作为 y_score
传递给 average_precision_score
等函数,这些函数将接受非阈值分数而不是概率。
最后,请记住,ROC 对 OneClassSVM 的物理意义较小,特别是因为 OneClassSVM 适用于存在预期的巨大 class 不平衡(异常值与非异常值)的情况异常值),并且 ROC 不会准确地提高少量异常值的相对成功率。
使用predprobs函数计算分数或probabilities/scores如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()的区别,需要预测的分数
分享编辑删除标志
我很难在 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
通过计算y_score = MAX - decision_function(y)
.使用这些分数作为
y_score
传递给average_precision_score
等函数,这些函数将接受非阈值分数而不是概率。最后,请记住,ROC 对 OneClassSVM 的物理意义较小,特别是因为 OneClassSVM 适用于存在预期的巨大 class 不平衡(异常值与非异常值)的情况异常值),并且 ROC 不会准确地提高少量异常值的相对成功率。
使用predprobs函数计算分数或probabilities/scores如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()的区别,需要预测的分数
分享编辑删除标志