目錄
ROC曲線
ROC的全稱是Receiver Operating Characteristic Curve,中文名字叫“受試者工作特徵曲線”,顧名思義,其主要的分析方法就是畫這條特徵曲線。ROC曲線的橫軸是FPR(假陽性率、誤診率)、縱軸是TPR(真陽性率、靈敏度)。
這條曲線代表的是在不同的閾值下,FPR和TPR的一個變化曲線,通常,我們希望FPR儘可能的小,而TPR儘可能的大,所以曲線越靠近左上角,模型的效果越好。
def acu_curve(y,prob):
"""
param y:真實值
param prob:預測值
"""
fpr,tpr,threshold = roc_curve(y,prob) ###計算真正率和假正率
roc_auc = auc(fpr,tpr) ###計算auc的值
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.3f)' % roc_auc) ###假正率爲橫座標,真正率爲縱座標做曲線
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
AUC
AUC(Area Under Curve)被定義爲ROC曲線下的面積,取值範圍一般在0.5和1之間。使用AUC值作爲評價標準是因爲很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作爲一個數值,對應AUC更大的分類器效果更好。
KS曲線
KS(Kolmogorov-Smirnov)曲線(洛倫茲曲線)的縱軸是表示TPR和FPR的值,就是這兩個值可以同時在一個縱軸上體現,橫軸就是閾值,表示模型能夠將正、負客戶區分開的程度越大。兩條曲線之間相距最遠的地方對應的閾值,就是最能劃分模型的閾值,即KS=max(TPR-FPR),KS值越大,模型的區分度越好。
說明K-S曲線的做法:
-
把模型對樣本的輸出概率(predict_proba)從大到小排序,計算對應不同閾值時,大於等於閾值的樣本數佔總樣本的百分比percentage
-
計算閾值取每個概率時對應的TPR和FPR值,分別畫(percentage, TPR)和(percentage, FPR)的曲線
-
K-S曲線上的KS值,即max(TPR−FPR),即兩條曲線間的最大間隔距離。
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
def KS_cal(y,y_hat_proba):
"""
param y:真實值
param y_hat_proba:預測分數
"""
# 計算ks值
fpr, tpr, _ = roc_curve(y, y_hat_proba)
diff = np.subtract(tpr, fpr)
ks = diff.max()
return ks
def plot_ks(y,y_hat_proba):
# 畫ks曲線
fpr, tpr, thresholds = roc_curve(y, y_hat_proba)
diff = np.subtract(tpr, fpr)
ks = diff.max()
y_len = len(y)
# 計算比例,這樣計算比較快
# 也可以自己劃分樣本的比例,自己計算fpr,tpr
y_hat_proba_sort = sorted(y_hat_proba, reverse=True)
cnt_list = []
cnt = 0
for t in thresholds:
for p in y_hat_proba_sort[cnt:]:
if p >= t:
cnt += 1
else:
cnt_list.append(cnt)
break
percentage = [c/float(y_len) for c in cnt_list]
if min(thresholds)<=min(y_hat_proba_sort):
percentage.append(1)
# 以下爲畫圖部分
best_thresholds = thresholds[np.argmax(diff)]
best_percentage = percentage[np.argmax(diff)]
best_fpr = fpr[np.argmax(diff)]
lw = 2
plt.figure(figsize=(8, 8))
plt.plot(percentage, tpr, color='darkorange',
lw=lw, label='True Positive Rate')
plt.plot(percentage, fpr, color='darkblue',
lw=lw, label='False Positive Rate')
plt.plot(percentage, diff, color='darkgreen',
lw=lw, label='diff')
plt.plot([best_percentage, best_percentage], [best_fpr, best_fpr+ks],
color='navy', lw=lw, linestyle='--',label = 'ks = %.2f, thresholds = %.2f'%(ks,best_thresholds))
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('percentage')
plt.title('Kolmogorov-Smirnov')
plt.legend(loc="lower right")
plt.show()
P-R曲線
在PR曲線中,以Recall(貌似翻譯爲召回率或者查全率)爲x軸,Precision爲y軸。
# 畫P-R曲線
def pr_curve(y_true, y_scores):
plt.title('Precision/Recall Curve')# give plot a title
plt.xlabel('Recall')# make axis labels
plt.ylabel('Precision')
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
plt.plot(precision, recall)
plt.show()
準確率(precision)
precision 體現了模型對負樣本的區分能力,precision越高,說明模型對負樣本的區分能力越強。
召回率(recall)
recall 體現了分類模型HH對正樣本的識別能力,recall 越高,說明模型對正樣本的識別能力越強,
F1系列
-
f1-score 是precision和recall兩者的綜合。
-
macro-f1會考慮每個類別,得到的值屬於宏觀的值。
-
micro-f1會考慮不同類別的樣本量。