Changeset 103 for trunk/CrossPare/src


Ignore:
Timestamp:
05/19/16 13:56:30 (8 years ago)
Author:
atrautsch
Message:

GPTraining Implementation Update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrossPare/src/de/ugoe/cs/cpdp/training/GPTraining.java

    r93 r103  
    11package de.ugoe.cs.cpdp.training; 
     2 
     3import java.util.List; 
    24 
    35import org.apache.commons.collections4.list.SetUniqueList; 
     
    810import weka.core.Instances; 
    911import org.apache.commons.lang3.ArrayUtils; 
    10  
     12import org.jgap.Configuration; 
    1113import org.jgap.InvalidConfigurationException; 
    1214import org.jgap.gp.CommandGene; 
     
    3436import org.jgap.util.ICloneable; 
    3537 
     38import de.ugoe.cs.cpdp.util.WekaUtils; 
     39 
    3640import org.jgap.gp.impl.ProgramChromosome; 
    3741import org.jgap.util.CloneException; 
     
    4347public class GPTraining implements ISetWiseTrainingStrategy, IWekaCompatibleTrainer  { 
    4448     
    45     private final GPClassifier classifier = new GPClassifier(); 
     49    private GPVClassifier classifier = new GPVClassifier(); 
    4650     
    4751    private int populationSize = 1000; 
     
    5256    @Override 
    5357    public void setParameter(String parameters) { 
    54         System.out.println("setParameters"); 
     58        // todo, which type of classifier? GPV, GPVV? 
     59        // more config population size, etc. 
     60        // todo: voting for gpvv only 3 votes necessary? 
    5561    } 
    5662 
    5763    @Override 
    5864    public void apply(SetUniqueList<Instances> traindataSet) { 
    59         System.out.println("apply"); 
    60         for (Instances traindata : traindataSet) { 
    61             try { 
    62                 classifier.buildClassifier(traindata); 
    63             }catch(Exception e) { 
    64                 throw new RuntimeException(e); 
    65             } 
     65        try { 
     66            classifier.buildClassifier(traindataSet); 
     67        }catch(Exception e) { 
     68            throw new RuntimeException(e); 
    6669        } 
    6770    } 
     
    6972    @Override 
    7073    public String getName() { 
    71         System.out.println("getName"); 
    7274        return "GPTraining"; 
    7375    } 
     
    7577    @Override 
    7678    public Classifier getClassifier() { 
    77         System.out.println("getClassifier"); 
    7879        return this.classifier; 
    7980    } 
     
    8586        public InstanceData(Instances instances) { 
    8687            this.instances_x = new double[instances.numInstances()][instances.numAttributes()-1]; 
    87  
     88            this.instances_y = new boolean[instances.numInstances()]; 
     89             
    8890            Instance current; 
    8991            for(int i=0; i < this.instances_x.length; i++) { 
    9092                current = instances.get(i); 
    91                 for(int j=0; j < this.instances_x[0].length; j++) { 
    92                     this.instances_x[i][j] = current.value(j); 
    93                 } 
    94                  
    95                 this.instances_y[i] = current.stringValue(instances.classIndex()).equals("Y"); 
     93                this.instances_x[i] = WekaUtils.instanceValues(current); 
     94                this.instances_y[i] = 1.0 == current.classValue(); 
    9695            } 
    9796        } 
     
    105104    } 
    106105     
    107     public class GPClassifier extends AbstractClassifier { 
    108  
    109         private static final long serialVersionUID = 3708714057579101522L; 
     106    // one gprun, we want several for voting 
     107    public class GPRun extends AbstractClassifier { 
     108        private static final long serialVersionUID = -4250422550107888789L; 
    110109 
    111110        private int populationSize = 1000; 
     
    126125        } 
    127126         
    128         @Override 
    129         public void buildClassifier(Instances instances) throws Exception { 
    130             // load instances into double[][] and boolean[] 
    131             InstanceData train = new InstanceData(instances); 
    132             this.problem = new CrossPareGP(train.getX(), train.getY(), this.populationSize, this.initMinDepth, this.initMaxDepth, this.tournamentSize); 
    133              
    134             this.gp = problem.create(); 
    135             this.gp.evolve(this.maxGenerations); 
    136         } 
    137          
    138         @Override 
    139         public double classifyInstance(Instance instance) { 
    140             Variable[] vars = ((CrossPareGP)this.problem).getVariables(); 
    141              
    142             double[][] x = new double[1][instance.numAttributes()-1]; 
    143             boolean[] y = new boolean[1]; 
    144              
    145             for(int i = 0; i < instance.numAttributes()-1; i++) { 
    146                 x[0][i] = instance.value(i); 
    147             } 
    148             y[0] = instance.stringValue(instance.classIndex()).equals("Y"); 
    149              
    150             CrossPareFitness test = new CrossPareFitness(vars, x, y); 
    151             IGPProgram fitest = gp.getAllTimeBest(); 
    152              
    153             double sfitness = test.evaluate(fitest); 
    154              
    155             // korrekt sind wir wenn wir geringe fitness haben? 
    156             if(sfitness < 0.5) { 
    157                 return 1.0; 
    158             } 
    159             return 0; 
    160              
    161         } 
    162  
     127        public GPGenotype getGp() { 
     128            return this.gp; 
     129        } 
     130         
     131        public Variable[] getVariables() { 
     132            return ((CrossPareGP)this.problem).getVariables(); 
     133        } 
     134         
     135        public void setEvaldata(Instances testdata) { 
     136             
     137        } 
     138         
    163139        /** 
    164140         * GPProblem implementation 
     
    166142        class CrossPareGP extends GPProblem { 
    167143             
    168             private static final long serialVersionUID = 7526472295622776147L; 
     144            //private static final long serialVersionUID = 7526472295622776147L; 
    169145 
    170146            private double[][] instances; 
     
    175151            public CrossPareGP(double[][] instances, boolean[] output, int populationSize, int minInitDept, int maxInitDepth, int tournamentSize) throws InvalidConfigurationException { 
    176152                super(new GPConfiguration()); 
    177  
     153                 
    178154                this.instances = instances; 
    179155                this.output = output; 
    180156 
     157                Configuration.reset(); 
    181158                GPConfiguration config = this.getGPConfiguration(); 
    182  
     159                //config.reset(); 
     160                 
    183161                this.x = new Variable[this.instances[0].length]; 
    184162 
     163                
    185164                for(int j=0; j < this.x.length; j++) { 
    186165                    this.x[j] = Variable.create(config, "X"+j, CommandGene.DoubleClass);     
     
    227206                Class[][] argTypes = { {} }; 
    228207 
    229                 // variables + functions 
     208                // variables + functions, we set the variables with the values of the instances here 
    230209                CommandGene[] vars = new CommandGene[this.instances[0].length]; 
    231210                for(int j=0; j < this.instances[0].length; j++) { 
     
    256235            } 
    257236        } 
     237 
    258238         
    259239        /** 
     
    317297                    } 
    318298 
    319                     // value gives us a double, if > 0.5 we set this instance as faulty 
    320                     value = program.execute_double(0, NO_ARGS); 
     299                    // value gives us a double, if < 0.5 we set this instance as faulty 
     300                    value = program.execute_double(0, NO_ARGS);  // todo: test with this.x 
    321301 
    322302                    if(value < 0.5) { 
     
    337317 
    338318                // number of nodes in the programm, if lower then 10 we assign sFitness of 10 
     319                // we can set metadata with setProgramData to save this 
    339320                if(program.getChromosome(0).getSize(0) < 10) { 
     321                    program.setApplicationData(10.0f); 
    340322                    this.sfitness = 10.0f; 
    341323                    //System.out.println("wenige nodes: "+program.getChromosome(0).getSize(0)); 
     
    346328 
    347329                return pfitness; 
     330            } 
     331        } 
     332 
     333        @Override 
     334        public void buildClassifier(Instances traindata) throws Exception { 
     335            InstanceData train = new InstanceData(traindata);             
     336            this.problem = new CrossPareGP(train.getX(), train.getY(), this.populationSize, this.initMinDepth, this.initMaxDepth, this.tournamentSize); 
     337            this.gp = problem.create(); 
     338            this.gp.evolve(this.maxGenerations); 
     339        } 
     340    } 
     341     
     342    /** 
     343     * GP Multiple Data Sets Validation-Voting Classifier 
     344     * 
     345     * 
     346     */ 
     347    public class GPVVClassifier extends GPVClassifier { 
     348         
     349        private List<Classifier> classifiers = null; 
     350         
     351        @Override 
     352        public void buildClassifier(Instances arg0) throws Exception { 
     353            // TODO Auto-generated method stub 
     354             
     355        } 
     356         
     357        public void buildClassifier(SetUniqueList<Instances> traindataSet) throws Exception { 
     358 
     359            // each classifier is trained with one project from the set 
     360            // then is evaluated on the rest 
     361            for(int i=0; i < traindataSet.size(); i++) { 
     362                Classifier classifier = new GPRun(); 
     363                 
     364                // one project is training data 
     365                classifier.buildClassifier(traindataSet.get(i)); 
     366                 
     367                double[] errors; 
     368                 
     369                // rest of the set is evaluation data, we evaluate now 
     370                for(int j=0; j < traindataSet.size(); j++) { 
     371                    if(j != i) { 
     372                        // if type1 and type2 errors are < 0.5 we allow the model in the final voting 
     373                        errors = this.evaluate((GPRun)classifier, traindataSet.get(j)); 
     374                        if((errors[0] / traindataSet.get(j).numInstances()) < 0.5 && (errors[0] / traindataSet.get(j).numInstances()) < 0.5) { 
     375                            classifiers.add(classifier);                             
     376                        } 
     377                    } 
     378                } 
     379            } 
     380        } 
     381         
     382        /** 
     383         * Use the remaining classifiers for our voting 
     384         */ 
     385        @Override 
     386        public double classifyInstance(Instance instance) { 
     387             
     388            int vote_positive = 0; 
     389            int vote_negative = 0; 
     390             
     391            for (int i = 0; i < classifiers.size(); i++) { 
     392                Classifier classifier = classifiers.get(i); 
     393                 
     394                GPGenotype gp = ((GPRun)classifier).getGp(); 
     395                Variable[] vars = ((GPRun)classifier).getVariables(); 
     396                 
     397                IGPProgram fitest = gp.getAllTimeBest();  // all time fitest 
     398                for(int j = 0; j < instance.numAttributes()-1; j++) { 
     399                   vars[j].set(instance.value(j)); 
     400                } 
     401                 
     402                if(fitest.execute_double(0, vars) < 0.5) { 
     403                    vote_positive += 1; 
     404                }else { 
     405                    vote_negative += 1; 
     406                } 
     407            } 
     408             
     409            if(vote_positive >= 3) { 
     410                return 1.0; 
     411            }else { 
     412                return 0.0; 
     413            } 
     414        } 
     415    } 
     416     
     417    /** 
     418     * GP Multiple Data Sets Validation Classifier 
     419     *  
     420     * 
     421     * for one test data set: 
     422     *   for one in 6 possible training data sets: 
     423     *     For 200 GP Runs: 
     424     *       train one Classifier with this training data 
     425     *       then evaluate the classifier with the remaining project 
     426     *       if the candidate model performs bad (error type1 or type2 > 50%) discard it 
     427     * for the remaining model candidates the best one is used 
     428     * 
     429     */ 
     430    public class GPVClassifier extends AbstractClassifier { 
     431         
     432        private Classifier best = null; 
     433         
     434        private static final long serialVersionUID = 3708714057579101522L; 
     435 
     436 
     437        /** Build the GP Multiple Data Sets Validation Classifier 
     438         *  
     439         * - Traindata one of the Instances of the Set (which one? The firsT? as it is a list?) 
     440         * - Testdata one other Instances of the Set (the next one? chose randomly?) 
     441         * - Evaluation the rest of the instances 
     442         *  
     443         * @param traindataSet 
     444         * @throws Exception 
     445         */ 
     446        public void buildClassifier(SetUniqueList<Instances> traindataSet) throws Exception { 
     447 
     448            // each classifier is trained with one project from the set 
     449            // then is evaluated on the rest 
     450            for(int i=0; i < traindataSet.size(); i++) { 
     451                Classifier classifier = new GPRun(); 
     452                 
     453                // one project is training data 
     454                classifier.buildClassifier(traindataSet.get(i)); 
     455                 
     456                // rest of the set is evaluation data, we evaluate now 
     457                double smallest_error_count = Double.MAX_VALUE; 
     458                double[] errors; 
     459                for(int j=0; j < traindataSet.size(); j++) { 
     460                    if(j != i) { 
     461                        errors = this.evaluate((GPRun)classifier, traindataSet.get(j)); 
     462                        if(errors[0]+errors[1] < smallest_error_count) { 
     463                            this.best = classifier; 
     464                        } 
     465                    } 
     466                } 
     467            } 
     468        } 
     469         
     470        @Override 
     471        public void buildClassifier(Instances traindata) throws Exception { 
     472            final Classifier classifier = new GPRun(); 
     473            classifier.buildClassifier(traindata); 
     474            best = classifier; 
     475        } 
     476         
     477        public double[] evaluate(GPRun classifier, Instances evalData) { 
     478            GPGenotype gp = classifier.getGp(); 
     479            Variable[] vars = classifier.getVariables(); 
     480             
     481            IGPProgram fitest = gp.getAllTimeBest();  // selects the fitest of all not just the last generation 
     482             
     483            double classification; 
     484            int error_type1 = 0; 
     485            int error_type2 = 0; 
     486            int number_instances = evalData.numInstances(); 
     487             
     488            for(Instance instance: evalData) { 
     489                 
     490                for(int i = 0; i < instance.numAttributes()-1; i++) { 
     491                    vars[i].set(instance.value(i)); 
     492                } 
     493                 
     494                classification = fitest.execute_double(0, vars); 
     495                 
     496                // classification < 0.5 we say defective 
     497                if(classification < 0.5) { 
     498                    if(instance.classValue() != 1.0) { 
     499                        error_type1 += 1; 
     500                    } 
     501                }else { 
     502                    if(instance.classValue() == 1.0) { 
     503                        error_type2 += 1; 
     504                    } 
     505                } 
     506            } 
     507             
     508            double et1_per = error_type1 / number_instances; 
     509            double et2_per = error_type2 / number_instances;  
     510             
     511            // return some kind of fehlerquote? 
     512            //return (error_type1 + error_type2) / number_instances; 
     513            return new double[]{error_type1, error_type2}; 
     514        } 
     515         
     516        /** 
     517         * Use only the best classifier from our evaluation phase 
     518         */ 
     519        @Override 
     520        public double classifyInstance(Instance instance) { 
     521            GPGenotype gp = ((GPRun)best).getGp(); 
     522            Variable[] vars = ((GPRun)best).getVariables(); 
     523             
     524            IGPProgram fitest = gp.getAllTimeBest();  // all time fitest 
     525            for(int i = 0; i < instance.numAttributes()-1; i++) { 
     526               vars[i].set(instance.value(i)); 
     527            } 
     528             
     529            double classification = fitest.execute_double(0, vars); 
     530             
     531            if(classification < 0.5) { 
     532                return 1.0; 
     533            }else { 
     534                return 0.0; 
    348535            } 
    349536        } 
Note: See TracChangeset for help on using the changeset viewer.