// This is a Weka implementation of "Delegating Classifiers", // See Ferri, Flach and Hernandez-Orallo ICML'04 // File writted by Cesar Ferri (cferri@dsic.upv.es) import java.io.*; import java.util.*; //import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.lang.*; import weka.classifiers.*; import java.io.BufferedReader; //import weka.classifiers.evaluation.*; import weka.classifiers.functions.*; import weka.classifiers.functions.neural.*; import weka.classifiers.trees.*; import weka.classifiers.trees.j48.*; import weka.classifiers.bayes.*; import weka.classifiers.rules.*; import weka.classifiers.meta.*; import weka.core.*; //import Rank.*; public class Delegating { // confianza m�nima aceptada static double threshold1=0.7; //0.7 va prou be per a NBayes // M�ximo de divisiones 20 static int numFolds=5; static int numReps=20; static int percent =99; //percentatge que es delega // static int del_lim=5; static String [] nombArchi={ //"iris", "balance-scale", "breast-w", "breast-wdbc", "cmc", "dermatologyW", //"kr-vs-kp", "hayes-roth", "heart-disease-alltogether-UM", //"hepatitis", //"horse-colic-outcome-UMW", //"horse-colic-surgical-UMW", "house-vote", "iris", "monks1W", "monks2W", "monks3W", "new-thyroid", //"post-operativeW", "segment", "taeW", //"thyroid-ann", "tic-tacW", "wine", "spect", "carsW", // //"waveformW", //"abalone-morethan11.all", "optdigits", "spam", "thyroid-sick-eu-UM" }; /** The PairedTTester object */ // protected PairedTTester m_TTester = new PairedCorrectedTTester(); public static void main(String a[]) throws Exception { System.out.println("@relation ResultatsDelegating"); System.out.print("@attribute Key_Dataset {" ); for (int i=0; inumexem) //in the last iteration we haven't to delegate more... { threshold1=fill_delegated_dataset_numexem(delegated,deltrain,arbol,numexem); // System.out.println("exemples delegats:"+ delegated.numInstances()); num_exemples_delegated=delegated.numInstances(); deltrain=delegated; } else num_exemples_delegated=0; Classifiers.addElement(arbol); Thresholds.addElement(new Double (threshold1)); //learn the second classifier // J48 arbol2=new J48(); //arbol2.setOptions(options); // arbol2.setMinNumObj(1); //NaiveBayes arbol2 = new NaiveBayes(); // VotedPerceptron arbol2 = new VotedPerceptron(); // NeuralNetwork arbol2 = new NeuralNetwork(); // SimpleLogistic arbol2 =new SimpleLogistic(); // arbol2.buildClassifier(delegated); } while (num_exemples_delegated>0); time_train[fold][krep] = trainTimeElapsed / 1000.0; // TEST!! //Instances delegated_test; //delegated_test= new Instances(test,0); Evaluation eval_del = new Evaluation(test); //int visit=0; int hits=0; // System.out.println("acc2 "); for (int i=0; i=((Double)Thresholds.elementAt(del)).doubleValue()) { if ( classt== test.instance(i).classValue()) hits++; //if (del>visit) visit=del; break;} else{ if (del==(Classifiers.size()-1)) //fem rebound, es a dire si hi ha exemples que no els vols ningu, que els classifique el pare ;-) { if ( ((Classifier)Classifiers.elementAt(0)).classifyInstance(test.instance(i))== test.instance(i).classValue())hits++;} classt = ((Classifier)Classifiers.elementAt(0)).classifyInstance(test.instance(i)); } } //int hitsd=0; // for (int i=0; ithreshold1) //rebound // { // if ( arbol2.classifyInstance(delegated_test.instance(i))== delegated_test.instance(i).classValue()) // hits++; // } // else if ( arbol.classifyInstance(delegated_test.instance(i))== delegated_test.instance(i).classValue())hits++; //rebound //if ( predictedClass== delegated_test.instance(i).classValue()){hits++;hitsd++;} // System.out.println("les classes son: meua"+arbol2.classifyInstance(delegated_test.instance(i))+"orig"+test.instance(i).classValue()); //System.out.println("les classes son: meua"+predictedClass+"orig"+test.instance(i).classValue()); eval_del.evaluateModelOnce(classt, test.instance(i)); } //System.out.println("Classificadors"+ Classifiers.size()+"Visitats"+visit); //System.out.println("meu"+hits+ " Seu "+ eval_del.correct()); // Evaluation evalSimple0 = new Evaluation(delegated_test); // evalSimple0.evaluateModel(arbol2, delegated_test); // System.out.println("meu"+ formato(100*(double)hitsd/delegated_test.numInstances())+"weka"+evalSimple0.pctCorrect()); //System.out.println("meud"+ hitsd +"weka"+ evalSimple0.correct()); // Combinaci� int hits2=0; Evaluation eval_comb = new Evaluation(test); for (int i=0; ivalc) { valc=votacions[k]; classf=k; } } // classf=((J48)Classifiers.elementAt(0)).classifyInstance(test.instance(i)); //if (classt==classt2) classf=classt; //else if (confidences [(int)classt]>(threshold1*confidences2 [(int)classt2])) classf=classt; //else classf=classt2; // System.out.println("Classe comb:"+classf +"Classe true:" +test.instance(i).classValue()); if (classf== test.instance(i).classValue())hits2++; eval_comb.evaluateModelOnce(classf, test.instance(i)); } //ORIGINAL J48 arbolorg=new J48(); //arbolorg.setOptions(options); arbolorg.setUnpruned(true); arbolorg.setUseLaplace(true); //arbolorg.setMinNumObj(1); //NaiveBayes arbolorg= new NaiveBayes(); // VotedPerceptron arbolorg = new VotedPerceptron(); // NeuralNetwork arbolorg = new NeuralNetwork(); // SimpleLogistic arbolorg =new SimpleLogistic(); trainTimeStart = 0; trainTimeElapsed = 0; trainTimeStart = System.currentTimeMillis(); arbolorg.buildClassifier(train); trainTimeElapsed = System.currentTimeMillis() - trainTimeStart; time_train_org[fold][krep] = trainTimeElapsed / 1000.0; Evaluation evalSimple = new Evaluation(test); evalSimple.evaluateModel(arbolorg, test); //System.out.println("Accuracy" +evalSimple.pctCorrect()); //System.out.println("opcions"); //String [] opcions = arbolorg.getOptions(); //for (int i=0;i=0;k--) { double temp=((Double)ordered_confidences.elementAt(k)).doubleValue(); if (temp!=valortalla) { talladefault=k; break;} } // if (talladefault==0) {System.out.println("Error, no examples delegated"); // System.exit(0);} for (int k=0;k<=talladefault;k++) { delegated.add(((Instance)ordered_instances.elementAt(k)));} // System.out.println("valortalla"+ valortalla); return (valortalla); // System.out.println("Ranked Confidences"); // for (int k=0;k=0;k--) { double temp=((Double)ordered_confidences.elementAt(k)).doubleValue(); if (temp!=valortalla) { talladefault=k; break;} } // if (talladefault==0) {System.out.println("Error, no examples delegated"); // System.exit(0);} for (int k=0;k<=talladefault;k++) { delegated.add(((Instance)ordered_instances.elementAt(k)));} // System.out.println("valortalla"+ valortalla); return (valortalla); // System.out.println("Ranked Confidences"); // for (int k=0;k 0) ? (long)(temp + 0.5) : -(long)(Math.abs(temp) + 0.5); if (precisionValue == 0) { stringBuffer = new StringBuffer(String.valueOf(0)); } else { stringBuffer = new StringBuffer(String.valueOf(precisionValue)); } if (afterDecimalPoint == 0) { return stringBuffer.toString(); } dotPosition = stringBuffer.length() - afterDecimalPoint; while (((precisionValue < 0) && (dotPosition < 1)) || (dotPosition < 0)) { if (precisionValue < 0) { stringBuffer.insert(1, '0'); } else { stringBuffer.insert(0, '0'); } dotPosition++; } stringBuffer.insert(dotPosition, '.'); if ((precisionValue < 0) && (stringBuffer.charAt(1) == '.')) { stringBuffer.insert(1, '0'); } else if (stringBuffer.charAt(0) == '.') { stringBuffer.insert(0, '0'); } int currentPos = stringBuffer.length() - 1; /* // while ((currentPos > dotPosition) && (stringBuffer.charAt(currentPos) == '0')) { stringBuffer.setCharAt(currentPos--, ' '); } */ if (stringBuffer.charAt(currentPos) == '.') { stringBuffer.setCharAt(currentPos, ' '); } return stringBuffer.toString().trim(); } return new String("" + value); } }