使用python+sklearn實現具有交叉驗證的ROC

2022-01-01 機器學習算法與知識圖譜

收錄於話題 #scikit-learn學習路線 298個

本文是一個使用交叉驗證來評估分類器性能的ROC度量指標的示例。ROC曲線通常在Y軸上具有true positive率,在X軸上具有false positive率,這意味著圖的左上角是「理想」點-false positive率為零,而true positive率為1,雖然這不是很現實,但這確實意味著曲線下擁有較大區域(AUC)的模型的性能通常更好。

ROC曲線的「陡度」也很重要,因為我們想要最大程度地提高true positive率,同時最小化false positive率。

本示例顯示了通過K-fold交叉驗證在不同數據集上的ROC響應。對於所有的這些曲線,可以計算出曲線下的平均面積,並且在訓練集分為不同子集時,查看曲線的方差。這顯示了分類器的輸出如何受到訓練數據變化的影響,以及通過K-fold交叉驗證生成的子集之間的差異。

注意:

另請參閱sklearn.metrics.roc_auc_score,sklearn.model_selection.cross_val_score,接收器工作特性(ROC),

sphx_glr_plot_roc_crossval_001

輸出:

/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
/home/circleci/project/examples/model_selection/plot_roc_crossval.py:75: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead
  interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)

print(__doc__)

import numpy as np
from scipy import interp
import matplotlib.pyplot as plt

from sklearn import svm, datasets
from sklearn.metrics import auc
from sklearn.metrics import plot_roc_curve
from sklearn.model_selection import StratifiedKFold

# #############################################################################
# 數據IO和生成

# 導入一些數據進行訓練
iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2]
n_samples, n_features = X.shape

# 添加噪聲特徵
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# #############################################################################
# 分類和ROC分析

# 使用交叉驗證運行分類器並繪製ROC曲線
cv = StratifiedKFold(n_splits=6)
classifier = svm.SVC(kernel='linear', probability=True,
                     random_state=random_state)

tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)

fig, ax = plt.subplots()
for i, (train, test) in enumerate(cv.split(X, y)):
    classifier.fit(X[train], y[train])
    viz = plot_roc_curve(classifier, X[test], y[test],
                         name='ROC fold {}'.format(i),
                         alpha=0.3, lw=1, ax=ax)
    interp_tpr = interp(mean_fpr, viz.fpr, viz.tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(viz.roc_auc)

ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',
        label='Chance', alpha=.8)

mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(mean_fpr, mean_tpr, color='b',
        label=r'Mean ROC (AUC = %0.2f $\pm$ %0.2f)' % (mean_auc, std_auc),
        lw=2, alpha=.8)

std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
ax.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,
                label=r'$\pm$ 1 std. dev.')

ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],
       title="Receiver operating characteristic example")
ax.legend(loc="lower right")
plt.show()

腳本的總運行時間:(0分鐘0.674秒)

估計的內存使用量: 8 MB

下載Python原始碼: plot_roc_crossval.py

下載Jupyter notebook原始碼: plot_roc_crossval.ipynb

由Sphinx-Gallery生成的畫廊

☆☆☆為方便大家查閱,小編已將scikit-learn學習路線專欄文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,在上方向下「系列文章」,如下:(添加微信:mthler,備註:sklearn學習,一起進入【sklearn機器學習進步群】開啟打怪升級的學習之旅。

相關焦點

  • 使用python+sklearn實現交叉驗證
    本文給出了模型訓練中典型的交叉驗證流程圖(flowchart)。網格搜索(grid search)技術可以確定最佳參數。在scikit-learn中,可以使用train_test_split函數快速將數據集隨機分成訓練集和測試集。
  • 使用python+sklearn實現Lasso 模型選擇:交叉驗證/ AIC / BIC
    使用Akaike信息標準(AIC),貝葉斯信息標準(BIC)和交叉驗證來選擇Lasso
  • 使用python+sklearn實現度量和評分
    如果損失(loss),則評分器對象對python函數的輸出取負號,這符合交叉驗證約定,即評分器返回越高的值預測越好。如果你要定義的是一個分類評分度量(metrics),還要確認您的python函數是否具有連續的決策確定性(decision certainties) (needs_threshold=True)。默認值為False。任意的附加參數,例如f1_score函數中的beta或labels。
  • 使用python+sklearn實現通過交叉驗證來消除遞歸特徵
  • 使用python+sklearn實現估計器的調參方法
    調參即為搜索超參數空間以獲得最佳的交叉驗證(cross validation)分數。構造估計器時提供的任何參數都可以以這種方式來優化。具體來說,要查找給定估計器的所有參數的名稱和當前值,請使用:估計器(回歸器或分類器,如sklearn.svm.SVC());一些模型允許使用專門的、有效的參數搜索策略,如下所述。
  • 機器學習-Cross Validation交叉驗證Python實現
    k-fold cross-validationk折交叉驗證,初始採樣分割成k個子樣本,一個單獨的子樣本被保留作為驗證模型的數據,其他k-1個樣本用來訓練。交叉驗證重複k次,每個子樣本驗證一次,平均k次的結果或者使用其它結合方式,最終得到一個單一估測。
  • ROC評價指標最全攻略及Python實現
    在上一篇原創文章FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)評價指標詳述中,詳細的介紹了FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)評價指標的概念和採用python的實現方式。與上述評價指標還有一個孿生兄弟,就是ROC曲線和AUC值。
  • 多分類結局的ROC分析
    好奇的小編查閱了大量的資料後,發現通過python的sklearn包提供的micro-average (micro法) 和macro-average (macro法) 可以進行多分類結局的ROC分析。假設有待進行ROC分析的數據樣本量為m,結局的分類數為n,由此可以獲得一個[m, n]的結局矩陣L,矩陣L中為0/1的數值。
  • 決戰紫禁之巔 | sklearn參數介紹及使用
    ,超參數的定義和用法,以一個簡單的實戰內容實現決策樹的分類和回歸實現。決策樹模型既可以做分類,又可以做回歸,在sklearn中,分類決策樹和回歸決策樹模型是分開使用的,分別是:兩個模型的超參數大部分都相同,雖然超參一樣,但是有些意義是不相同的,比如特徵選擇標準。下面通過sklearn的分類決策樹模型的實踐操作來了解各個參數的含義和使用方法。數據採用對Taitanic清洗加工過後的乾淨數據集。由於特徵工程已經做好,這裡忽略。
  • 使用python+sklearn實現RBF SVM參數選擇
    本示例展示了帶有徑向基函數(RBF)核的支持向量機的gamma和C參數不同取值的影響。當gamma的取值非常小時,模型受到約束太大,無法捕捉數據的複雜性或「形狀」。任何選定的支持向量的影響區域將包括整個訓練集。得到的模型將類似於具有一組超平面的線性模型,這些超平面將任意一對兩類的高密度中心分離開來。對於gamma的取值中等時,我們可以在第二張圖中看到,在C和gamma的取值的對角線上可以找到好的模型。
  • Python sklearn模型選擇
    概率校準28.sklearn.cross_decomposition: Cross decomposition 交叉求解29.sklearn.pipeline: Pipeline 管道30.sklearn.preprocessing: Preprocessing and Normalization 預處理和標準化31.sklearn.random_projection
  • 運維丨Python中ROC曲線繪製
    首先以支持向量機模型為例先導入需要使用的包,我們將使用roc_curve這個函數繪製ROC曲線!
  • 你以為sklearn只會邏輯回歸
    Sklearn 提供好幾個練習的數據集,供在練習的時候可以使用, 其實與其說是練習,大部分時候都是在調試代碼的時候,試運行一下的,這部分數據都相對乾淨,如果sklearn中的dataset的數據,你的代碼跑了都報錯,那麼你自己的數據肯定也是報錯的。
  • 深度學習多種模型評估指標介紹 - 附sklearn實現
    1、準確率accuracy預測正確的樣本數/總樣本數,但accuracy對於樣本數據不均衡的問題來說不具有說服力,當樣本不均衡時,準確率即是很高也不代表分類器效果好
  • sklearn實現數據集劃分
    註:sklearn的函數包實在太多,有紕漏的地方還望指正sklearn實現留出法的主要有兩個包:ShuffleSplit和train_test_split。如果要進行若干次隨機劃分,那麼要使用train_test_split若干次,每次設置不同的random_state即可。也可以通過ShuffleSplit實現。ShuffleSplit分兩部分組成,第一部分Shuffle,是指對數據集進行隨機打亂;第二部分Split,就是切分的意思。也就是對數據集打亂並且切分。
  • 機器學習乾貨|交叉驗證(Cross Validation)詳解
    一般來說,簡單交叉驗證並非一種交叉驗證,因為數據並沒有交叉使用。隨機從最初的樣本中選出部分,形成交叉驗證數據,而剩餘的就當作訓練數據。 一般來說,少於原本樣本三分之一的數據被選做驗證數據。優點:好處的處理簡單,只需隨機把原始數據分為兩組即可!
  • Sklearn介紹
    這裡的設計,僅僅是為了供sklearn中的pipeline等API調用時,傳入該對象時,各API的方法能夠保持一致性,方便使用pipeline。在一種叫k-fold CV的簡單交叉驗證方法中,訓練集被分割成k個小集(其他方法將在下文中描述,但一般遵循相同的原則)。
  • 數據集的劃分——交叉驗證法
    在實際應用中,我們只進行一次交叉驗證可能是不夠的,而要進行多次,稱為p次k折交叉驗證,一般取p=k=10。以上方法在sklearn中都有相應的類來實現,我們下面來看一下。2程序實現       我們這裡依然使用的是鳶尾花的數據,同時使用Logistic回歸訓練模型。
  • ROC-AUC 與 PR-AUC 的區別與聯繫
    本文筆者將從ROC-AUC 與 PR-AUC 的區別與聯繫、使用場景和python計算進行了介紹。綠色實現代表了某個我們訓練的這是模型,其 ROC-AUC 值介於 0-1 之間。PR-AUC 的構造和上述過程基本一致,只是需要再計算出 Precision 和 Recall。PR 曲線可能如下圖所示:
  • 10分鐘用python進行人工智慧建立預測模型
    · 估算分類變量的缺失值:創建一個新級別來歸類分類變量,以便將所有缺失值編碼為單個值,例如"New_Cat",或者您可以查看頻率組合併使用具有更高頻率的值來估算缺失值。使用這種簡單的數據處理方法,您可以將處理數據的時間縮短到3-4分鐘。階段3.