【0】README
本文使用 java 計算混淆矩陣,并利用 混淆矩陣值計算 分類指標;通用分類指標有: 查準率,查全率,查準率和查全率的調和均值F1值,正確率, AOC, AUC等;本文計算前4個指標;(附源代碼和結果截圖)
【1】什么是混淆矩陣(借用自己PPT截圖)
【2】查準率和查全率的區別
查準率:查準率表示選出的樣本中有多少比例樣本是正例(期望樣本);
查全率:查全率表示有多少比例的正樣本(期望樣本)被選出來了;
【3】如何計算多分類混淆矩陣的評價指標(摘自周志華老師的機器學習,極力推薦大家買一本)
【4】源碼如下
// 計算混淆矩陣,并根據混淆矩陣計算 10次交叉驗證下的 評估指標均值(精確度, 召回率, F值, 準確率 這4個指標)
public class SingleConfusionMatrix {
// C:\Users\pacoson\Desktop\confusion_matrixprivate static String dir = "C:" + File.separator + "Users" + File.separator + "pacoson" + File.separator + "Desktop" + File.separator + "confusion_matrix";private static double[][][] averages = new double[10][3][4]; // 10次交叉驗證, 3個unknown(12, 24, 48),4個度量指標(查全率,查準率,F1,準確率)private static int fold = 0;private static int counter = 6;public static void main(String[] args) {File file = new File(dir);showFiles();}// show files. public static void showFiles() {File[] files = new File(dir).listFiles(); for(File file: files) { // 遍歷 dir 目錄下的所有文件String filename = file.getName(); String prefix = filename.split("_")[0]; if(prefix.length() > 1) continue;fold = Integer.valueOf(prefix); // 10次交叉驗證的編號System.out.println("\n====== fold=" + fold + "======"); double[][] array = new double[100][6]; // item 數組DataRead reader = new DataRead(file.getAbsolutePath()); reader.readDataToArray(1, 1, array); // 數據讀取完畢 computeConfusion(0, array); // 預測長度12
// computeConfusion(1, array); // 預測長度24
// computeConfusion(2, array); // 預測長度48break;}
// computeAverage();}// column = 1(12), 2(24), 3(48)static void computeConfusion(int column, double[][] array) { // 1.計算confusion12/24/48: TP FN FP TNint[][] confusions = new int[6][4];counter = 6;for (int id = 0; id < 6; id++) {for (int i = 0; i < array.length; i++) {if(array[i][column] == id) {if(array[i][column+3] == id) // column = 1(12), 2(24), 3(48)confusions[id][0]++; // TPelseconfusions[id][1]++; // FN} else if(array[i][column] != id) {if(array[i][column+3] == id)confusions[id][2]++; // FPelseconfusions[id][3]++; // TN}}}// 2.計算 統計指標: // 精確度P=TP/(TP+FP), 查準率// 召回率R= TP/(TP+FN), 查全率// f1值=2*P*R/(P+R)// 準確率=(TP+TN)/(TP+FN+FP+TN)double[][] metrices = new double[6][4]; // 精確度, 召回率, F1值, 分類準確率for (int i = 0; i < confusions.length; i++) { double[] metric = metrices[i];int[] confusion = confusions[i];System.out.print("confusion matrix: TP, FN, FP, TN: ");for (int j = 0; j < confusion.length; j++) { // 打印每個混淆矩陣System.out.print(confusion[j] + ", ");}System.out.println();if(confusion[0] + confusion[2] != 0) // 分母不能為零.metric[0] = (double)confusion[0] / (confusion[0] + confusion[2]); // 精確度if(confusion[0] + confusion[1] != 0) // 分母不能為零.metric[1] = (double)confusion[0] / (confusion[0] + confusion[1]); // 召回率if(metric[0] + metric[1] != 0) // 分母不能為零.metric[2] = (double)2*metric[0]*metric[1]/(metric[0] + metric[1]); // f值metric[3] = (double)(confusion[0]+confusion[3]) / (confusion[0] + confusion[1]+ confusion[2]+ confusion[3]); // 準確率if(confusion[3] == 100) { // 如果 TN == 100, 表明沒有這個類成員(TN表示真實類別不是該類別且預測類別也不是該類別,那如果總數為100,則沒有模型沒有選出該類別)。metric[3] = 0;counter--;}}// 3.求均值(宏精確度, 宏召回率, 宏F1值, 宏準確率)
// double[] average = new double[4];
// private static double[][][] averages = new double[10][3][4]; // 10次交叉驗證, 3個unknown(12, 24, 48),4個度量指標(查全率,查準率,F1,準確率)
// double[][] metrices = new double[6][4]; // 精確度, 召回率, F1值, 分類準確率double[] average = averages[fold][column];System.out.println("counter = " + counter);for (int j = 0; j < metrices[0].length; j++) {double sum = 0;for (int i = 0; i < metrices.length; i++) {sum += metrices[i][j];}average[j] = sum/counter;System.out.print(average[j] + " ");}System.out.println();}public static void computeAverage() {System.out.println("\n === 計算10折交叉驗證的統計指標均值 === \n");// 預測長度為 12(j==0), 24(j==1), 48(j==2)for (int j = 0; j < 3; j++) { for (int k = 0; k < averages[0][0].length; k++) { // 4 個 itemsdouble sum = 0;for (int i = 0; i < averages.length; i++) { // 行(10折) sum += averages[i][j][k];}System.out.print(sum/10 + " ");}System.out.println();}}
}
Tips: 10次交叉驗證實驗,只需要調用其中的?computeAverage() 方法 就可以計算 其10次的均值了。(這里只求出了某次交叉實驗的均值)
總結
以上是生活随笔為你收集整理的java计算混淆矩阵(分类指标:查准率P,查全率R,P和R的调和均值F1,正确率A)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。