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:
- Multi-period Strategies: CMPC (MIMO and MISMO variants), Iterative, Direct, Hybrid, Combinatorial
- Single-output Strategies: Classic Classifiers from WEKA for denormalized data, Discriminative Pattern-based Classifiers (P2MID) for time-enriched itemset sequences, Generative Sequential Classifiers (HMMs) for multivariate time sequences
Material:
- Datasets: Diabetes, msnbc.com, and Heritage Health
- Others: EVOC Tutorial
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; }