package quickml.supervised.featureEngineering1; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import quickml.data.AttributesMap; import quickml.data.PredictionMap; import quickml.supervised.PredictiveModel; import quickml.supervised.PredictiveModelBuilder; import quickml.data.instances.InstanceWithAttributesMap; import quickml.supervised.classifier.Classifier; import java.io.Serializable; import java.util.List; import java.util.Map; /** * A PredictiveModelBuilder that attempts to */ public class FeatureEngineeringClassifierBuilder implements PredictiveModelBuilder<FeatureEngineeredClassifier, InstanceWithAttributesMap<?>> { private static final Logger logger = LoggerFactory.getLogger(FeatureEngineeringClassifierBuilder.class); private final PredictiveModelBuilder<? extends Classifier, InstanceWithAttributesMap<?>> wrappedBuilder; private final List<? extends AttributesEnrichStrategy> enrichStrategies; public FeatureEngineeringClassifierBuilder(PredictiveModelBuilder<? extends Classifier, InstanceWithAttributesMap<?>> wrappedBuilder, List<? extends AttributesEnrichStrategy> enrichStrategies) { if (enrichStrategies.isEmpty()) { logger.warn("Won't do anything if no AttributesEnrichStrategies are provided"); } this.wrappedBuilder = wrappedBuilder; this.enrichStrategies = enrichStrategies; } @Override public void updateBuilderConfig(Map<String, Serializable> config) { wrappedBuilder.updateBuilderConfig(config); } @Override public FeatureEngineeredClassifier buildPredictiveModel(Iterable<InstanceWithAttributesMap<?>> trainingData) { List<AttributesEnricher> enrichers = Lists.newArrayListWithExpectedSize(enrichStrategies.size()); for (AttributesEnrichStrategy enrichStrategy : enrichStrategies) { enrichers.add(enrichStrategy.build(trainingData)); } final Iterable<InstanceWithAttributesMap<?>> enrichedTrainingData = Iterables.transform(trainingData, new InstanceEnricher(enrichers)); PredictiveModel<AttributesMap, PredictionMap> predictiveModel = wrappedBuilder.buildPredictiveModel(enrichedTrainingData); return new FeatureEngineeredClassifier(predictiveModel, enrichers); } }