機器學習分類演算法常用評價指標
1. 準確率,召回率,精確率,F1-score,Fβ,ROC曲線,AUC值
為了評價模型以及在不同研究者之間進行效能比較,需要統一的評價標準。根據資料探勘理論的一般方法,評價模型預測能力最廣泛使用的是二維 混淆矩陣 ( Confusion matrix )(如下表所示)。
二維混淆矩陣
真實類別 |
預測結果 |
|
類別1(正例) |
類別2(反例) |
|
類別1(正例) |
真正例(True Positive) TP |
假反例(False Negatibe) FN |
類別2(反例) |
假正例(False Positive) FP |
真反例(True Negatibe) TN |
(1) 準確率 (Accuracy)表示正確分類的測試例項的個數佔測試例項總數的比例,計算公式為:
(2) 召回率 (Recall),也叫 查全率 ,表示正確分類的正例個數佔實際正例個數的比例,計算公式為:
(3) 精確率 (Precision),也叫 查準率 ,表示正確分類的正例個數佔分類為正例的例項個數的比例,計算公式為:
(4) F1-score 是基於召回率(Recall)與精確率(Precision)的調和平均,即將召回率和精確率綜合起來評價,計算公式為:
(5) Fβ加權調和平均
Fβ是F1度量的一般形式,能讓我們表達出對查準率、查全率的不同偏好,計算公式如下:
其中,β>0度量了查全率對查準率的相對重要性。β=1時退化為標準的F1;β>1時查全率有更大影響;β<1時查準率有更大影響。
(6)度量分類中的非均衡性的工具是 ROC曲線 (ROC Curve)
TPR (True Positive Rate)表示在所有實際為陽性的樣本中,被正確地判斷為陽性的比率,即: TPR=TP/(TP+FN) ; FPR( False Positive Rate)表示在所有實際為陰性的樣本中,被錯誤地判斷為陽性的比率,即: FPR=FP/(FP+TN) 。
ROC曲線是以 FPR作為X軸 , TPR作為Y軸 。FPR越大表明預測正類中實際負類越多,TPR越大,預測正類中實際正類越多。ROC曲線如下圖所示:
(7)AUC值(Area Unser the Curve)是ROC曲線下的面積,AUC值給出的是分類器的平均效能值。使用AUC值可以評估二分類問題分類效果的優劣,計算公式如下:
一個完美的分類器的AUC為1.0,而隨機猜測的AUC為0.5,顯然AUC值在0和1之間,並且數值越高,代表模型的效能越好。
2. 巨集平均(Macro-averaging)和微平均(Micro-averaging)
在n個二分類混淆矩陣上綜合考慮查準率和查全率時使用。
(1) 巨集平均 (macro-ave)
先在各混淆矩陣上分別計算出查準率,查全率和F1,然後再計算平均值,這樣就得到“ 巨集查準率 ”(macro-P)、“ 巨集查全率 ”(macro-R)、“ 巨集F1 ”(macro-F1),計算公式分別如下:
(2) 微平均 (micro-ave)
先將各混淆矩陣的對應元素進行平均,得到TP、FP、TN、FN的平均值,再基於這些平均值計算出“ 微查準率 ”(micro-P)、“ 微查全率 ”(micro-R)、“ 微F1 ”(micro-F1),計算公式分別如下:
3. Python sklearn實現分類指標
(1)KC4資料準備
(2)使用 隨機森林實現分類並輸出 評價指標
# -*- coding: utf-8 -*- import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn import metrics import matplotlib.pyplot as plt """ 函式說明:檔案處理 Parameters: filename:資料檔案 Returns: list_datasets:資料集特徵列表 category_labels:資料標籤列表 """ def data_handle(filename): read_data = pd.read_csv(filename) list_datasets = [] category_labels = [] for i in range(len(read_data)): list_data = [] for j in range(len(read_data.iloc[i, :]) - 1): row_data = read_data.iloc[i, j]# 讀取每個樣本的每個資料 list_data.append(row_data)#將每個資料存入列表 list_datasets.append(list_data)#將每個樣本的資料存入列表 row_data_label = read_data.iloc[i, len(read_data.iloc[i, :]) - 1]# 讀取每個樣本的類別標籤 if row_data_label == 'N': category_labels.append(0)# 將二分類標籤轉化為0和1,0代表軟體正常,1代表軟體缺陷 else: category_labels.append(1) return list_datasets, category_labels """ 函式說明:繪製ROC曲線 Parameters: labels:測試標籤列表 predict_prob:預測標籤列表 """ def plot_roc(labels, predict_prob): false_positive_rate, true_positive_rate, thresholds = metrics.roc_curve(labels, predict_prob) roc_auc = metrics.auc(false_positive_rate, true_positive_rate)#計算AUC值 print('AUC=' + str(roc_auc)) plt.title('PC5-ROC') plt.plot(false_positive_rate, true_positive_rate, 'b', label='AUC = %0.4f' % roc_auc) plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.ylabel('TPR') plt.xlabel('FPR') # plt.savefig('figures/PC5.png') #將ROC圖片進行儲存 plt.show() if __name__ == '__main__': datasets, labels = data_handle('MDP/KC4.csv')# 對資料集進行處理 # 訓練集和測試集劃分 X_train = datasets[:115] y_train = labels[:115] X_test = datasets[90:] y_test = labels[90:] # 隨機森林分類器 clf = RandomForestClassifier() clf = RandomForestClassifier(n_estimators=200, random_state=0) clf.fit(X_train, y_train)# 使用訓練集對分類器訓練 y_predict = clf.predict(X_test)# 使用分類器對測試集進行預測 print('準確率:', metrics.accuracy_score(y_test, y_predict)) #預測準確率輸出 print('巨集平均精確率:',metrics.precision_score(y_test,y_predict,average='macro')) #預測巨集平均精確率輸出 print('微平均精確率:', metrics.precision_score(y_test, y_predict, average='micro')) #預測微平均精確率輸出 print('巨集平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#預測巨集平均召回率輸出 print('平均F1-score:',metrics.f1_score(y_test,y_predict,average='weighted'))#預測平均f1-score輸出 print('混淆矩陣輸出:',metrics.confusion_matrix(y_test,y_predict))#混淆矩陣輸出 print('分類報告:', metrics.classification_report(y_test, y_predict))#分類報告輸出 plot_roc(y_test, y_predict)#繪製ROC曲線並求出AUC值
評價指標結果如下: