Skip to content

Commit 2c883e6

Browse files
committed
Add Auto-Weka to pipeline
1 parent 25d9b94 commit 2c883e6

File tree

4 files changed

+96
-7
lines changed

4 files changed

+96
-7
lines changed

swan-pipeline/src/main/java/de/fraunhofer/iem/swan/features/FeatureSetSelector.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public IFeatureSet select(Dataset dataset, SwanOptions options) {
1515
mekaFeatureSet.createFeatures();
1616
return mekaFeatureSet;
1717
case WEKA:
18+
case MLPLAN:
19+
case AUTOWEKA:
1820
WekaFeatureSet wekaFeatureSet = new WekaFeatureSet(dataset, options);
1921
wekaFeatureSet.createFeatures();
2022
return wekaFeatureSet;

swan-pipeline/src/main/java/de/fraunhofer/iem/swan/model/ModelEvaluator.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import de.fraunhofer.iem.swan.features.WekaFeatureSet;
88
import de.fraunhofer.iem.swan.io.dataset.SrmList;
99
import de.fraunhofer.iem.swan.io.dataset.SrmListUtils;
10+
import de.fraunhofer.iem.swan.model.toolkit.AutoWeka;
1011
import de.fraunhofer.iem.swan.model.toolkit.MLPlan;
1112
import de.fraunhofer.iem.swan.model.toolkit.Meka;
1213
import de.fraunhofer.iem.swan.model.toolkit.Weka;
@@ -28,7 +29,8 @@ public class ModelEvaluator {
2829
public enum Toolkit {
2930
WEKA,
3031
MEKA,
31-
MLPLAN
32+
MLPLAN,
33+
AUTOWEKA
3234
}
3335

3436
public enum Phase {
@@ -64,14 +66,17 @@ public void trainModel() {
6466
processResults(meka.trainModel());
6567
break;
6668
case WEKA:
67-
logger.info("Evaluating model with WEKA");
68-
Weka weka = new Weka((WekaFeatureSet) features, options);
69-
weka.trainModel();
69+
Weka weka = new Weka((WekaFeatureSet) features, options, methods);
70+
processResults(weka.trainModel());
71+
break;
72+
case AUTOWEKA:
73+
AutoWeka autoWeka = new AutoWeka((WekaFeatureSet) features, options);
74+
autoWeka.trainModel();
7075
break;
7176
case MLPLAN:
7277
logger.info("Evaluating model with ML-PLAN");
73-
MLPlan mlPlan = new MLPlan();
74-
mlPlan.evaluateDataset(((WekaFeatureSet) features).getInstances().get("train"));
78+
MLPlan mlPlan = new MLPlan((WekaFeatureSet) features, options);
79+
mlPlan.trainModel();
7580
break;
7681
}
7782
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package de.fraunhofer.iem.swan.model.toolkit;
2+
3+
import de.fraunhofer.iem.swan.cli.SwanOptions;
4+
import de.fraunhofer.iem.swan.features.WekaFeatureSet;
5+
import de.fraunhofer.iem.swan.model.ModelEvaluator;
6+
import de.fraunhofer.iem.swan.util.Util;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import weka.classifiers.Evaluation;
10+
import weka.classifiers.meta.AutoWEKAClassifier;
11+
import weka.core.Instances;
12+
13+
import java.util.HashMap;
14+
import java.util.LinkedHashMap;
15+
16+
17+
public class AutoWeka {
18+
19+
private WekaFeatureSet features;
20+
private SwanOptions options;
21+
private static final Logger logger = LoggerFactory.getLogger(AutoWeka.class);
22+
23+
public AutoWeka(WekaFeatureSet features, SwanOptions options) {
24+
this.features = features;
25+
this.options = options;
26+
}
27+
28+
/**
29+
* Trains and evaluates the model with the given training data and specified classification mode.
30+
*
31+
* @return Hashmap containing the name of the classifier and it's F-Measure
32+
*/
33+
public HashMap<String, HashMap<String, String>> trainModel() {
34+
35+
switch (ModelEvaluator.Phase.valueOf(options.getPhase().toUpperCase())) {
36+
case VALIDATE:
37+
38+
//Phase 1: classify SRM classes
39+
for (String srm : options.getSrmClasses())
40+
runManualEvaluation(features.getTrainInstances().get(srm));
41+
42+
//Filter methods from CWE instances that were not classified into one of the SRM classes
43+
//Phase 2: classify CWE classes
44+
for (String cwe : options.getCweClasses())
45+
runManualEvaluation(features.getTrainInstances().get(cwe));
46+
47+
return null;
48+
case PREDICT:
49+
50+
}
51+
return null;
52+
}
53+
54+
/**
55+
* @return
56+
*/
57+
public HashMap<String, HashMap<String, String>> runManualEvaluation(Instances instances) {
58+
59+
String category = instances.attribute(instances.numAttributes() - 1).name();
60+
instances.setClass(instances.attribute(instances.numAttributes() - 1));
61+
String instancesFile = Util.exportInstancesToArff(instances, category + "-autoweka");
62+
63+
LinkedHashMap<String, HashMap<String, String>> fMeasure = new LinkedHashMap<>();
64+
logger.info("Selecting model for {} using Auto-Weka: timelimit= {}, instances={}",
65+
category, options.getTimeLimit(), instancesFile);
66+
67+
try {
68+
69+
String[] args = {"-t", instancesFile,
70+
"-seed", "1",
71+
"-no-cv",
72+
"-timeLimit", Integer.toString(options.getTimeLimit())};
73+
74+
String out = Evaluation.evaluateModel(new AutoWEKAClassifier(), args);
75+
logger.info("Auto-Weka Results: {]}",out);
76+
77+
//autoWekaClassifier.buildClassifier(instances);
78+
} catch (Exception e) {
79+
throw new RuntimeException(e);
80+
}
81+
return fMeasure;
82+
}
83+
}

swan-pipeline/src/main/java/de/fraunhofer/iem/swan/model/toolkit/Meka.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public Meka(MekaFeatureSet features, SwanOptions options, Set<Method> methods) {
3535

3636
/**
3737
* Trains and evaluates the model with the given training data and specified classification mode.
38-
*
3938
*/
4039
public SrmList trainModel() {
4140

0 commit comments

Comments
 (0)