/*
* File: CategoryBalancedIVotingLearnerTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry Learning Core
*
* Copyright June 15, 2011, 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.
*/
package gov.sandia.cognition.learning.algorithm.ensemble;
import java.util.Random;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.factory.Factory;
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.VectorFactory;
import gov.sandia.cognition.statistics.distribution.DefaultDataDistribution;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for class CategoryBalancedIVotingLearner.
*
* @author Justin Basilico
* @since 3.3.0
*/
public class CategoryBalancedIVotingLearnerTest
{
/** Random number generator to use. */
protected Random random = new Random(211);
/**
* Creates a new test.
*/
public CategoryBalancedIVotingLearnerTest()
{
}
/**
* Test of constructors of class IVotingCategorizerLearner.
*/
@Test
public void testConstructors()
{
Perceptron learner = null;
int maxIterations = IVotingCategorizerLearner.DEFAULT_MAX_ITERATIONS;
double percentToSample = IVotingCategorizerLearner.DEFAULT_PERCENT_TO_SAMPLE;
double proportionIncorrectInSample = IVotingCategorizerLearner.DEFAULT_PROPORTION_INCORRECT_IN_SAMPLE;
boolean voteOutOfBagOnly = IVotingCategorizerLearner.DEFAULT_VOTE_OUT_OF_BAG_ONLY;
CategoryBalancedIVotingLearner<Vector, Boolean> instance =
new CategoryBalancedIVotingLearner<Vector, Boolean>();
assertSame(learner, instance.getLearner());
assertEquals(maxIterations, instance.getMaxIterations());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(proportionIncorrectInSample, instance.getProportionIncorrectInSample(), 0.0);
assertEquals(voteOutOfBagOnly, instance.isVoteOutOfBagOnly());
assertNotNull(instance.getRandom());
learner = new Perceptron();
maxIterations = (int) (maxIterations * 10 * random.nextDouble());
percentToSample = random.nextDouble();
instance = new CategoryBalancedIVotingLearner<Vector, Boolean>(learner,
maxIterations, percentToSample, random);
assertSame(learner, instance.getLearner());
assertEquals(maxIterations, instance.getMaxIterations());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(proportionIncorrectInSample, instance.getProportionIncorrectInSample(), 0.0);
assertEquals(voteOutOfBagOnly, instance.isVoteOutOfBagOnly());
assertSame(random, instance.getRandom());
proportionIncorrectInSample = random.nextDouble();
voteOutOfBagOnly = !voteOutOfBagOnly;
Factory<DefaultDataDistribution<Boolean>> counterFactory =
new DefaultDataDistribution.DefaultFactory<Boolean>();
instance = new CategoryBalancedIVotingLearner<Vector, Boolean>(learner,
maxIterations, percentToSample, proportionIncorrectInSample,
voteOutOfBagOnly, counterFactory, random);
assertSame(learner, instance.getLearner());
assertEquals(maxIterations, instance.getMaxIterations());
assertEquals(percentToSample, instance.getPercentToSample(), 0.0);
assertEquals(proportionIncorrectInSample, instance.getProportionIncorrectInSample(), 0.0);
assertEquals(voteOutOfBagOnly, instance.isVoteOutOfBagOnly());
assertSame(counterFactory, instance.getCounterFactory());
assertSame(random, instance.getRandom());
}
/**
* Test of learn method, of class IVotingCategorizerLearner.
*/
@Test
public void testLearn()
{
CategoryBalancedIVotingLearner<Vector, Boolean> instance =
new CategoryBalancedIVotingLearner<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 < 100; i++)
{
data.add(new DefaultInputOutputPair<Vector, Boolean>(
vectorFactory.createUniformRandom(
14, 0.0, 1.0, random), true));
}
for (int i = 0; i < 2; 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);
}
}
}