Ignore:
Timestamp:
08/22/16 12:02:26 (8 years ago)
Author:
atrautsch
Message:

More cleanup and comments

File:
1 edited

Legend:

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

    r139 r140  
    4949 * This also means we can use any Weka Classifier not just LogisticRegression. 
    5050 *  
     51 * Config: <setwisetestdataawaretrainer name="MetricMatchingTraining" param="Logistic weka.classifiers.functions.Logistic" threshold="0.05" method="spearman"/> 
     52 * Instead of spearman metchod it also takes ks, percentile. 
     53 * Instead of Logistic every other weka classifier can be chosen. 
     54 *  
     55 * Future work: 
     56 * implement chisquare test in addition to significance for attribute selection 
     57 * http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/stat/inference/ChiSquareTest.html 
     58 * use chiSquareTestDataSetsComparison 
    5159 */ 
    5260public class MetricMatchingTraining extends WekaBaseTraining implements ISetWiseTestdataAwareTrainingStrategy { 
    5361 
    5462    private MetricMatch mm = null; 
    55     private Classifier classifier = new MetricMatchingClassifier(); 
     63    private Classifier classifier = null; 
    5664     
    5765    private String method; 
     
    8997        @Override 
    9098        public void apply(SetUniqueList<Instances> traindataSet, Instances testdata) { 
    91  
     99            // reset these for each run 
     100            this.mm = null; 
     101            this.classifier = null; 
     102             
    92103                double score = 0; // matching score to select the best matching training data from the set 
    93104                int num = 0; 
     
    116127                } 
    117128                 
    118                 // if we have found a matching instance we use it 
     129                // if we have found a matching instance we use it, log information about the match for additional eval later 
    119130                Instances ilist = null; 
    120131                if (this.mm != null) { 
     
    131142                try { 
    132143                        if(this.mm != null) { 
     144                            this.classifier = new MetricMatchingClassifier(); 
    133145                            this.classifier.buildClassifier(ilist); 
    134146                            ((MetricMatchingClassifier) this.classifier).setMetricMatching(this.mm); 
     
    257269                    return this.train_values.get(0).length; 
    258270                } 
    259                  
    260                 /**  
    261                  * This creates a new Instance out of the passed Instance and the previously matched attributes. 
    262                  * We do this because the evaluation phase requires an original Instance with every attribute. 
     271 
     272                 
     273                /** 
     274                 * The test instance must be of the same dataset as the train data, otherwise WekaEvaluation will die. 
     275                 * This means we have to force the dataset of this.train (after matching) and only  
     276                 * set the values for the attributes we matched but with the index of the traindata attributes we matched. 
    263277                 *  
    264                  * @param test instance 
    265                  * @return new instance 
     278                 * @param test 
     279                 * @return 
    266280                 */ 
    267281                public Instance getMatchedTestInstance(Instance test) { 
    268                     //create new instance with our matched number of attributes + 1 (the class attribute) 
    269                         Instances testdata = this.getMatchedTest(); 
    270  
    271                         Instance ni = new DenseInstance(this.attributes.size()+1); 
    272                         ni.setDataset(testdata); 
    273                           
    274                 for(Map.Entry<Integer, Integer> attmatch : this.attributes.entrySet()) { 
    275                     ni.setValue(testdata.attribute(attmatch.getKey()), test.value(attmatch.getValue())); 
    276                 } 
    277                  
    278                         ni.setClassValue(test.value(test.classAttribute())); 
    279  
    280                         return ni; 
    281         } 
    282  
     282            Instance ni = new DenseInstance(this.attributes.size()+1); 
     283             
     284            Instances inst = this.getMatchedTrain(); 
     285             
     286            ni.setDataset(inst); 
     287             
     288            // assign only the matched attributes to new indexes 
     289            double val; 
     290            int k = 0; 
     291            for(Map.Entry<Integer, Integer> attmatch : this.attributes.entrySet()) { 
     292                // get value from matched attribute 
     293                val = test.value(attmatch.getValue()); 
     294                 
     295                // set it to new index, the order of the attributes is the same 
     296                ni.setValue(k, val); 
     297                k++; 
     298            } 
     299            ni.setClassValue(test.value(test.classAttribute())); 
     300 
     301            return ni; 
     302                } 
     303 
     304                 
    283305        /** 
    284306         * returns a new instances array with the metric matched training data 
     
    494516                // -1 means that it is not in the set of maximal matching 
    495517                if( i != -1 && result[i] != -1) { 
    496                     //Console.traceln(Level.INFO, "Found maximal bipartite match between: "+ i + " and " + result[i]); 
     518                    this.p_sum += mwbm.weights[i][result[i]];  // we add the weight of the returned matching for scoring the complete match later 
    497519                    this.attributes.put(i, result[i]); 
    498520                } 
     
    544566                     
    545567                    if( score > cutoff ) { 
    546                         this.p_sum += score; 
    547568                        mwbm.setWeight(i, j, score); 
    548569                    } 
     
    587608                                        p = t.correlation(this.train_values.get(i), this.test_values.get(j)); 
    588609                                        if (p > cutoff) { 
    589                                             this.p_sum += p; 
    590610                        mwbm.setWeight(i, j, p); 
    591611                                        } 
     
    667687                                        p = t.approximateP(t.kolmogorovSmirnovStatistic(this.train_values.get(i), this.test_values.get(j)), this.train_values.get(i).length, this.test_values.get(j).length); 
    668688                                        if (p > cutoff) { 
    669                         this.p_sum += p; 
    670689                        mwbm.setWeight(i, j, p); 
    671690                                        } 
Note: See TracChangeset for help on using the changeset viewer.