ホームページ  >  記事  >  バックエンド開発  >  PythonはROC曲線を描いてAUC値を計算します

PythonはROC曲線を描いてAUC値を計算します

高洛峰
高洛峰オリジナル
2017-02-24 16:12:232680ブラウズ

はじめに

ROC (受信者動作特性) 曲線と AUC は、バイナリ分類器の品質を評価するためによく使用されます。この記事では、まず ROC と AUC について簡単に紹介し、次に例を使用して Python で ROC 曲線を作成し、AUC を計算する方法を示します。

AUC の概要

AUC (Area Under Curve) は、機械学習二項分類モデルで非常に一般的に使用される評価指標であり、F1 スコアと比較してプロジェクトの不均衡に対する許容度が高く、現在一般的です。通常、機械学習ライブラリ (scikit-learn など) にはこの指標の計算が統合されていますが、モデルが別個であるか、独自に作成されている場合があります。この場合、トレーニング モデルの品質を評価したい場合は、 AUC 計算を自分で行うモジュールですが、この記事で情報を検索したときに libsvm-tools に非常にわかりやすい auc 計算があることがわかったので、今後の使用のために選択しました。

AUCの計算

AUCの計算は以下の3つのステップに分かれています:

1. 計算データの準備 モデルのトレーニング中にトレーニングセットのみがある場合、一般的にクロスバリデーションを使用して計算されます。評価セット (評価) は通常、予測スコアとそのターゲット カテゴリを必要とします (予測カテゴリではなくターゲット カテゴリであることに注意してください)

2.閾値に従って、水平 (X: 偽陽性率) と垂直 (Y: 真陽性率) の点

3. 座標点を曲線に接続した後、曲線の下の面積、つまり AUC の値を計算します。

Pythonコードを直接入力します

#! -*- coding=utf-8 -*-
import pylab as pl
from math import log,exp,sqrt


evaluate_result="you file path"
db = [] #[score,nonclk,clk]
pos, neg = 0, 0 
with open(evaluate_result,'r') as fs:
 for line in fs:
 nonclk,clk,score = line.strip().split('\t')
 nonclk = int(nonclk)
 clk = int(clk)
 score = float(score)
 db.append([score,nonclk,clk])
 pos += clk
 neg += nonclk
 
 

db = sorted(db, key=lambda x:x[0], reverse=True)

#计算ROC坐标点
xy_arr = []
tp, fp = 0., 0.  
for i in range(len(db)):
 tp += db[i][2]
 fp += db[i][1]
 xy_arr.append([fp/neg,tp/pos])

#计算曲线下面积
auc = 0.  
prev_x = 0
for x,y in xy_arr:
 if x != prev_x:
 auc += (x - prev_x) * y
 prev_x = x

print "the auc is %s."%auc

x = [_v[0] for _v in xy_arr]
y = [_v[1] for _v in xy_arr]
pl.title("ROC curve of %s (AUC = %.4f)" % ('svm',auc))
pl.xlabel("False Positive Rate")
pl.ylabel("True Positive Rate")
pl.plot(x, y)# use pylab to plot x and y
pl.show()# show the plot on the screen

入力データセットはSVM予測結果を参照できます

形式は次のとおりです:

nonclk \t clk \t score

その中には:
1. nonclick: クリックされていないデータ。ネガティブサンプルの数とみなすことができます

2. clk: クリック数、ポジティブサンプルの数とみなすことができます

3. スコア: 予測スコア、このスコアをグループとして使用して、陽性サンプルと陰性サンプルの事前統計を実行すると、実行中の AUC 計算の量を削減できます

結果は次のようになります:

PythonはROC曲線を描いてAUC値を計算します

pylab がマシンにインストールされていない場合は、直接注釈を付けることができます依存関係と描画部分


上記のコード:

1. 計算できるのは 2 つのカテゴリの結果のみです ( 2 つのカテゴリのラベルについては、気軽に扱うことができます) )

2. 上記のコードの各スコアにはしきい値があります。実際、この効率は非常に低く、サンプルをサンプリングするか、水平軸座標を計算するときに同等の計算を実行できます

Python 描画 ROC に関連するその他の記事はこちらです。曲線と AUC 値の計算については、PHP 中国語 Web サイトに注意してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。