隨機分類器的ROC和Precision-recall曲線


隨機分類器,也就是對於一個分類問題,隨機猜測答案。理論上,隨機分類器的性能是所有分類器的下界。對隨機分類器的理解,可以幫助更好的理解分類器的性能指標。隨機分類器的性能也可以作為評價分類器的一個基礎。所以簡單寫了幾行代碼來研究一下隨機分類器的性能。用的是scikit-learn包。

這里產生了一個正負樣本比例為7:3的樣本。由於是隨機猜測,所以feature數據就不需要了。隨機分類器對每個樣本,輸出一個[0, 1)之間的數作為正樣本的概率。分類以0.5為閾值,評價了幾個主要的指標,並畫出ROC和Precision-recall曲線。

import numpy as np
import numpy.random as r
import sklearn.metrics as m
import pylab as pl

def main():
    size = 1000000
    y_true = np.array([ 1 if i >= 0.3 else 0 for i in r.random(size) ], dtype=np.float32)
    y_pred = r.random(size)
    y_cls = np.array([ 1 if i >= 0.5 else 0 for i in y_pred ], dtype=np.float32)
print m.classification_report(y_true, y_cls) fpr, tpr, th = m.roc_curve(y_true, y_pred) ax = pl.subplot(2, 1, 1) ax.plot(fpr, tpr) ax.set_title('ROC curve') precision, recall, th = m.precision_recall_curve(y_true, y_pred) ax = pl.subplot(2, 1, 2) ax.plot(recall, precision) ax.set_ylim([0.0, 1.0]) ax.set_title('Precision recall curve') pl.show() if __name__ == '__main__': main()

幾個主要指標如下 。

             precision    recall  f1-score   support

        0.0       0.30      0.50      0.37    299977
        1.0       0.70      0.50      0.58    700023

avg / total       0.58      0.50      0.52   1000000

ROC和Precision-recall曲線見下。

ROC曲線是一條y=x的直線,AUC=0.5。ROC曲線的橫軸和縱軸分別是fpr和tpr,可以理解為將負例分為正例的概率,以及將正例分為正例的概率。注意,這里的分母都是實際的正例/負例數目。也就是說,ROC曲線反映了分類器對正例的覆蓋能力和對負例的覆蓋能力之間的權衡。

而Precision-recall曲線是一條y=0.7的直線,0.7為樣本中正例的比例。橫軸recall也就是tpr,反映了分類器對正例的覆蓋能力。而總軸precision的分母是識別為正例的數目,而不是實際正例數目。precision反映了分類器預測正例的准確程度。那么,Precision-recall曲線反映了分類器對正例的識別准確程度和對正例的覆蓋能力之間的權衡。對於隨機分類器而言,其precision固定的等於樣本中正例的比例,不隨recall的變化而變化。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM