mulan.experiments.ICTAI2010.java Source code

Java tutorial

Introduction

Here is the source code for mulan.experiments.ICTAI2010.java

Source

/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 *    ICTAI2010.java
 *    Copyright (C) 2009-2010 Aristotle University of Thessaloniki, Thessaloniki, Greece
 */
package mulan.experiments;

/**
 * @author Grigorios Tsoumakas
 */
import java.util.ArrayList;
import java.util.List;

import mulan.classifier.MultiLabelLearner;
import mulan.classifier.lazy.MLkNN;
import mulan.classifier.meta.thresholding.MetaLabeler;
import mulan.classifier.meta.thresholding.OneThreshold;
import mulan.classifier.meta.thresholding.RCut;
import mulan.classifier.meta.thresholding.SCut;
import mulan.classifier.meta.thresholding.ThresholdPrediction;
import mulan.classifier.neural.BPMLL;
import mulan.classifier.transformation.BinaryRelevance;
import mulan.classifier.transformation.CalibratedLabelRanking;
import mulan.data.MultiLabelInstances;
import mulan.evaluation.Evaluator;
import mulan.evaluation.MultipleEvaluation;
import mulan.evaluation.measure.HammingLoss;
import mulan.evaluation.measure.Measure;
import weka.classifiers.meta.Bagging;
import weka.classifiers.trees.J48;
import weka.classifiers.trees.M5P;
import weka.core.TechnicalInformation;
import weka.core.Utils;
import weka.core.TechnicalInformation.Field;
import weka.core.TechnicalInformation.Type;

/**
 * Class replicating an experiment from a published paper
 *
 * @author Grigorios Tsoumakas
 * @version 2010.12.10
 */
public class ICTAI2010 extends Experiment {

    /**
     * Main class
     *
     * @param args command line arguments
     */
    public static void main(String[] args) {

        try {
            String path = Utils.getOption("path", args);
            String filestem = Utils.getOption("filestem", args);

            System.out.println("Loading the data set");
            MultiLabelInstances dataset = new MultiLabelInstances(path + filestem + ".arff",
                    path + filestem + ".xml");

            Evaluator eval = new Evaluator();
            MultipleEvaluation results;
            List<Measure> measures = new ArrayList<Measure>(1);
            measures.add(new HammingLoss());

            int numFolds = 10;

            MultiLabelLearner[] learner = new MultiLabelLearner[4];
            String[] learnerName = new String[learner.length];

            learner[0] = new MLkNN(10, 1.0);
            learnerName[0] = "MLkNN";
            learner[1] = new CalibratedLabelRanking(new J48());
            learnerName[1] = "CLR";
            Bagging bagging = new Bagging();
            bagging.setClassifier(new J48());
            learner[2] = new BinaryRelevance(bagging);
            learnerName[2] = "BR";
            learner[3] = new BPMLL();
            learnerName[3] = "BPMLL";

            // loop over learners
            for (int i = 0; i < learner.length; i++) {
                // Default
                results = eval.crossValidate(learner[i].makeCopy(), dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";default;-;" + results.toCSV());

                // One Threshold
                OneThreshold ot;
                ot = new OneThreshold(learner[i].makeCopy(), new HammingLoss());
                results = eval.crossValidate(ot, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";one threshold;train;" + results.toCSV());
                ot = new OneThreshold(learner[i].makeCopy(), new HammingLoss(), 5);
                results = eval.crossValidate(ot, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";one threshold;5-cv;" + results.toCSV());

                // RCut
                RCut rcut;
                rcut = new RCut(learner[i].makeCopy());
                results = eval.crossValidate(rcut, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";rcut;cardinality;" + results.toCSV());
                rcut = new RCut(learner[i].makeCopy(), new HammingLoss());
                results = eval.crossValidate(rcut, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";rcut;train;" + results.toCSV());
                rcut = new RCut(learner[i].makeCopy(), new HammingLoss(), 5);
                results = eval.crossValidate(rcut, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";rcut;5-cv;" + results.toCSV());

                // SCut
                SCut scut;
                scut = new SCut(learner[i].makeCopy(), new HammingLoss());
                results = eval.crossValidate(scut, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";scut;train;" + results.toCSV());
                scut = new SCut(learner[i].makeCopy(), new HammingLoss(), 5);
                results = eval.crossValidate(scut, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";scut;5-cv;" + results.toCSV());

                // MetaLabeler
                MetaLabeler ml;
                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Content-Based", "Numeric-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;train;content;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Score-Based", "Numeric-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;train;scores;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Rank-Based", "Numeric-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;train;ranks;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Content-Based", "Nominal-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;train;content;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Score-Based", "Nominal-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;train;scores;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Rank-Based", "Nominal-Class");
                ml.setFolds(1);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;cv;ranks;" + results.toCSV());

                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Content-Based", "Numeric-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;cv;content;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Score-Based", "Numeric-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;cv;scores;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new M5P(), "Rank-Based", "Numeric-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;m5p;cv;ranks;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Content-Based", "Nominal-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;cv;content;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Score-Based", "Nominal-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;cv;scores;" + results.toCSV());
                ml = new MetaLabeler(learner[i].makeCopy(), new J48(), "Rank-Based", "Nominal-Class");
                ml.setFolds(5);
                results = eval.crossValidate(ml, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";metalabeler;j48;cv;ranks;" + results.toCSV());

                // ThresholdPrediction
                ThresholdPrediction tp;
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Content-Based", 1);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;train;content;" + results.toCSV());
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Score-Based", 1);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;train;scores;" + results.toCSV());
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Rank-Based", 1);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;train;ranks;" + results.toCSV());
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Content-Based", 5);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;5-cv;content;" + results.toCSV());
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Score-Based", 5);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;5-cv;scores;" + results.toCSV());
                tp = new ThresholdPrediction(learner[i].makeCopy(), new M5P(), "Rank-Based", 5);
                results = eval.crossValidate(tp, dataset, measures, numFolds);
                System.out.println(learnerName[i] + ";tp;m5p;5-cv;ranks;" + results.toCSV());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * Returns an instance of a TechnicalInformation object, containing detailed
     * information about the technical background of this class, e.g., paper
     * reference or book this class is based on.
     *
     * @return the technical information about this class
     */
    @Override
    public TechnicalInformation getTechnicalInformation() {
        TechnicalInformation result;

        result = new TechnicalInformation(Type.INPROCEEDINGS);
        result.setValue(Field.AUTHOR,
                "Marios Ioannou and George Sakkas and Grigorios Tsoumakas and Ioannis Vlahavas");
        result.setValue(Field.TITLE, "Obtaining Bipartitions from Score Vectors for Multi-Label Classification");
        result.setValue(Field.BOOKTITLE,
                "Proceedings of the 22th IEEE International Conference on Tools with Artificial Intelligence");
        result.setValue(Field.YEAR, "2010");
        result.setValue(Field.PUBLISHER, "IEEE");
        return result;
    }
}