如何評價模型的好壞(一)


  • 二分類問題
  • 多分類問題
  • 連續變量問題

一、二分類問題

       二分類模型最常見的模型評價指標有:ROC曲線,AUC,精准率-召回率,准確率,F1-score,混淆矩陣,等。

假設檢驗

  案例分析:(酒駕檢測)酒精濃度檢測結果分布圖。(綠色:正常司機酒精濃度檢測結果分布。紅色:酒駕司機酒精濃度檢測結果分布)   

引入三個概念:

  • 原假設H0:沒喝酒。       
  • 備擇假設H1:喝了酒。
  • 閾值Threshold:酒駕檢測標准(分類的閾值,閾值大小可人為改變)

  • 閾值左邊:接受原假設H0。 
  • 閾值右邊:拒絕原假設H0,接受備擇假設H1。
  • 閾值的划分,產生四個值: True Positive、True Negative、False Positive(假陽性)、False Negative(假陰性),這四個值構成混淆矩陣

  一般默認:原假設成立---Negative, 備擇假設成立---Positive

 

混淆矩陣

  檢測:喝了酒(Positive) 檢測:沒喝酒(Negative)
實際:喝了酒 True Positive(TP) False Negative(FN)
實際:沒喝酒 False Positive(FP) True Negative(FN)

 

 

 

 

 

統計學上,

  第一類錯誤:(棄真)False Positive 假陽性

    第二類錯誤:(存偽)False Negative 假陰性 

具體問題具體分析:

(1)醫療場景:可以容忍假陽性,但必須減少假陰性。(假陰性:某病人原本患某種疾病,卻檢測為沒有生病)

(2)垃圾郵件識別:可以容忍假陰性,但必須減少假陽性。(假陽性:某個非常重要的郵件,被識別成垃圾郵件被刪除,容易誤事)

 

引入ROC曲線和AUC面積:

周志華《機器學習》33頁:

  ROC 全稱是“Receiver Operating Characteristic 曲線”,它源於“二戰”中用於敵機檢測的雷達信號分析技術,二十世紀六七十年代來時被用於一些心理學、醫學檢測應用中,此后被引入機器學習領域[Spackman,1989]。ROC曲線的縱軸是“真正例率”(True Positive Rate,簡稱TPR),橫軸是“假正例率”(False Positive Rate,簡稱FPR)

                                   TPR = TP/(TP+FN)

                                   FPR = FP/(TN+FP)

 

從上圖可以看出:

  • TPR(真正例率):TP + FN 表示:所有喝酒的人數,TP 表示:實際喝酒,被檢測數喝酒的人數。
  • FPR(假正例率):TN + FP 表示:所有沒有喝酒的人數, FP 表示:實際沒喝酒,被檢測出喝酒的人數。

總結:

  1. ROC曲線單調遞增,且每個點都在45度斜線上方(曲線面積大於0.5),意味着:TP > FP
  2. ROC曲線的斜率始終為正,意味着:FP,TP同增同減(從酒精檢測曲線圖中可以觀測到)
  3. ROC曲線下方圍成的面積值,就是 AUC(area under curve = AUC)
  4. ROC曲線離45度斜線越遠,表示分類效果越好。

 

引入准確率(accuracy)、召回率(recall)、精准率(precision)、F1-score:

(上文提到)混淆矩陣:

  檢測:喝了酒(Positive) 檢測:沒喝酒(Negative)
實際:喝了酒 True Positive(TP) False Negative(FN)
實際:沒喝酒 False Positive(FP) True Negative(FN)

 

 

 

 

 

(1)准確率: accuracy = (TP+TN) / (TP+FN+FP+TN)

  • TP+FN+FP+TN 表示:所有接受酒精檢測的人數。 TP+TN 表示:所有檢測正確的人數。
  • 准確率(accuracy)表示:所有實例中,分類正確的比例。

(2)召回率:recall = TP / (TP+FN)

  • TP+FN 表示:實際喝了酒的人數, TP 表示:實際喝了酒,被檢測出喝了酒的人數。
  • 召回率(recall)表示:所有正例中分類正確的比例。

