上一篇文章中介绍了常用的模型评估指标,但一个好的模型,往往追求的是多个指标的平衡,而非某一个指标的大小。本文介绍的ROC,可以直观的展示评估效果。

ROC曲线

在ROC曲线中,横轴是假正例率(FPR),纵轴是真正例率(TPR)。

假正利率(False Posive Rate)FPR = FP/(FP+TN),代表分类器预测错的正样本,占实际负样本的比例。

真正利率(True Posive Rate)FPR = TP/(TP+FN),即召回率。

ROC曲线需要相应阈值进行绘制。

AUC面积

AUC (Area under Curve):ROC曲线下的面积,介于0.1和1之间,作为数值可以直观的评价分类器的好坏,值越大越好,表示找到真实正样本付出的代价越小。

代码示例

1、构建数据集

from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs

class_1 = 500
class_2 = 50
centers = [[0,0], [1,1]]
cluster_std = [1.5, 0.5]

x,y = make_blobs(n_samples=[class_1, class_2], cluster_std=cluster_std, random_state=0)
plt.scatter(x[:,0], x[:,1], c=y, s=40)
plt.show()

2、建立模型,查看置信度(类似概率)

from sklearn.svm import SVC

clf = SVC(probability=True).fit(x,y)
prob = clf.predict_proba(x)
# 两列值分别代表两个类别的概率
print(prob)

3、画ROC曲线

from sklearn.metrics import roc_curve
import numpy as np

# pos_label表示正样本的类别
fpr, tpr, thresholds = roc_curve(y, prob[:, 1], pos_label=1)

# 最佳阈值,希望tpr尽量小,fpr尽量大
idx = np.argmax(tpr-fpr)
threshold = thresholds[idx]
print('最佳阈值:', threshold)

plt.scatter(fpr[idx], tpr[idx], c='r', s=50)
plt.plot([0,1], [0,1], c='k', linestyle='--')
plt.plot(fpr, tpr)
plt.show()

4、获取AUC面积

from sklearn.metrics import roc_auc_score as AUC
score = AUC(y, prob[:,1])
print('AUC score:', score) #0.99164

本文为 陈华 原创,欢迎转载,但请注明出处:http://edu.ichenhua.cn/read/288