- 二分類問題
- 多分類問題
- 連續變量問題
一、二分類問題
二分類模型最常見的模型評價指標有: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 表示:實際沒喝酒,被檢測出喝酒的人數。
總結:
- ROC曲線單調遞增,且每個點都在45度斜線上方(曲線面積大於0.5),意味着:TP > FP
- ROC曲線的斜率始終為正,意味着:FP,TP同增同減(從酒精檢測曲線圖中可以觀測到)
- ROC曲線下方圍成的面積值,就是 AUC(area under curve = AUC)
- 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