受試者工做特徵曲線(receiver operating characteristic curve,簡稱ROC曲線),是比較兩個分類模型好壞的可視化工具 html
ROC曲線的做用:算法
1.較容易地查出任意界限值時的對類別的識別能力dom
2.選擇最佳的診斷界限值。ROC曲線越靠近左上角,試驗的準確性就越高。最靠近左上角的ROC曲線的點是錯誤最少的最好閾值,其假陽性和假陰性的總數最少。函數
3.兩種或兩種以上不一樣診斷試驗對算法性能的比較。在對同一種算法的兩種或兩種以上診斷方法進行比較時,可將各試驗的ROC曲線繪製到同一座標中,以直觀地鑑別優劣,靠近左上角的ROC曲線所表明的受試者工做最準確。亦可經過分別計算各個試驗的ROC曲線下的面積(AUC)進行比較,哪種試驗的AUC最大,則哪種試驗的診斷價值最佳。工具
集才華與美麗於一身的ROC曲線究竟是什麼?性能
ROC曲線是根據一系列不一樣的二分類方式(分界值或決定閾),以真陽性率TPR(靈敏度)爲縱座標,假陽性率FPR(1-特異度)爲橫座標繪製的曲線。測試
那麼TPR和FPR都是什麼意思?先看下混淆矩陣spa
這樣能夠一目瞭然的看出正確分類和錯誤分類的樣本數量,因此.net
準確率precision=(TP+TN)/(P+N)code
可是在實際應用中,咱們感興趣的類每每只佔少數,因此在test集存在類不平衡的狀況下,準確率對於咱們的模型意義很小,eg:test中續費90,流失10,即便你把全部的樣本預測爲續費,準確率依然爲90%,但對於咱們感興趣的流失用戶而言,這個模型沒有什麼意義
因此,現實中咱們更在意的實際上是召回率,即靈敏度,固然咱們通常關注較高的是咱們感興趣類的召回率
recall =TP/(TP+FN)=TP/P
F度量則對準確率和召回率作一個權衡
F=(1+a2)*precision*recall/(a*precision+recall)
a2是a的平方,通常默認a= 1
說了這麼多看似跟ROC沒有相關的概念,但其實理解了上面的公式才能更好的理解ROC的做用,這裏是美麗的分割線,下面是優美的ROC曲線
定義:
TPR = TP/P 即召回率公式
FPR = FP/N 即1-specificity
ROC曲線是以FPR爲橫座標,以TPR爲縱座標,以機率爲閾值來度量模型正確識別正實例的比例與模型錯誤的把負實例識別成正實例的比例之間的權衡,TPR的增長一定以FPR的增長爲代價,ROC曲線下方的面積是模型準確率的度量
因此根據ROC曲線定義可知,繪製ROC要求模型必須能返回監測元組的類預測機率,根據機率對元組排序和定秩,並使正機率較大的在頂部,負機率較大的在底部進行畫圖
ROC曲線
隨機猜想的曲線是默認正負都按照0.5機率平均分類時的ROC曲線,那麼離隨機猜想曲線較遠的點就是最好的機率選擇閾值,該圖中的凸包旁邊點對應的機率就是咱們所要選擇的機率,即根據ROC凸點選擇機率閾值和根據凸點判斷兩個模型好壞的由來。
在分類模型中,ROC曲線和AUC值常常做爲衡量一個模型擬合程度的指標
sklearn上有一個畫ROC曲線的例子,利用的是經典的鳶尾花(iris)數據。但鳶尾花數據分類的結果有三種,例子就直接來作圖(通常的分類任務明明只有兩種結果啊!!!),對於初學者來講(說的是我本身)看起來真的彆扭。所以我對該例子作了一些改動(簡化),將數據轉化爲二分類,這樣比較容易理解。
首先爲你們介紹一下Python作ROC曲線的原理。sklearn.metrics有roc_curve, auc兩個函數,ROC曲線上的點主要就是經過這兩個函數計算出來的。
(1.)
fpr, tpr, thresholds = roc_curve(y_test, scores)
其中y_test爲測試集的結果,scores爲模型預測的測試集得分(注意:經過decision_function(x_test)計算scores的值);fpr,tpr,thresholds 分別爲假正率、真正率和閾值。(應該是不一樣閾值下的真正率和假正率)。
(2.)
roc_auc =auc(fpr, tpr)
roc_auc爲計算的acu的值。
本身編寫代碼以下:
# -*- coding: utf-8 -*- import matplotlib.pyplot as plt from sklearn import svm from sklearn.metrics import roc_curve, auc ###計算roc和auc train_x = [[0.], [1.], [1.], [0.], [1.]] train_y = [0., 1., 1., 0., 1.] test_x = [[1.], [1.], [0.], [1.], [0.]] test_y = [1., 1., 0., 1., 0.] # Learn to predict each class against the other svm = svm.SVC(kernel='linear', probability=True) ###經過decision_function()計算獲得的y_score的值,用在roc_curve()函數中 model = svm.fit(train_x, train_y) test_y_score = model.decision_function(test_x) prediction = model.predict(test_x) print(test_y_score) print(prediction) # Compute ROC curve and ROC area for each class fpr, tpr, threshold = roc_curve(test_y, test_y_score) ###計算真正率和假正率 roc_auc = auc(fpr, tpr) ###計算auc的值 lw = 2 plt.figure(figsize=(8, 5)) plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % 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()
展現以下:
官網示例代碼:
# -*- coding: utf-8 -*- """ Created on Thu Sep 21 16:13:04 2017 @author: lizhen """ import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets from sklearn.metrics import roc_curve, auc ###計算roc和auc from sklearn import cross_validation # Import some data to play with iris = datasets.load_iris() X = iris.data y = iris.target ##變爲2分類 X, y = X[y != 2], y[y != 2] # Add noisy features to make the problem harder random_state = np.random.RandomState(0) n_samples, n_features = X.shape X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] # shuffle and split training and test sets X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.3,random_state=0) # Learn to predict each class against the other svm = svm.SVC(kernel='linear', probability=True,random_state=random_state) ###經過decision_function()計算獲得的y_score的值,用在roc_curve()函數中 y_score = svm.fit(X_train, y_train).decision_function(X_test) # Compute ROC curve and ROC area for each class fpr,tpr,threshold = roc_curve(y_test, y_score) ###計算真正率和假正率 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.2f)' % 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()
參考博文:
http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html
http://blog.csdn.net/u010454729/article/details/45098305