/*
* 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.
*/
/*
* OSDL.java
* Copyright (C) 2004 Stijn Lievens
*
*/
package weka.classifiers.misc;
import weka.classifiers.misc.monotone.OSDLCore;
import weka.core.Attribute;
import weka.core.Instance;
import weka.core.RevisionUtils;
import weka.core.Utils;
/**
<!-- globalinfo-start -->
* This class is an implementation of the Ordinal Stochastic Dominance Learner.<br/>
* Further information regarding the OSDL-algorithm can be found in:<br/>
* <br/>
* S. Lievens, B. De Baets, K. Cao-Van (2006). A Probabilistic Framework for the Design of Instance-Based Supervised Ranking Algorithms in an Ordinal Setting. Annals of Operations Research..<br/>
* <br/>
* Kim Cao-Van (2003). Supervised ranking: from semantics to algorithms.<br/>
* <br/>
* Stijn Lievens (2004). Studie en implementatie van instantie-gebaseerde algoritmen voor gesuperviseerd rangschikken.<br/>
* <br/>
* For more information about supervised ranking, see<br/>
* <br/>
* http://users.ugent.be/~slievens/supervised_ranking.php
* <p/>
<!-- globalinfo-end -->
*
<!-- technical-bibtex-start -->
* BibTeX:
* <pre>
* @article{Lievens2006,
* author = {S. Lievens and B. De Baets and K. Cao-Van},
* journal = {Annals of Operations Research},
* title = {A Probabilistic Framework for the Design of Instance-Based Supervised Ranking Algorithms in an Ordinal Setting},
* year = {2006}
* }
*
* @phdthesis{Cao-Van2003,
* author = {Kim Cao-Van},
* school = {Ghent University},
* title = {Supervised ranking: from semantics to algorithms},
* year = {2003}
* }
*
* @mastersthesis{Lievens2004,
* author = {Stijn Lievens},
* school = {Ghent University},
* title = {Studie en implementatie van instantie-gebaseerde algoritmen voor gesuperviseerd rangschikken},
* year = {2004}
* }
* </pre>
* <p/>
<!-- technical-bibtex-end -->
*
<!-- options-start -->
* Valid options are: <p/>
*
* <pre> -D
* If set, classifier is run in debug mode and
* may output additional info to the console</pre>
*
* <pre> -C <REG|WSUM|MAX|MED|RMED>
* Sets the classification type to be used.
* (Default: MED)</pre>
*
* <pre> -B
* Use the balanced version of the Ordinal Stochastic Dominance Learner</pre>
*
* <pre> -W
* Use the weighted version of the Ordinal Stochastic Dominance Learner</pre>
*
* <pre> -S <value of interpolation parameter>
* Sets the value of the interpolation parameter (not with -W/T/P/L/U)
* (default: 0.5).</pre>
*
* <pre> -T
* Tune the interpolation parameter (not with -W/S)
* (default: off)</pre>
*
* <pre> -L <Lower bound for interpolation parameter>
* Lower bound for the interpolation parameter (not with -W/S)
* (default: 0)</pre>
*
* <pre> -U <Upper bound for interpolation parameter>
* Upper bound for the interpolation parameter (not with -W/S)
* (default: 1)</pre>
*
* <pre> -P <Number of parts>
* Determines the step size for tuning the interpolation
* parameter, nl. (U-L)/P (not with -W/S)
* (default: 10)</pre>
*
<!-- options-end -->
*
* More precisely, this is a simple extension of the OSDLCore class,
* so that the OSDLCore class can be used within the WEKA environment.
* The problem with OSDLCore is that it implements both
* <code> classifyInstance </code> and <code> distributionForInstance </code>
* in a non trivial way.
* <p>
* One can evaluate a model easily with the method <code> evaluateModel </code>
* from the <code> Evaluation </code> class. However, for nominal classes
* they do the following: they use <code> distributionForInstance </code>
* and then pick the class with maximal probability. This procedure
* is <b> not </b> valid for a ranking algorithm, since this destroys
* the required monotonicity property.
* </p>
* <p>
* This class reimplements <code> distributionForInstance </code> in the
* following way: first <code> classifyInstance </code> of
* <code> OSDLCore </code> is used and the chosen label then gets
* assigned probability one. This ensures that the classification
* accuracy is calculated correctly, but possibly some other statistics
* are no longer meaningful.
* </p>
*
* @author Stijn Lievens (stijn.lievens@ugent.be)
* @version $Revision: 5987 $
*/
public class OSDL
extends OSDLCore {
/** for serialization */
private static final long serialVersionUID = -4534219825732505381L;
/**
* Use <code> classifyInstance </code> from <code> OSDLCore </code> and
* assign probability one to the chosen label.
* The implementation is heavily based on the same method in
* the <code> Classifier </code> class.
*
* @param instance the instance to be classified
* @return an array containing a single '1' on the index
* that <code> classifyInstance </code> returns.
*/
public double[] distributionForInstance(Instance instance) {
// based on the code from the Classifier class
double[] dist = new double[instance.numClasses()];
int classification = 0;
switch (instance.classAttribute().type()) {
case Attribute.NOMINAL:
try {
classification =
(int) Math.round(classifyInstance(instance));
} catch (Exception e) {
System.out.println("There was a problem with classifyIntance");
System.out.println(e.getMessage());
e.printStackTrace();
}
if (Utils.isMissingValue(classification)) {
return dist;
}
dist[classification] = 1.0;
return dist;
case Attribute.NUMERIC:
try {
dist[0] = classifyInstance(instance);
} catch (Exception e) {
System.out.println("There was a problem with classifyIntance");
System.out.println(e.getMessage());
e.printStackTrace();
}
return dist;
default:
return dist;
}
}
/**
* Returns the revision string.
*
* @return the revision
*/
public String getRevision() {
return RevisionUtils.extract("$Revision: 5987 $");
}
/**
* Main method for testing this class and for using it from the
* command line.
*
* @param args array of options for both the classifier <code>
* OSDL </code> and for <code> evaluateModel </code>
*/
public static void main(String[] args) {
runClassifier(new OSDL(), args);
}
}