/*
* avenir: Predictive analytic based on Hadoop Map Reduce
* Author: Pranab Ghosh
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package org.avenir.tree;
import org.avenir.util.InfoContentStat;
/**
* Strategies for implementing decision path termination
* @author pranab
*
*/
public class DecisionPathStoppingStrategy {
private String stoppingStrategy;
private int maxDepthLimit = -1;
private double minInfoGainLimit = -1;
private int minPopulationLimit = -1;
public static final String STOP_MAX_DEPTH = "maxDepth";
public static final String STOP_MIN_POPULATION = "minPopulation";
public static final String STOP_MIN_INFO_GAIN = "minInfoGain";
/**
* @param stoppingStrategy
* @param maxDepthLimit
* @param minInfoGainLimit
* @param minPopulationLimit
*/
public DecisionPathStoppingStrategy(String stoppingStrategy, int maxDepthLimit,
double minInfoGainLimit, int minPopulationLimit) {
this.stoppingStrategy = stoppingStrategy;
this.maxDepthLimit = maxDepthLimit;
this.minInfoGainLimit = minInfoGainLimit;
this.minPopulationLimit = minPopulationLimit;
}
/**
* @param stat
* @param parentStat
* @param currentDepth
* @return
*/
public boolean shouldStop(InfoContentStat stat, double parentStat, int currentDepth) {
boolean toBeStopped = false;
if (stoppingStrategy.equals(STOP_MIN_POPULATION)) {
toBeStopped = stat.getTotalCount() < minPopulationLimit;
} else if (stoppingStrategy.equals(STOP_MIN_INFO_GAIN)) {
toBeStopped = (parentStat - stat.getStat()) < minInfoGainLimit;
} else if (stoppingStrategy.equals(STOP_MAX_DEPTH)) {
toBeStopped = currentDepth >= maxDepthLimit;
} else {
throw new IllegalArgumentException("invalid stopping strategy " + stoppingStrategy);
}
return toBeStopped;
}
}