/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package AaronTest;
import development.TimeSeriesClassification;
import java.io.File;
import java.util.HashMap;
import weka.classifiers.AbstractClassifier;
import weka.classifiers.Classifier;
import weka.classifiers.trees.shapelet_trees.FStatShapeletTreeWithInfoGain;
import weka.classifiers.trees.shapelet_trees.KruskalWallisTree;
import weka.classifiers.trees.shapelet_trees.MoodsMedianTree;
import weka.classifiers.trees.shapelet_trees.ShapeletTreeClassifier;
import weka.core.Instances;
import weka.core.shapelet.QualityMeasures;
import static weka.core.shapelet.QualityMeasures.ShapeletQualityChoice.*;
import weka.filters.timeseries.shapelet_transforms.FullShapeletTransform;
import weka.filters.timeseries.shapelet_transforms.FullShapeletTransform2;
import weka.filters.timeseries.shapelet_transforms.ShapeletTransform;
import weka.filters.timeseries.shapelet_transforms.ShapeletTransform2;
import weka.filters.timeseries.shapelet_transforms.ShapeletTransformDistCaching;
import weka.filters.timeseries.shapelet_transforms.ShapeletTransformDistCaching2;
/**
*
* @author Aaron
*/
public class ShapeletTransformExperiments
{
//creates the shapelet transoform datasets.
static Class[] classList =
{
FullShapeletTransform2.class, ShapeletTransform2.class, ShapeletTransformDistCaching2.class, ShapeletTransformDistCaching.class
};
static QualityMeasures.ShapeletQualityChoice[] qualityMeasures =
{
F_STAT, INFORMATION_GAIN, KRUSKALL_WALLIS, MOODS_MEDIAN
};
public static void initializeShapelet(FullShapeletTransform s, Instances data, QualityMeasures.ShapeletQualityChoice qm)
{
//transform from 3- n, where n is the max length of the series.
s.setNumberOfShapelets(data.numAttributes() / 2);
int minLength = 3;
int maxLength = data.numAttributes() - 1;
s.setShapeletMinAndMax(minLength, maxLength);
s.setQualityMeasure(qm);
s.turnOffLog();
}
public static Instances[] extractShapelet(File dataName, Class shapeletClass, QualityMeasures.ShapeletQualityChoice qm)
{
Instances test = null;
Instances train;
FullShapeletTransform s;
Instances[] testAndTrain = new Instances[2];
String filePath = dataName.toString() + File.separator + dataName.getName();
System.out.println("FilePath: " + filePath);
//get the train and test instances for each dataset.
test = utilities.ClassifierTools.loadData(filePath + "_TEST");
train = utilities.ClassifierTools.loadData(filePath + "_TRAIN");
//get the save location from the static utility class for my local save.
String outLogFileName = LocalInfo.getSaveLocation(dataName.getName(), shapeletClass, qm);
try
{
//create our classifier.
s = (FullShapeletTransform) shapeletClass.newInstance();
//init
initializeShapelet(s, train, qm);
testAndTrain[0] = s.process(train);
LocalInfo.saveDataset(testAndTrain[0], outLogFileName + "_TRAIN");
testAndTrain[1] = s.process(test);
LocalInfo.saveDataset(testAndTrain[1], outLogFileName + "_TEST");
}
catch(Exception e)
{
System.out.println("error: " + e);
}
return testAndTrain;
}
public static AbstractClassifier shapeletTreeBuilder(QualityMeasures.ShapeletQualityChoice qm, int minLength, int maxLength) throws Exception
{
switch(qm)
{
case INFORMATION_GAIN:
{
ShapeletTreeClassifier c = new ShapeletTreeClassifier("infoTree.txt");
c.setShapeletMinMaxLength( minLength, maxLength);
return c;
}
case KRUSKALL_WALLIS:
{
KruskalWallisTree c = new KruskalWallisTree("kwTree.txt");
c.setShapeletMinMaxLength( minLength, maxLength);
return c;
}
case MOODS_MEDIAN:
{
MoodsMedianTree c = new MoodsMedianTree("mmTree.txt");
c.setShapeletMinMaxLength( minLength, maxLength);
return c;
}
case F_STAT:
{
FStatShapeletTreeWithInfoGain c = new FStatShapeletTreeWithInfoGain("fStatTree.txt");
c.setShapeletMinMaxLength( minLength, maxLength);
return c;
}
}
return null;
}
//assume they're the same length.
public static boolean AreInstancesEqual(Instances a, Instances b)
{
for (int i = 0; i < a.size(); i++)
{
double distance = a.get(i).value(0) - b.get(i).value(0);
if (distance != 0)
{
return false;
}
}
return true;
}
public static void CreateData(File dataName, Instances[][][] dataSets)
{
//for each classifier pass in the class name and construct it generically in the sub function.
for (int i = 0; i < classList.length; i++)
{
for (int j = 0; j < qualityMeasures.length; j++)
{
dataSets[i][j] = extractShapelet(dataName, classList[i], qualityMeasures[j]);
}
}
}
public static void trainAndTest(String dataName, Instances[][][] dataSets)
{
HashMap<String, Double> results = new HashMap<>();
//Use appropriate shapelet tree depending on distance measure used. so FStatShapeletTreeWithInfoGain for fstat etc.
Classifier c = null;
for(int i =0; i<dataSets.length; i++)
{
for(int j=0; j<dataSets[i].length; j++)
{
try
{
//build the classifier based on the Quality Measure.
c = shapeletTreeBuilder(qualityMeasures[j], 3, dataSets[i][j][0].numAttributes() - 1 );
c.buildClassifier(dataSets[i][j][0]);
double average = utilities.ClassifierTools.accuracy(dataSets[i][j][1], c);
String name = classList[i].getSimpleName()+"_"+qualityMeasures[j];
results.put(name, average);
}
catch (Exception ex)
{
System.out.println("Failed to build classifier " + ex);
}
}
}
//save results
LocalInfo.saveHashMap(results, dataName);
}
public static void testDataSet(File dataName, boolean create)
{
//[transformType][qualityMeasure][TRAIN/TEST]
Instances[][][] dataSets = new Instances[classList.length][qualityMeasures.length][2];
//either create or load it
if(create)
{
CreateData(dataName, dataSets);
}
else
{
LocalInfo.LoadData(dataName.getName(),dataSets, classList, qualityMeasures);
}
trainAndTest(dataName.getName(), dataSets);
}
public static void main(String[] args)
{
String dir = "75 Data sets for Elastic Ensemble DAMI Paper";
File fDir = new File(dir);
for (final File ds : fDir.listFiles())
{
//if it's not a directory we're not interested.
if(!ds.isDirectory()) continue;
new Thread()
{
@Override
public void run()
{
testDataSet(ds, true);
}
}.start();
}
//for (String dataSet : LocalInfo.ucrTiny/*development.DataSets.ucrSmall*/)
//{
// testDataSet(dataSet, true);
//}
/*Instances[] shapelet1, shapelet2;
String dataSet = LocalInfo.ucrTiny[1];
QualityMeasures.ShapeletQualityChoice qm = F_STAT;
System.out.println("New Code:");
//shapelet = FullTransformTest(dataSet, new FullShapeletTransform2(), qm);
//shapelet = FullTransformTest(dataSet, new ShapeletTransform2(), qm);
FullShapeletTransform tf1 = new FullShapeletTransform();
FullShapeletTransform tf2 = new ShapeletTransformDistCaching();
shapelet1 = FullTransformTest(dataSet, tf1, qm);
shapelet2 = FullTransformTest(dataSet, tf2, qm);
for(int i=0; i< tf1.getShapelets().size(); i++)
{
int answer = tf1.getShapelets().get(i).compareTo(tf2.getShapelets().get(i));
System.out.println("answer: " + answer);
}*/
}
public static Instances[] FullTransformTest(String dataName,FullShapeletTransform s1, QualityMeasures.ShapeletQualityChoice qm)
{
Instances test;
Instances train;
Instances[] testAndTrain = new Instances[2];
String filePath = TimeSeriesClassification.path + dataName + File.separator + dataName;
//get the train and test instances for each dataset.
test = utilities.ClassifierTools.loadData(filePath + "_TEST");
train = utilities.ClassifierTools.loadData(filePath + "_TRAIN");
//get the save location from the localInfo.
String outLogFileName = LocalInfo.getSaveLocation(dataName, s1.getClass(), qm);
System.out.println("outLogFileName: " + outLogFileName);
try
{
//create the shapelet filter.
initializeShapelet(s1, train, qm);
long startTime = System.nanoTime();
testAndTrain[0] = s1.process(train);
long finishTime = System.nanoTime();
System.out.println("Time taken: " + (finishTime - startTime));
startTime = System.nanoTime();
testAndTrain[1] = s1.process(test);
finishTime = System.nanoTime();
System.out.println("Time taken: " + (finishTime - startTime));
}
catch (IllegalArgumentException ex)
{
System.out.println("error: " + ex);
}
catch (Exception ex)
{
System.out.println("error: " + ex);
}
return testAndTrain;
}
}