(3)精准率: precision = TP / (TP+FP)

  • TP+FP 表示:被檢測出喝了酒的人數, TP 表示:實際喝了酒,被檢測出喝了酒的人數
  • 精准率(precision)表示:被分為正例的示例中實際為正例的比例。 

 

分析:

  對比:召回率(recall)和精准率(precision)兩個公式,發現只有FN(假陰性)和FP(假陽性)表示不同。從酒精濃度檢測曲線圖中可以看出,FN 和 FP 不同增,即當 FN 增大時,FP會減少;當 FP 增加時,FN 會減少。 從而分析出,當 recall 增加時,precision 會減少;當precision 增加時,recall 會減少,“二者不可兼得”。為了平衡召回率(recall)和精准率(precision)兩個指標,引入F-measure 和MAP(Mean Average Precision)

 

(4)F-measure = (1 + a2)* precision* recall / (a2 * precision + recall)

  • 當參數a = 1時,即為 F1-score。

(4-1)F1-score = 2/(1/R + 1/P) = 2* R* P/(R + P) 

  • F1-score 表示 召回率 Recall(R)和精准率 Precision(P)的調和平均數

(5)平均准確率MAP(Mean Average Precision):實際上指的是Precision-recall曲線圍成的面積,解決了precision,recall和F-measure的單點局限性。

(6)交並比 IOU(intersection over union):交比並 

 

使用Python代碼畫圖計算:

1. 計算 召回率(recall)、精准率(precision)和F1-score

 1 from sklearn.metrics import accuracy_score, precision_score, recall_score,f1_score
2 y_true = [1,1,1,0,0,0,1] 3 y_pred = [0,1,1,0,1,0,0] 4 precision = precision_score(y_true, y_pred) 5 recall = recall_score(y_true, y_pred) 6 accuracy = accuracy_score(y_true, y_pred) 7 F1_Score = f1_score(y_true, y_pred)
8 print("precision = {}".format(precision)) 9 print("recall = {}".format(recall)) 10 print("accuracy = {}".format(accuracy)) 11 print("F1-score = {}".format(F1_Score))
結果顯示:
  precision = 0.6666666666666666   recall = 0.5   accuracy = 0.5714285714285714   F1-score = 0.5714285714285715

2. 畫ROC曲線並計算AUC值

 1 from sklearn.datasets import make_classification  2 from sklearn.linear_model import LogisticRegression  3 from sklearn.cross_validation import train_test_split  4 from sklearn.metrics import roc_auc_score, roc_curve  5 import matplotlib.pyplot as plt  6 
 7 # 生成分類數據(X,y)
 8 X, y = make_classification(n_samples=10000, n_features=10,  9                             n_classes=2,n_informative=5) 10 # 划分訓練集和測試集
11 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2, random_state=0) 12 
13 # 創建logistic回歸模型
14 clf = LogisticRegression() 15 # 模型填充數據
16 clf.fit(X_train,y_train) 17 # 模型預測數據
18 preds = clf.predict_proba(X_test)[:,1] 19 
20 # 產生fpr,tpr用於畫ROC曲線
21 fpr,tpr,_ = roc_curve(y_test, preds) 22 # 計算AUC值
23 roc_auc = roc_auc_score(y_test,preds) 24  
25 
26 # 開始畫圖
27 plt.figure() 28 lw = 2
29 
30 plt.plot(fpr, tpr, color='orange', 31           lw=lw, label='ROC_Curve (area = %0.2f)'% roc_auc) 32  
33 plt.plot([0,1],[0,1], color='navy',lw=lw, linestyle='--') 34 plt.xlim([0.0, 1.0]) 35 plt.ylim([0.0, 1.05]) 36 plt.xlabel('False Positive Rate') 37 plt.ylabel('True Positive Rate') 38 plt.title('Receiver operating characteristic Line') 39 plt.legend(loc='lower right') 40 plt.show()

 

 

參考資料:

  • 周志華 《機器學習》
  • 萬門大學教學視頻 《實用數據挖掘與人工智能一月特訓班》
  • 百度百科關於假設性檢驗:http://baike.baidu.com/view/1445854.htm
  • 關於MAP講解的博客: https://blog.csdn.net/chengyq116/article/details/81290447

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM