<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何以及何時使用 ROC 曲線和精確調用曲線進行 Python 分類 > 原文: [https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/](https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/) 可以更靈活地預測屬于分類問題中每個類的觀察的概率,而不是直接預測類。 這種靈活性來自于可以使用不同閾值來解釋概率的方式,該閾值允許模型的操作者在模型所做的錯誤中權衡關注,例如與假陰性的數量相比的假陽性的數量。當使用一個錯誤的成本超過其他類型錯誤的成本的模型時,這是必需的。 有助于解釋二元(兩類)分類預測建模問題的概率預測的兩種診斷工具是 ROC 曲線和精確回憶曲線。 在本教程中,您將發現 ROC 曲線,精確回憶曲線以及何時使用每個曲線來解釋二元分類問題的概率預測。 完成本教程后,您將了解: * ROC 曲線總結了使用不同概率閾值的預測模型的真陽性率和假陽性率之間的權衡。 * 精確回憶曲線總結了使用不同概率閾值的預測模型的真陽性率和陽性預測值之間的權衡。 * 當觀察值在每個類別之間平衡時,ROC 曲線是合適的,而精確回憶曲線適用于不平衡的數據集。 讓我們開始吧。 * **更新 Aug / 2018** :修正了精確召回圖的無技能線表示中的錯誤。還修正了錯誤,我將 ROC 稱為[相對](https://news.ycombinator.com/item?id=17883130)而不是接收器(感謝拼寫檢查)。 * **更新 Nov / 2018** :修正了關于解釋每個軸上的值大小的描述,感謝 Karl Humphries。 ![How and When to Use ROC Curves and Precision-Recall Curves for Classification in Python](https://img.kancloud.cn/bc/0b/bc0b967c40398f19ecce9d34957dd106_640x360.jpg) 如何以及何時使用 ROC 曲線和精確回憶曲線進行分類 照片由 [Giuseppe Milo](https://www.flickr.com/photos/giuseppemilo/35000793430/) 拍攝,保留一些權利。 ## 教程概述 本教程分為 6 個部分;他們是: 1. 預測概率 2. 什么是 ROC 曲線? 3. Python 中的 ROC 曲線和 AUC 4. 什么是精確回憶曲線? 5. Python 中的精確調用曲線和 AUC 6. 何時使用 ROC 與精確回憶曲線? ## 預測概率 在分類問題中,我們可能決定直接預測類值。 或者,可以更靈活地預測每個類的概率。其原因是提供選擇甚至校準如何解釋預測概率的閾值的能力。 例如,默認值可能是使用 0.5 的閾值,這意味著[0.0,0.49]中的概率是負結果(0),[0.5,1.0]中的概率是正結果(1)。 可以調整此閾值以針對特定問題調整模型的行為。一個例子是減少一種或另一種類型的錯誤。 在對二進制或兩類分類問題進行預測時,我們可以做出兩種類型的錯誤。 * **誤報**。預測沒有事件時的事件。 * **假陰性**。實際上有一個事件,預測沒有事件。 通過預測概率和校準閾值,可以由模型的操作者選擇這兩個問題的平衡。 例如,在煙霧預測系統中,我們可能更關心低假陰性而不是低假陽性。假陰性意味著不會警告霧霾日,事實上它是一個高霧日,導致公眾健康問題無法采取預防措施。誤報意味著公眾會在不需要時采取預防措施。 比較預測兩類問題概率的模型的常用方法是使用 ROC 曲線。 ## 什么是 ROC 曲線? 預測二元結果概率時的一個有用工具是[接收器工作特性曲線](https://en.wikipedia.org/wiki/Receiver_operating_characteristic)或 ROC 曲線。 它是假陽性率(x 軸)對真實陽性率(y 軸)的曲線圖,其中許多不同的候選閾值在 0.0 和 1.0 之間。換句話說,它描繪了誤報率與命中率的關系。 真陽性率計算為真陽性數除以真陽性數和假陰性數之和。它描述了當實際結果為正時,模型在預測正類時有多好。 ``` True Positive Rate = True Positives / (True Positives + False Negatives) ``` 真陽性率也稱為敏感性。 ``` Sensitivity = True Positives / (True Positives + False Negatives) ``` 假陽性率計算為假陽性的數量除以假陽性的數量和真陰性的數量之和。 它也被稱為誤報率,因為它總結了當實際結果為負時預測正類的頻率。 ``` False Positive Rate = False Positives / (False Positives + True Negatives) ``` 假陽性率也稱為反轉特異性,其中特異性是真陰性的總數除以真陰性和假陽性的總和。 ``` Specificity = True Negatives / (True Negatives + False Positives) ``` 哪里: ``` False Positive Rate = 1 - Specificity ``` ROC 曲線是一個有用的工具,原因如下: * 不同模型的曲線可以直接比較或針對不同的閾值進行比較。 * 曲線下面積(AUC)可用作模型技能的摘要。 曲線的形狀包含大量信息,包括我們可能最關心的問題,預期的假陽性率和假陰性率。 為了明確這一點: * 圖的 x 軸上的較小值表示較低的假陽性和較高的真陰性。 * 圖的 y 軸上的較大值表示較高的真陽性和較低的假陰性。 如果您感到困惑,請記住,當我們預測二元結果時,它是正確的預測(真陽性)或不是(假陽性)。這些選擇之間存在緊張關系,同樣存在真正的消極和誤報。 熟練的模型將為隨機選擇的實際正面事件分配比平均負面事件更高的概率。當我們說模型具有技巧時,這就是我們的意思。通常,熟練的模型由曲線向左上方的曲線表示。 沒有技能的模型在[0.5,0.5]處表示。在每個閾值處沒有技能的模型由從圖的左下角到右上角的對角線表示,并且具有 0.5 的 AUC。 具有完美技能的模型表示為[0.0,1.0]點。具有完美技能的模型由從繪圖的左下角到左上角然后跨越頂部到右上角的線表示。 操作員可以繪制最終模型的 ROC 曲線,并選擇在假陽性和假陰性之間給出理想平衡的閾值。 ## Python 中的 ROC 曲線和 AUC 我們可以使用 _roc_curve()_ scikit-learn 函數在 Python 中繪制模型的 ROC 曲線。 該函數獲取測試集的真實結果(0,1)和 1 類的預測概率。該函數返回每個閾值的誤報率,每個閾值的真正正率和閾值。 ``` # calculate roc curve fpr, tpr, thresholds = roc_curve(y, probs) ``` 可以使用 _roc_auc_score()_ 函數計算 ROC 的 AUC。 與 _roc_curve()_ 函數一樣,AUC 函數同時獲取測試集中的真實結果(0,1)和 1 類的預測概率。它返回的 AUC 分數在 0.0 和 1.0 之間,分別對于沒有技能和完美技能。 ``` # calculate AUC auc = roc_auc_score(y, probs) print('AUC: %.3f' % auc) ``` 下面列出了計算小測試問題的邏輯回歸模型的 ROC 曲線和 AUC 的完整示例。 ``` # roc curve and auc from sklearn.datasets import make_classification from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve from sklearn.metrics import roc_auc_score from matplotlib import pyplot # generate 2 class dataset X, y = make_classification(n_samples=1000, n_classes=2, weights=[1,1], random_state=1) # split into train/test sets trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2) # fit a model model = KNeighborsClassifier(n_neighbors=3) model.fit(trainX, trainy) # predict probabilities probs = model.predict_proba(testX) # keep probabilities for the positive outcome only probs = probs[:, 1] # calculate AUC auc = roc_auc_score(testy, probs) print('AUC: %.3f' % auc) # calculate roc curve fpr, tpr, thresholds = roc_curve(testy, probs) # plot no skill pyplot.plot([0, 1], [0, 1], linestyle='--') # plot the roc curve for the model pyplot.plot(fpr, tpr, marker='.') # show the plot pyplot.show() ``` 運行該示例將打印 ROC 曲線下的區域。 ``` AUC: 0.895 ``` 還創建了模型的 ROC 曲線圖,表明模型具有技能。 ![Line Plot of ROC Curve](https://img.kancloud.cn/58/be/58bed9219733cca2e18db867fb3ed072_1280x960.jpg) ROC 曲線的線圖 ## 什么是精確回憶曲線? 有許多方法可以評估預測模型的技能。 [信息檢索](https://en.wikipedia.org/wiki/Information_retrieval)(基于查詢查找文檔)的相關領域中的方法測量[精度和召回](https://en.wikipedia.org/wiki/Precision_and_recall)。 這些度量在用于評估二元分類模型的應用機器學習中也是有用的。 精確度是真陽性數除以真陽性和假陽性之和的比率。它描述了模型在預測積極階級方面有多好。精度被稱為陽性預測值。 ``` Positive Predictive Power = True Positives / (True Positives + False Positives) ``` 要么 ``` Precision = True Positives / (True Positives + False Positives) ``` 召回計算為真陽性數除以真陽性和假陰性之和的比率。召回與敏感度相同。 ``` Recall = True Positives / (True Positives + False Negatives) ``` or ``` Sensitivity = True Positives / (True Positives + False Negatives) ``` ``` Recall == Sensitivity ``` 在兩個類別之間的觀察不平衡的情況下,檢查精度和召回都很有用。具體來說,有許多沒有事件的例子(0 級)和只有一些事件的例子(1 級)。 其原因在于,通常大量的 0 級示例意味著我們對正確預測 0 級的模型技能不太感興趣,例如高真陰性。 計算精度和召回的關鍵是計算不使用真正的否定。它只關注少數民族階級 1 的正確預測。 精確回憶曲線是不同閾值的精度(y 軸)和回憶(x 軸)的圖,非常類似于 ROC 曲線。 無技能線由陽性病例總數除以陽性和陰性病例總數來定義。對于具有相同數量的正面和負面情況的數據集,這是 0.5 的直線。此線以上的點顯示技巧。 具有完美技能的模型被描繪為[1.0,1.0]處的點。一個熟練的模型用一條曲線表示,該曲線比無技能的扁平線高出[1.0,1.0]。 還有綜合分數,試圖總結精確度和召回率;三個例子包括: * **F 得分**或 [F1 得分](https://en.wikipedia.org/wiki/F1_score):計算精度和召回的調和平均值(調和平均值,因為精度和召回率是比率)。 * **平均精度**:總結了精確召回曲線中閾值的每次調用變化的加權精度增加。 * **曲線下面積**:與 AUC 一樣,總結了精確回憶曲線下面積的積分或近似值。 在模型選擇方面,F1 總結了特定概率閾值的模型技能,而平均精度和曲線下面積總結了模型跨越閾值的技能,如 ROC AUC。 這使得精確回憶和精確度與召回和匯總測量的圖表成為二元分類問題的有用工具,這些問題在每個類別的觀察中具有不平衡。 ## Python 中的 Precision-Recall 曲線 可以通過 _precision_score()_ 和 _recall_score()_ 函數以 scikit-learn 計算精度和召回率。 可以使用 _precision_recall_curve()_ 函數計算閾值的精度和調用,該函數將真實輸出值和正類的概率作為輸出,并返回精度,調用和閾值。 ``` # calculate precision-recall curve precision, recall, thresholds = precision_recall_curve(testy, probs) ``` 可以通過調用 _f1_score()_ 函數來計算 F1 得分,該函數將真實的類值和預測的類值作為參數。 ``` # calculate F1 score f1 = f1_score(testy, yhat) ``` 精確調用曲線下的面積可以通過調用 _auc()_ 函數并將其傳遞給每個閾值計算的調用和精度值來近似。 ``` # calculate precision-recall AUC auc = auc(recall, precision) ``` 最后,可以通過調用 _average_precision_score()_ 函數并將其傳遞給真實的類值和預測的類值來計算平均精度。 下面列出了完整的示例。 ``` # precision-recall curve and f1 from sklearn.datasets import make_classification from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import precision_recall_curve from sklearn.metrics import f1_score from sklearn.metrics import auc from sklearn.metrics import average_precision_score from matplotlib import pyplot # generate 2 class dataset X, y = make_classification(n_samples=1000, n_classes=2, weights=[1,1], random_state=1) # split into train/test sets trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2) # fit a model model = KNeighborsClassifier(n_neighbors=3) model.fit(trainX, trainy) # predict probabilities probs = model.predict_proba(testX) # keep probabilities for the positive outcome only probs = probs[:, 1] # predict class values yhat = model.predict(testX) # calculate precision-recall curve precision, recall, thresholds = precision_recall_curve(testy, probs) # calculate F1 score f1 = f1_score(testy, yhat) # calculate precision-recall AUC auc = auc(recall, precision) # calculate average precision score ap = average_precision_score(testy, probs) print('f1=%.3f auc=%.3f ap=%.3f' % (f1, auc, ap)) # plot no skill pyplot.plot([0, 1], [0.5, 0.5], linestyle='--') # plot the precision-recall curve for the model pyplot.plot(recall, precision, marker='.') # show the plot pyplot.show() ``` 首先運行該示例打印 F1,曲線下面積(AUC)和平均精度(AP)分數。 ``` f1=0.836 auc=0.892 ap=0.840 ``` 然后創建精確回憶曲線圖,顯示與無技能模型相比的每個閾值的精度/召回率。 ![Line Plot of Precision-Recall Curve](https://img.kancloud.cn/ca/9a/ca9a0867f4cceb5da2bb21e5b4837699_1280x960.jpg) 精確回憶曲線的線圖 ## 何時使用 ROC 與精確回憶曲線? 通常,ROC 曲線和精確回憶曲線的使用如下: * 當每個類的觀察數量大致相等時,應使用 ROC 曲線。 * 當存在中等到大的不平衡時,應使用精確調用曲線。 這個建議的原因是 ROC 曲線在具有類不平衡的數據集上呈現模型的樂觀圖像。 > 但是,如果類分布中存在較大的偏差,則 ROC 曲線可能會對算法的表現提供過于樂觀的視圖。 [...]精確回憶(PR)曲線(通常用于信息檢索)被引用作為類別分布中具有大偏差的任務的 ROC 曲線的替代。 - [精確回憶與 ROC 曲線之間的關系](https://dl.acm.org/citation.cfm?id=1143874),2006。 有些人進一步指出,使用帶有不平衡數據集的 ROC 曲線可能具有欺騙性,并導致對模型技能的錯誤解釋。 > [...]由于對特異性的直觀但錯誤的解釋,在不平衡數據集的背景下 ROC 圖的視覺可解釋性對于關于分類表現可靠性的結論可能具有欺騙性。另一方面,[精確回憶曲線]圖可以為觀察者提供對未來分類表現的準確預測,因為他們評估了正面預測中真陽性的分數。 - [精確回憶圖在評估不平衡數據集上的二元分類器時比 ROC 圖更具信息性](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/),2015。 這種樂觀情況的主要原因是由于在 ROC 曲線中使用了假陽性率并且在精確回憶曲線中小心避免了這種速率。 > 如果測試集中正負實例的比例發生變化,則 ROC 曲線不會改變。精度,精度,升力和 F 分數等指標使用混淆矩陣的兩列值。隨著階級分布的變化,即使基本分類器表現不變,這些度量也會發生變化。 ROC 圖基于 TP 速率和 FP 速率,其中每個維度是嚴格的柱狀比率,因此不依賴于類別分布。 - [ROC 圖:數據挖掘研究人員的注釋和實際考慮因素](http://www.blogspot.udec.ugto.saedsayad.com/docs/ROC101.pdf),2003。 我們可以用一個簡短的例子來具體化。 下面是具有修改問題的相同 ROC 曲線示例,其中 class = 0 與 class = 1 觀察值之比為 10:1。 ``` # roc curve and auc on imbalanced dataset from sklearn.datasets import make_classification from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve from sklearn.metrics import roc_auc_score from matplotlib import pyplot # generate 2 class dataset X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.9,0.09], random_state=1) # split into train/test sets trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2) # fit a model model = KNeighborsClassifier(n_neighbors=3) model.fit(trainX, trainy) # predict probabilities probs = model.predict_proba(testX) # keep probabilities for the positive outcome only probs = probs[:, 1] # calculate AUC auc = roc_auc_score(testy, probs) print('AUC: %.3f' % auc) # calculate roc curve fpr, tpr, thresholds = roc_curve(testy, probs) # plot no skill pyplot.plot([0, 1], [0, 1], linestyle='--') # plot the precision-recall curve for the model pyplot.plot(fpr, tpr, marker='.') # show the plot pyplot.show() ``` 運行該示例表明該模型具有技能。 ``` AUC: 0.713 ``` 事實上,它具有技巧,但大部分技能被衡量為做出正確的假陰性預測,并且有很多假陰性預測要做。 ROC 曲線圖確認了 AUC 對大多數概率閾值的熟練模型的解釋。 ![Line Plot of ROC Curve Imbalanced Dataset](https://img.kancloud.cn/e9/a5/e9a509e1c7ab0c50fc12d88ac84b656a_1280x960.jpg) ROC 曲線不平衡數據集的線圖 我們還可以在同一數據集上重復對同一模型的測試,并計算精確回憶曲線和統計數據。 The complete example is listed below. ``` # precision-recall curve and auc from sklearn.datasets import make_classification from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import precision_recall_curve from sklearn.metrics import f1_score from sklearn.metrics import auc from sklearn.metrics import average_precision_score from matplotlib import pyplot # generate 2 class dataset X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.9,0.09], random_state=1) # split into train/test sets trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2) # fit a model model = KNeighborsClassifier(n_neighbors=3) model.fit(trainX, trainy) # predict probabilities probs = model.predict_proba(testX) # keep probabilities for the positive outcome only probs = probs[:, 1] # predict class values yhat = model.predict(testX) # calculate precision-recall curve precision, recall, thresholds = precision_recall_curve(testy, probs) # calculate F1 score f1 = f1_score(testy, yhat) # calculate precision-recall AUC auc = auc(recall, precision) # calculate average precision score ap = average_precision_score(testy, probs) print('f1=%.3f auc=%.3f ap=%.3f' % (f1, auc, ap)) # plot no skill pyplot.plot([0, 1], [0.1, 0.1], linestyle='--') # plot the precision-recall curve for the model pyplot.plot(recall, precision, marker='.') # show the plot pyplot.show() ``` 首先運行該示例打印 F1,AUC 和 AP 分數。 鑒于熟練的模型通常高于 0.5,分數看起來并不令人鼓舞。 ``` f1=0.278 auc=0.302 ap=0.236 ``` 從情節來看,我們可以看到精確度和召回后快速崩潰。 ![Line Plot of Precision-Recall Curve Imbalanced Dataset](https://img.kancloud.cn/45/1a/451a9cee681458bc76e5f5f55f638d8f_1280x960.jpg) 精確回憶曲線不平衡數據集的線圖 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 ### 文件 * [作為檢索系統表現測量的召回和精確度的重要調查](https://dl.acm.org/citation.cfm?id=65945),1989。 * [精確回憶與 ROC 曲線之間的關系](https://dl.acm.org/citation.cfm?id=1143874),2006。 * [精確回憶圖在評估不平衡數據集上的二元分類器時比 ROC 圖更具信息性](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/),2015。 * [ROC 圖:數據挖掘研究人員的注釋和實際考慮因素](http://www.blogspot.udec.ugto.saedsayad.com/docs/ROC101.pdf),2003 年。 ### API * [sklearn.metrics.roc_curve API](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html) * [sklearn.metrics.roc_auc_score API](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html) * [sklearn.metrics.precision_recall_curve API](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html) * [sklearn.metrics.auc API](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html) * [sklearn.metrics.average_precision_score API](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html) * [Precision-Recall,scikit-learn](http://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html) * [精確,召回和 F 測量,scikit-learn](http://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics) ### 用品 * 維基百科上的[接收器操作特性](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) * [維基百科](https://en.wikipedia.org/wiki/Sensitivity_and_specificity)的敏感性和特異性 * [維基百科上的精確和召回](https://en.wikipedia.org/wiki/Precision_and_recall) * [維基百科上的信息檢索](https://en.wikipedia.org/wiki/Information_retrieval) * 維基百科上的 [F1 得分](https://en.wikipedia.org/wiki/F1_score) * [ROC 和精確召回與不平衡數據集](https://classeval.wordpress.com/simulation-analysis/roc-and-precision-recall-with-imbalanced-datasets/),博客。 ### 摘要 在本教程中,您發現了 ROC 曲線,精確回憶曲線,以及何時使用每個曲線來解釋二元分類問題的概率預測。 具體來說,你學到了: * ROC 曲線總結了使用不同概率閾值的預測模型的真陽性率和假陽性率之間的權衡。 * 精確回憶曲線總結了使用不同概率閾值的預測模型的真陽性率和陽性預測值之間的權衡。 * 當觀察值在每個類別之間平衡時,ROC 曲線是合適的,而精確回憶曲線適用于不平衡的數據集。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看