机器学习第十篇:如何评价模型效果评估
前言
前面的推文中介紹了幾種常用的機器學習算法,每個算法都有各自的優劣勢,我們應該選擇根據每個算法的優劣勢去合理的選擇適合我們需求的算法,以此達到效果最優,那么什么樣的效果才是最優的,用什么來衡量這個效果。這一篇就針對機器學習算法的效果評估指標進行介紹。
準確率
精確率
召回率
F1-score
交叉報告
混淆矩陣
ROC/AUC
在介紹具體每個指標的概念以前,我們先看一個故事:
一位女神被安排了10位男性相親對象,目前只有這10位男性的照片,女神需要根據照片情況來判斷要不要去見面,其中影響見與不見的一個重要指標就是這位男性是否是土豪,該女神就通過每位男性的照片(具體一點就是通過男性穿的什么牌子的衣服、鞋、皮帶,戴的什么眼鏡、手表哈)來判斷哪位是土豪。表中的結果就是女神判斷的結果和實際情況對應表。女神的眼力怎么樣呢(把女神的眼力當作一個算法看待)?先看一下下圖這張表:
| 被判斷為土豪 | 5人 | 2人 |
| 被判斷為非土豪 | 2人 | 1人 |
這張表表示,這10位男士中有7位是真正的土豪,在這7位土豪中有5位被判別出來了,有2位被誤判為非土豪(可能穿著比較低調,被誤判了哈哈哈);有3位男士是非土豪,在這3位中有2位被誤判為土豪(穿著打扮能力很強),只有1位非土豪被判斷成非土豪。
這是上面圖表直觀上傳達的意思,我們接下來用不同的量化指標去評判女神的判斷效果,并用sklearn庫實現。
準確率
準確率(accuracy)是指所有被正確劃分類別(實際是土豪被判斷為土豪人數+實際是非土豪被判斷為非土豪的人數)的人數占總人數(所有被判斷對象)的比值(5+1)/10=0.6。
#導入sklearn庫 from sklearn.metrics import accuracy_score #打印出準確率 print(accuracy_score(y_true,y_pred) #打印出分類正確的個數 print(accuracy_score(y_true,y_pred,normalize=False))精確率
在說精確率(precision)以前,我們需要重申一下女神做判斷的目的,就是找出真正的土豪。精確率就是女神找出的真土豪人數(被判斷為土豪實際也是土豪的人數)占女神找出所有土豪人數(被判斷為土豪的總人數=實際是土豪+實際是非土豪)的比值5/(5+2)=0.71
#導入sklearn庫 from sklearn.metrics import precision_score #打印出精確率 print(precision_score(y_true, y_pred, average='macro'))召回率
召回率(recall)是指被找出的真土豪人數(被判斷為土豪實際也是土豪)占實際土豪總人數的比值5/(5+2)=0.71
#導入sklearn庫 from sklearn.metrics import recall_score #打印出召回率 print(recall_score(y_true, y_pred, average='macro'))F1-score
F1-score是精確率和召回率的調和平均值,之所以是調和平均是我們可以對精確率和召回率給予不同的權重,默認情況下兩者的權重是一樣的。計算公式如下:
#導入sklearn庫 from sklearn.metrics import f1_score #打印出召回率 print(f1_score(y_true, y_pred, average='macro'))交叉報告
交叉報告(classfication_report)是上面幾個指標(精確率、召回率、f1-score)的一個匯總情況。
#導入sklearn庫 from sklearn.metrics import classification_report y_true = [0, 1, 2, 2, 2] y_pred = [0, 0, 2, 2, 1] #分類標簽名 target_names = ['class 0', 'class 1', 'class 2'] #打印出交叉報告 print(classification_report(y_true, y_pred, target_names=target_names))混淆矩陣
混淆矩陣(confusion_matrix)是用矩陣的形式來表示分類情況,對角線元素表示預測標簽等于真實標簽的點的數量,是分類結果的一個絕對量,而不是比值,而非對角線元素是分類器誤標記的那些元素。混淆矩陣的對角線值越高越好,表明被正確預測的量越多。
#導入sklearn庫 from sklearn.metrics import confusion_matrix y_true = [2, 0, 2, 2, 0, 2] y_pred = [0, 0, 2, 2, 0, 2] #打印出矩陣 print(confusion_matrix(y_true, y_pred))混淆矩陣的結果也經常被用來可視化成熱力圖的形式,橫坐標表示預測的類別,縱坐標表示實際的類別,對角線依次表示實際是A、B、C類且被預測為A、B、C類的量,顏色越深表示被預測正確的量越多,效果越好。
ROC/AUC
在說ROC/AUC之前,我們先說一下分類器的輸出結果,可以是直接輸出具體的類別clf.predict()方法,也可以輸出屬于某個類別的概率clf.predict_proba()方法,對于輸出類別的方法,算法會先設定一個默認的閾值,將大于閾值的劃分為1類,小于閾值的劃分為0類;我們也可以自定義閾值的大小,且閾值是可調整的,不同調整的不同的閾值,使分類準確率達到最大,而ROC曲線就是不同閾值下對應的準確率繪制的一條曲線。ROC曲線越向上,表示模型效果越好。
繪制ROC曲線需要計算兩個值,tpr和fpr,tpr是模型在正樣本上的預測準確率,是將真土豪分為土豪的概率(被判斷為土豪的人數/實際土豪人數),即召回率;fpr是模型在負樣本上的預測準確率,表示將非土豪誤判為土豪的人數占所有實際非土豪人數的比值(1-被判斷為非土豪且實際也是非土豪人數/實際非土豪人數)。
#導入庫 from sklearn.metrics import roc_curve, auc#計算tpr,fpr,auc fpr, tpr, threshold = roc_curve(y_test, y_proba) roc_auc = auc(fpr, tpr)#plot roc_curve %matplotlib inline plt.figure() lw = 2 plt.plot(fpr, tpr, color='darkorange',lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2]) 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()ROC是一個定性指標,無法對模型效果進行量化,所以有了AUC,AUC是ROC曲線下方的面積,通常AUC值在0.5-1.0之間,值越大模型效果越好。
說說幾種指標的一個區別
準確率容易受到不平衡數據的影響,比如有在100個測試集中,有99個負樣本,1個正樣本,模型會把這100個測試集全部劃分為負樣本,得到的結果如下:
| 預測為正樣本 | 0 | 0 |
| 預測為負樣本 | 1 | 99 |
這個模型的的準確率可以高達99%,但是我們的目標是找出正樣本,而該模型一個正樣本都找不出來,這個準確率是虛高,是帶有欺騙性的。所以當正負樣本不平衡的時候,準確率是沒有評價意義的。
精確率和召回率是相互制約的,一般精確率低的召回率高,精確率搞得召回率低,根據不同的業務場景選擇不同的重點。比如公司要通過運營活動(獎勵活動)對即將要流失的用戶進行挽留,于是針對用戶做了兩個流失預警模型,一個模型的精確率較高,另一個模型的召回率高,如果選擇精確率較高的模型,會漏掉更多的流失用戶,降低了挽回用戶量;但是如果選擇召回率高的,就會把更多的非流失用戶判斷為流失用戶,產生了更多的不必要成本,那么我們應該如何選擇這兩個模型呢?
這個時候就要具體情況具體分析,如果是運營經費比較寬裕,且挽留回一個用戶所帶來的價值是非必要支出的很多倍,那么就選擇召回率高的模型;如果是運營經費有限,且挽回用戶的價值不那么高,那么就選擇精確率較高的模型。
F1-score是精確率和召回率兩指標的一個綜合。
前面說過的所有指標都是針對一個閾值的結果進行計算的,ROC是將模型依次取不同的閾值,并將該閾值對應的tpr和fpr繪制成一條曲線。
AUC是ROC的量化指標,AUC/ROC是最常用的一種評價方式,因為其不受正負樣本比例的影響(影響其的兩個指標主要是tpr和fpr,這兩個指標表示模型分別在正樣本和負樣本上的表現情況,和兩者的比值無關,所以憑借結果也無關)。總結
以上是生活随笔為你收集整理的机器学习第十篇:如何评价模型效果评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机票价格大跳水:广州直飞曼谷只要10元
- 下一篇: 早报:荣耀或发布三种形态的折叠屏 华为苹