package edu.fudan.ml.eval; import java.text.DecimalFormat; import edu.fudan.util.MyArrays; /** * 计算分类性能得分 * @author xpqiu * */ public class Score { DecimalFormat df = new DecimalFormat("##.00"); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public String score(Integer[] pred,Integer[] golden,int numofclass) { float Accuracy; float MarcoF; float MacroPrecision = 0; float MacroRecall = 0; float Treeloss; float leafcor=0; float loss=0; float[] ttcon=new float[10]; float[] truePositive=new float[numofclass]; float[] falseNegative=new float[numofclass]; float[] falsePositive=new float[numofclass]; float[] numperclass =new float[numofclass]; int totnum = pred.length; for(int i=0;i<totnum;i++){ if(golden[i]==pred[i]){//正确 leafcor++; truePositive[golden[i]]++; } else{ falsePositive[pred[i]]++; falseNegative[golden[i]]++; } } for (int i = 0; i < totnum; i++) { if (golden[i] < numofclass) numperclass[golden[i]]++; else System.out.println("Not Format"); } Treeloss=loss/totnum; Accuracy=leafcor/totnum; System.out.println(" Accuracy:" + Accuracy); float count1=0; float count2=0; float[] precision = new float[numofclass]; float[] recall = new float[numofclass]; float[] f = new float[numofclass]; for(int i=0;i<numofclass;i++){ float base = truePositive[i]+falsePositive[i]; if(base>0) precision[i]= truePositive[i]/base; else{ count1++; } base = truePositive[i]+falseNegative[i]; if(base>0) recall[i] = truePositive[i]/base; else{ count2++; } f[i] = 2*precision[i]*recall[i]/(precision[i]+recall[i]+Float.MIN_VALUE); } //计算宏平均 MacroPrecision= MyArrays.sum(precision)/(numofclass-count1); MacroRecall=MyArrays.sum(recall)/(numofclass-count2); MarcoF=2*MacroPrecision*MacroRecall/(MacroPrecision+MacroRecall+Float.MIN_VALUE); StringBuilder sb= new StringBuilder(); sb.append("===========评测结果===========\n"); sb.append("--------------------微平均---------------------"); sb.append("\n"); sb.append("Accuracy:" + Accuracy); sb.append("\n"); sb.append("--------------------宏平均---------------------\n"); sb.append("Accuracy\t\tPrecision\t\tRecall \t\tF1"); sb.append("\n"); sb.append(df.format(Accuracy*100)+"\t\t"+ df.format(MacroPrecision*100)+"\t\t"+ df.format(MacroRecall*100) + "\t\t" + df.format(MarcoF*100)+"\t\t"+ df.format(Treeloss)); sb.append("\n"); sb.append("各类分析:"); sb.append("\n"); sb.append("Class\t\tNumberClass\t\tPrecision\t\tRecall \t\tF1"); sb.append("\n"); for(int i=0;i<numofclass;i++){ sb.append(i+"\t\t"+ (int)numperclass[i] + "\t\t" + df.format(precision[i]*100)+"\t\t"+ df.format(recall[i]*100)+"\t\t"+ df.format(f[i]*100)); sb.append("\n"); } int i=0; while(ttcon[i]!=0){ ttcon[i] = Float.parseFloat(df.format(ttcon[i]*100)); sb.append(""+i+"th level accurary: "+(float)ttcon[i]/totnum); i++; } sb.append("===========评测结果 END==========="); return sb.toString(); } }