package quickml.supervised.featureEngineering1; import quickml.data.AttributesMap; import quickml.data.PredictionMap; import quickml.supervised.classifier.AbstractClassifier; import quickml.supervised.PredictiveModel; import java.util.List; import java.util.Set; /** * A predictive model that wraps another predictive model but modifies the input * Attributes based on one or more "enrichers". This objected is created by a * {@link FeatureEngineeringClassifierBuilder}. */ public class FeatureEngineeredClassifier extends AbstractClassifier { private static final long serialVersionUID = 7279329500376419142L; private final PredictiveModel<AttributesMap, PredictionMap> wrappedPredictiveModel; private final List<AttributesEnricher> attributesEnrichers; public FeatureEngineeredClassifier(PredictiveModel<AttributesMap, PredictionMap> wrappedPredictiveModel, List<AttributesEnricher> attributesEnrichers) { this.wrappedPredictiveModel = wrappedPredictiveModel; this.attributesEnrichers = attributesEnrichers; } @Override public PredictionMap predict(AttributesMap attributes) { AttributesMap enrichedAttributes = enrichAttributes(attributes); return wrappedPredictiveModel.predict(enrichedAttributes); } @Override public PredictionMap predictWithoutAttributes(AttributesMap attributes, Set<String> attributesToIgnore) { AttributesMap enrichedAttributes = enrichAttributes(attributes); return wrappedPredictiveModel.predictWithoutAttributes(enrichedAttributes, attributesToIgnore); } private AttributesMap enrichAttributes(final AttributesMap attributes) { AttributesMap enrichedAttributes = attributes; for (AttributesEnricher attributesEnricher : attributesEnrichers) { enrichedAttributes = attributesEnricher.apply(enrichedAttributes); } return enrichedAttributes; } }