/*
* File: BaggingCategorizerLearnerTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright December 23, 2009, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government. Export
* of this program may require a license from the United States Government.
* See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.learning.algorithm.ensemble;
import gov.sandia.cognition.learning.algorithm.perceptron.Perceptron;
import gov.sandia.cognition.learning.data.DefaultInputOutputPair;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.learning.function.categorization.LinearBinaryCategorizer;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import java.util.Random;
import junit.framework.TestCase;
/**
* Unit tests for class BaggingCategorizerLearner.
*
* @author Justin Basilico
* @since 3.0
*/
public class BaggingCategorizerLearnerTest
extends TestCase
{
protected Random random;
/**
* Creates a new test.
*
* @param testName The test name.
*/
public BaggingCategorizerLearnerTest(
String testName)
{
super(testName);
this.random = new Random();
}
/**
* Test of constructors of class BaggingCategorizerLearner.
*/
public void testConstructors()
{
Perceptron learner = null;
double percentToSample = BaggingCategorizerLearner.DEFAULT_PERCENT_TO_SAMPLE;
int maxIterations = BaggingCategorizerLearner.DEFAULT_MAX_ITERATIONS;
BaggingCategorizerLearner<Vector, Boolean> instance =
new BaggingCategorizerLearner<Vector, Boolean>();
assertSame(learner, instance.getLearner());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(maxIterations, instance.getMaxIterations());
assertNotNull(instance.getRandom());
learner = new Perceptron();
instance = new BaggingCategorizerLearner<Vector, Boolean>(learner);
assertSame(learner, instance.getLearner());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(maxIterations, instance.getMaxIterations());
assertNotNull(instance.getRandom());
percentToSample = percentToSample / 3.4;
maxIterations = maxIterations * 9;
instance = new BaggingCategorizerLearner<Vector, Boolean>(learner, maxIterations, percentToSample, random);
assertSame(learner, instance.getLearner());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(maxIterations, instance.getMaxIterations());
assertSame(random, instance.getRandom());
}
/**
* Test of learn method, of class BaggingCategorizerLearner.
*/
public void testLearn()
{
BaggingCategorizerLearner<Vector, Boolean> instance =
new BaggingCategorizerLearner<Vector, Boolean>();
instance.setLearner(new Perceptron());
instance.setRandom(random);
instance.setMaxIterations(5);
instance.setPercentToSample(0.5);
assertNull(instance.getResult());
ArrayList<InputOutputPair<Vector, Boolean>> data =
new ArrayList<InputOutputPair<Vector, Boolean>>();
VectorFactory<?> vectorFactory = VectorFactory.getDefault();
for (int i = 0; i < 10; i++)
{
data.add(new DefaultInputOutputPair<Vector, Boolean>(
vectorFactory.createUniformRandom(
14, 0.0, 1.0, random), true));
}
for (int i = 0; i < 5; i++)
{
data.add(new DefaultInputOutputPair<Vector, Boolean>(
vectorFactory.createUniformRandom(
14, -1.0, 0.0, random), false));
}
WeightedVotingCategorizerEnsemble<Vector, Boolean, ?> result =
instance.learn(data);
assertSame(result, instance.getResult());
assertEquals(5, result.getMembers().size());
for (WeightedValue<?> member : result.getMembers())
{
assertEquals(1.0, member.getWeight(), 0.0);
assertNotNull(member.getValue());
assertTrue(member.getValue() instanceof LinearBinaryCategorizer);
}
}
/**
* Test of learn method, of class BaggingCategorizerLearner
* using the out-of-bag stopping criteria.
*/
public void testLearnWithOOB()
{
BaggingCategorizerLearner<Vector, Boolean> instance =
new BaggingCategorizerLearner<Vector, Boolean>();
instance.setLearner(new Perceptron());
instance.setRandom(random);
instance.setMaxIterations(5);
instance.setPercentToSample(0.5);
instance.addIterativeAlgorithmListener(
new BaggingCategorizerLearner.OutOfBagErrorStoppingCriteria<>(2));
assertNull(instance.getResult());
ArrayList<InputOutputPair<Vector, Boolean>> data =
new ArrayList<InputOutputPair<Vector, Boolean>>();
VectorFactory<?> vectorFactory = VectorFactory.getDefault();
for (int i = 0; i < 10; i++)
{
data.add(new DefaultInputOutputPair<Vector, Boolean>(
vectorFactory.createUniformRandom(
14, 0.0, 1.0, random), true));
}
for (int i = 0; i < 5; i++)
{
data.add(new DefaultInputOutputPair<Vector, Boolean>(
vectorFactory.createUniformRandom(
14, -1.0, 0.0, random), false));
}
WeightedVotingCategorizerEnsemble<Vector, Boolean, ?> result =
instance.learn(data);
assertSame(result, instance.getResult());
assertEquals(4, result.getMembers().size());
for (WeightedValue<?> member : result.getMembers())
{
assertEquals(1.0, member.getWeight(), 0.0);
assertNotNull(member.getValue());
assertTrue(member.getValue() instanceof LinearBinaryCategorizer);
}
}
}