in Java/parkservices/src/main/java/com/amazon/randomcutforest/parkservices/ThresholdedRandomCutForest.java [75:143]
public ThresholdedRandomCutForest(Builder<?> builder) {
forestMode = builder.forestMode;
transformMethod = builder.transformMethod;
Preprocessor.Builder<?> preprocessorBuilder = Preprocessor.builder().shingleSize(builder.shingleSize)
.transformMethod(builder.transformMethod).forestMode(builder.forestMode);
if (builder.forestMode == ForestMode.TIME_AUGMENTED) {
preprocessorBuilder.inputLength(builder.dimensions / builder.shingleSize);
builder.dimensions += builder.shingleSize;
preprocessorBuilder.normalizeTime(builder.normalizeTime);
// force internal shingling for this option
builder.internalShinglingEnabled = Optional.of(true);
} else if (builder.forestMode == ForestMode.STREAMING_IMPUTE) {
checkArgument(builder.shingleSize > 1, " shingle size 1 is not useful in impute");
preprocessorBuilder.inputLength(builder.dimensions / builder.shingleSize);
preprocessorBuilder.imputationMethod(builder.imputationMethod);
preprocessorBuilder.normalizeTime(true);
if (builder.fillValues != null) {
preprocessorBuilder.fillValues(builder.fillValues);
}
// forcing external for the forest to control admittance
builder.internalShinglingEnabled = Optional.of(false);
preprocessorBuilder.useImputedFraction(builder.useImputedFraction.orElse(0.5));
} else {
boolean smallInput = builder.internalShinglingEnabled.orElse(DEFAULT_INTERNAL_SHINGLING_ENABLED);
preprocessorBuilder
.inputLength((smallInput) ? builder.dimensions / builder.shingleSize : builder.dimensions);
}
forest = builder.buildForest();
preprocessorBuilder.weights(builder.weights);
preprocessorBuilder.weightTime(builder.weightTime.orElse(1.0));
preprocessorBuilder.timeDecay(forest.getTimeDecay());
preprocessorBuilder.dimensions(builder.dimensions);
preprocessorBuilder
.stopNormalization(builder.stopNormalization.orElse(Preprocessor.DEFAULT_STOP_NORMALIZATION));
preprocessorBuilder
.startNormalization(builder.startNormalization.orElse(Preprocessor.DEFAULT_START_NORMALIZATION));
preprocessor = preprocessorBuilder.build();
predictorCorrector = new PredictorCorrector(new BasicThresholder(builder.anomalyRate, builder.adjustThreshold));
lastAnomalyDescriptor = new RCFComputeDescriptor(null, 0, builder.forestMode, builder.transformMethod,
builder.imputationMethod);
// multiple (not extremely well correlated) dimensions typically reduce scores
// normalization reduces scores
if (builder.dimensions == builder.shingleSize
|| (forestMode == ForestMode.TIME_AUGMENTED) && (builder.dimensions == 2 * builder.shingleSize)) {
if (builder.transformMethod != TransformMethod.NORMALIZE) {
predictorCorrector.setLowerThreshold(builder.lowerThreshold.orElse(DEFAULT_LOWER_THRESHOLD_ONED));
} else {
predictorCorrector.setLowerThreshold(
builder.lowerThreshold.orElse(BasicThresholder.DEFAULT_LOWER_THRESHOLD_NORMALIZED));
}
predictorCorrector.setHorizon(builder.horizon.orElse(DEFAULT_HORIZON_ONED));
} else {
if (builder.transformMethod != TransformMethod.NORMALIZE) {
predictorCorrector.setLowerThreshold(builder.lowerThreshold.orElse(DEFAULT_LOWER_THRESHOLD));
} else {
predictorCorrector.setLowerThreshold(
builder.lowerThreshold.orElse(BasicThresholder.DEFAULT_LOWER_THRESHOLD_NORMALIZED));
}
predictorCorrector.setHorizon(builder.horizon.orElse(DEFAULT_HORIZON));
}
}