ROC 曲线讲解 (Receiver Operarating Curve)
概念
在信號(hào)檢測(cè)理論中,接收者操作特征曲線(receiver operating characteristic curve,或者叫ROC曲線)是一種坐標(biāo)圖式的分析工具,在同一模型中設(shè)置最佳閾值。by Wikipedia
ROC曲線的畫(huà)法如下圖所示,每個(gè)點(diǎn)表示不同閾值下 TP(橫坐標(biāo)) FP(縱坐標(biāo))的值,
TP,FP的定義如下
| 實(shí)際值 | |||
| ture 真的 | false 假的 | ||
| 預(yù)測(cè)值 | ture 真的 | TP (true positive) | FP (false positive) |
| false 假的 | FN (false negative) | TN (true negative) | |
TP rate = TP/(TP+FN),分母就是實(shí)際上是真的那一類,這個(gè)算出來(lái)的是預(yù)測(cè)的真的占真正的真的改率。我們想要預(yù)測(cè)的準(zhǔn)確,這個(gè)應(yīng)該越大越好。
FP rate = FP/(FP+TN),分母就是實(shí)際上假的那一類,這個(gè)算出來(lái)的是被錯(cuò)分成真的(其實(shí)是假的)占所有的錯(cuò)的概率,我們希望錯(cuò)分的越小越好,所以這個(gè)值越小越好。
例子
AUC計(jì)算過(guò)程:
下面用兩個(gè)正態(tài)分布的例子說(shuō)明問(wèn)題,
下圖中左邊藍(lán)色是一類,右邊綠色是一類。
(目的)ROC的作用是找到兩個(gè)類,讓紅色的這條線能夠?qū)深愖詈玫胤珠_(kāi)。AUC值越大的分類器,正確率越高
(過(guò)程)從左到→右移動(dòng)移動(dòng)這條紅色的虛線,計(jì)算ROC中的每個(gè)點(diǎn),一個(gè)虛線就是一個(gè)閾值,對(duì)應(yīng)的就是ROC上面的一個(gè)點(diǎn),將ROC連成曲線。在這個(gè)圖中已經(jīng)標(biāo)明了TP,FP,TN,FN,可以很方便的計(jì)算出來(lái)。
-------------------------------------------------------------------------------------------------------------------------------
我們知道TP rate越大越好,FP rate越小越好。那么畫(huà)了ROC之后,怎么判斷哪兩個(gè)類能分的最開(kāi)呢?怎么找到哪個(gè)閾值最好呢?
下面這張圖畫(huà)出了解決辦法。就是算出AUC(Area Under Curve,曲線下的面積),也就是ROC與坐標(biāo)軸形成的面積。
AUC圖反映的是兩個(gè)類的重疊程度,AUC的面積反應(yīng)了分類的好壞。
我們可以看到不同的兩個(gè)分類的AUC截然不同,
第一個(gè)例子:可以分開(kāi)大多數(shù)點(diǎn),它的AUC在0.9左右
第四個(gè)例子:兩個(gè)類完全重合時(shí),一半的點(diǎn)都會(huì)分類錯(cuò)誤,相當(dāng)于沒(méi)分,它的AUC是0.5左右。
因此AUC面積越大的分類器的分類效果最好,這樣的分類器在找到閾值后可以有較高的分類正確率。
鏈接: ROC Curves - YouTube代碼 ROCcurve及AUC
import matplotlib.pyplot as plt import numpy as npdef gauss2D(x, m, C):Ci = np.linalg.inv(C) #求矩陣的逆dC = np.linalg.det(C) #求矩陣的行列式num = np.exp(-0.5 * np.dot((x-m).T, np.dot(Ci,(x-m))))den = 2 * np.pi * (dC**0.5) #計(jì)算矩陣的密度函數(shù)return num/dendef twoDGaussianPlot(nx, ny, m, C):x = np.linspace(-6, 6, nx)y = np.linspace(-6, 6, ny)X, Y = np.meshgrid(x, y, indexing='ij')Z = np.zeros([nx,ny])for i in range(nx):for j in range(ny):xvec = np.array([X[i,j], Y[i,j]])Z[i,j] = gauss2D(xvec, m, C)return X, Y, ZX = np.random.randn(200, 2) C1 = np.array([[2,1],[1,2]]) C2 = np.array([[2,1],[1,2]]) m1 = np.array([0, 3]) m2 = np.array([3,2.5]) A = np.linalg.cholesky(C1)Y1 = X @ A.T + m1 Y2 = X @ A.T + m2plt.figure(1) plt.scatter(Y1[:,0], Y1[:,1], c='c', s=4) plt.scatter(Y2[:,0], Y2[:,1], c='m', s=4)Xp, Yp, Zp = twoDGaussianPlot(40,50,m1,C1) plt.contour(Xp, Yp, Zp, 5)Xp2, Yp2, Zp2 = twoDGaussianPlot(40,50,m2,C2) plt.contour(Xp2, Yp2, Zp2, 5)# uF = [(np.mean(Y1[:,0])+np.mean(Y2[:,0]))/2,(np.mean(Y1[:,1])+np.mean(Y2[:,1]))/2] # uF = np.array([-1,5]) uF = np.array(m1-m2) print(uF) # print(uF.shape) #plt.arrow(0, 0, *(uF), color='b', linewidth=2.0, head_width=0.30, head_length=0.35) plt.arrow(0, 0, uF[0], uF[1], color='b', linewidth=2.0, head_width=0.30, head_length=0.35)plt.axis('equal') plt.grid() plt.xlim([-6,6]) plt.ylim([-5,8])plt.savefig('density graph.png')yp1 = Y1 @ uF yp2 = Y2 @ uFplt.figure(2) plt.rcParams.update({'font.size':16}) plt.hist(yp1, bins=40) plt.hist(yp2, bins=40) plt.savefig('histogramprojections.png')pmin = np.min( np.array( (np.min(yp1), np.min(yp2) ))) pmax = np.max( np.array( (np.max(yp1), np.max(yp2) ))) print(pmin, pmax)nRocPoints = 50 thRange = np.linspace(pmin, pmax, nRocPoints) ROC = np.zeros((nRocPoints, 2))for i in range(len(thRange)):thresh = thRange[i]TP = len(yp2[yp2 > thresh]) * 100/len(yp2)FP = len(yp1[yp1 > thresh]) * 100/len(yp1)ROC[i,:] =[TP, FP]fig, ax = plt.subplots(figsize=(6,6)) ax.plot(ROC[:,0],ROC[:,1], c='m') ax.set_xlabel('False Positive') ax.set_ylabel('True Positive') ax.set_title("Receive Operating Charateristics") ax.grid(True) plt.savefig('rocCure.png')print(np.trapz(ROC[:,1],x=ROC[:,0]))?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
總結(jié)
以上是生活随笔為你收集整理的ROC 曲线讲解 (Receiver Operarating Curve)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maya 2015 官方资料学习记录
- 下一篇: [GKCTF2020]web后边两道题(