EVOC: Multi-period Classification

Consider a dataset D with instances composed by a set of (temporal) attributes and a sequence with h>1 labels under classification. Given a training dataset D, multi-period classification aims to learn a model for the classification of new instances with undisclosed sequential behavior.
A novel multiple-output approach relying on clustering methods to capture flexible sequential behavior, CMPC, is implemented. This approach is able to preserve local stochastic dependencies without the need to adapt the underlying single-label classifier. Additionally, the use of cluster's centroid for space reduction and recovery is an effective strategy to avoid the problems of combinatorial strategies and to guarantee an optimal learning that is dynamically adaptable to the number of periods, number of labels, number of instances and prototype combinations of labels.
Single-output methods are adapted from long-term prediction and an hybrid variation is implemented to account for more flexible temporal dependencies.

@article{,
	title={Multi-period classification: learning sequent classes from temporal domains},
	journal={Data Mining and Knowledge Discovery},
	author={Henriques, Rui and Madeira, SaraC. and Antunes, Cláudia},
	pages={1-28},
	year={2014},
	doi={10.1007/s10618-014-0376-8},
	issn={1384-5810},
	publisher={Springer US},
}

Methods:

Material:

Results: EVOC Statistical Sheets

Software:

Example on how to use EVOC:
public class EvocClassifiersTest {

  public static void main(String[] args) throws Exception {
	List<Results> results = new ArrayList<Results>();
	for(EvocClassifierTest classifier : getClassifiers())
		results.addAll(run(classifier));
	results.computeSignificancesBetweenPairs();
	for(Results result : results) System.out.println(result.toString());
  }
	
  public static List<Results> run(EvocClassifierTest clt) throws Exception {
	List<Results> results = new ArrayList<Results>();
	for(EvocData dataset : getDatasets()) {
		if(balance) dataset.balanceData();
		for(Parameters params : clt.getClassifierOptions()) {
			EvocClassifier classifier = clt.getClassifier(params);
			for(EvalOptions evalParams : getEvaluationOptions()) {
				for(int h=4, max=100; h<=max; h=h+4){
				dataset.setHorizon(h,max);
				results.add(classifier.evaluate(dataset,evalParams));
			}
		}
	}
	return results;
  }
  
  public static List<EvocClassifierTest> getClassifiers() {
	List<EvocClassifierTest> suite = new ArrayList<EvocClassifierTest>();
	if(multipleoutput){
		if(CMPCMimo){
			suite.add(new HMMMimoLearnerTest());
			suite.add(new NeuralNetworkMimoLearnerTest());
			...
			if(categorical){
				suite.add(new J48MimoLearnerTest());
				suite.add(new BayesNetMimoLearnerTest());
				...
			}
			if(numeric){
				suite.add(new LMTMimoLearnerTest());
				suite.add(new GaussianProcessesMimoLearnerTest());
				suite.add(new SMOregMimoLearnerTest());
				...
			}		
		}
		if(CMPCMismo){...}
		if(combinatorial) {...}
	}
	if(singleoutput) {
		if(direct) {...}
		if(iterative) {...}
		if(hybrid) {...}
	}
	return suite;
  }