準確率,召回率,F1 值、ROC,AUC、mse,mape 評價指標
阿新 • • 發佈:2019-01-02
在機器學習、資料探勘領域,工業界往往會根據實際的業務場景擬定相應的業務指標。本文旨在一起學習比較經典的三大類評價指標,其中第一、二類主要用於分類場景、第三類主要用於迴歸預測場景,基本思路是從概念公式,到優缺點,再到具體應用(分類問題,本文以二分類為例)。
1.準確率P、召回率R、F1 值
- 定義
- 準確率(Precision):P=TP/(TP+FP)。通俗地講,就是預測正確的正例資料佔預測為正例資料的比例。
- 召回率(Recall):R=TP/(TP+FN)。通俗地講,就是預測為正例的資料佔實際為正例資料的比例
- F1值(F score):
- 思考
- 正如下圖所示,F1的值同時受到P、R的影響,單純地追求P、R的提升並沒有太大作用。在實際業務工程中,結合正負樣本比,的確是一件非常有挑戰的事。
- 影象展示
- 下面附上原始碼
- 正如下圖所示,F1的值同時受到P、R的影響,單純地追求P、R的提升並沒有太大作用。在實際業務工程中,結合正負樣本比,的確是一件非常有挑戰的事。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
x = np.linspace(0,1,100)
p,r = np.meshgrid(x,x) #meshgrid函式建立一個二維的座標網路
z = 2*p*r/(p+r)
ax.plot_surface(x,y,z,rstride=4 ,cstride=4,cmap=cm.YlGnBu_r)
ax.set_title('F1') #標題
ax.set_xlabel('precision') #x軸標籤
ax.set_ylabel('recall') #y軸標籤
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.ROC、AUC
- 概念
- TPR=TP/(TP+FN)=TP/actual positives
- FPR=FP/(FP+TN)=FP/actual negatives
- ROC是由點(TPR,FPR)組成的曲線,AUC就是ROC的面積。AUC越大越好。
- 一般來說,如果ROC是光滑的,那麼基本可以判斷沒有太大的overfitting
- 影象展示
- 附上程式碼
library(ROCR)p=c(0.5,0.6,0.55,0.4,0.7)y=c(1,1,0,0,1)pred = prediction(p, y)perf = performance(pred,"tpr","fpr")plot(perf,col="blue",lty=3, lwd=3,cex.lab=1.5, cex.axis=2, cex.main=1.5,main="ROC plot")
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- python版本計算AUC
from sklearn import metrics
defaucfun(act,pred):
fpr, tpr, thresholds = metrics.roc_curve(act, pred, pos_label=1)
return metrics.auc(fpr, tpr)
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 直接利用AUC優化分類任務(R語言版)
下面是程式碼
#生成訓練資料
set.seed(1999)
x1 = rnorm(1000)
x2 = rnorm(1000)
z = 1 + 2*x1 + 3*x2
pr = 1/(1+exp(-z))
y = rbinom(1000,1,pr)
#使用logloss作為訓練目標函式
df = data.frame(y=y,x1=x1,x2=x2)
glm.fit=glm( y~x1+x2,data=df,family="binomial")
#下面使用auc作為訓練目標函式
library(ROCR)
CalAUC <- function(real,pred){
rocr.pred=prediction(pred,real)
rocr.perf=performance(rocr.pred,'auc')
as.numeric([email protected])
}
#初始值
beta0=c(1,1,1)
loss <- function(beta){
z=beta[1]+beta[2]*x1+beta[3]*x2
pred=1/(1+exp(-z))
-CalAUC(y,pred)
}
res=optim(beta0,loss,method = "Nelder-Mead",control = list(maxit = 100))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
3.PRC、ROC比較
- AUC是ROC的積分(曲線下面積),是一個數值,一般認為越大越好,數值相對於曲線而言更容易當做調參的參照。
- PR曲線會面臨一個問題,當需要獲得更高recall時,model需要輸出更多的樣本,precision可能會伴隨出現下降/不變/升高,得到的曲線會出現浮動差異(出現鋸齒),無法像ROC一樣保證單調性。
- 在正負樣本分佈得極不均勻(highly skewed datasets)的情況下,PRC比ROC能更有效地反應分類器的好壞。
4.mape平均絕對百分誤差
- 定義
- 技巧
- 在sklearn中,對於迴歸任務,一般都提供了mse損失函式(基於樹的模型除外)。但有時我們會遇到sklearn中沒有定義的損失函式,那麼我們可以自定重寫模型或者定義函式,下面以xgboost為模型,mape作為損失函式為例(grad、hess分別對應損失函式一階導、二階導)。
- 程式碼
defmapeobj(preds,dtrain):
gaps = dtrain.get_label()
grad = np.sign(preds-gaps)/gaps
hess = 1/gaps
grad[(gaps==0)] = 0
hess[(gaps==0)] = 0
return grad,hess
defevalmape(preds, dtrain):
gaps = dtrain.get_label()
err = abs(gaps-preds)/gaps
err[(gaps==0)] = 0
err = np.mean(err)
return 'error',err
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
參考資源
1.關於AUC,你應該知道的和可能不知道的 (PS.最近才知道,這篇文章的作者是工大的校友啊)