1. 程式人生 > >準確率,召回率,F1 值、ROC,AUC、mse,mape評價指標

準確率,召回率,F1 值、ROC,AUC、mse,mape評價指標

在機器學習、資料探勘領域,工業界往往會根據實際的業務場景擬定相應的業務指標。本文旨在一起學習比較經典的三大類評價指標,其中第一、二類主要用於分類場景、第三類主要用於迴歸預測場景,基本思路是從概念公式,到優缺點,再到具體應用(分類問題,本文以二分類為例)。

1.準確率P、召回率R、F1 值

  • 定義 
    • 準確率(Precision):P=TP/(TP+FP)。通俗地講,就是預測正確的正例資料預測為正例資料的比例。
    • 召回率(Recall):R=TP/(TP+FN)。通俗地講,就是預測為正例的資料實際為正例資料的比例
    • F1值(F score):
  • 思考 
    • 正如下圖所示,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()

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")
  • python計算AUC
from sklearn import metrics
def aucfun(act,pred):
  fpr, tpr, thresholds = metrics.roc_curve(act, pred, pos_label=1)
  return metrics.auc(fpr, tpr)
  • 直接利用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))

3.PRC、ROC比較

  • AUC是ROC的積分(曲線下面積),是一個數值,一般認為越大越好,數值相對於曲線而言更容易當做調參的參照。
  • PR曲線會面臨一個問題,當需要獲得更高recall時,model需要輸出更多的樣本,precision可能會伴隨出現下降/不變/升高,得到的曲線會出現浮動差異(出現鋸齒),無法像ROC一樣保證單調性。
  • 在正負樣本分佈得極不均勻(highly skewed datasets)的情況下,PRC比ROC能更有效地反應分類器的好壞。

4.mape平均絕對百分誤差

  • 定義 
  • 技巧 
    • 在sklearn中,對於迴歸任務,一般都提供了mse損失函式(基於樹的模型除外)。但有時我們會遇到sklearn中沒有定義的損失函式,那麼我們可以自定重寫模型或者定義函式,下面以xgboost為模型,mape作為損失函式為例(grad、hess分別對應損失函式一階導、二階導)。
    • 程式碼
def mapeobj(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  

def evalmape(preds, dtrain):
    gaps = dtrain.get_label()
    err = abs(gaps-preds)/gaps
    err[(gaps==0)] = 0
    err = np.mean(err)
    return 'error',err