package com.linkedin.thirdeye.detector.email.filter;
import com.linkedin.thirdeye.datalayer.dto.AnomalyFeedbackDTO;
import com.linkedin.thirdeye.datalayer.dto.MergedAnomalyResultDTO;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import static com.linkedin.thirdeye.constant.AnomalyFeedbackType.*;
import static org.junit.Assert.*;
public class TestPrecisionRecallEvaluator {
@Test
public void testPrecisionAndRecall() throws Exception{
AlertFilter dummyAlertFilter = new DummyAlertFilter();
// test data with 1 positive feedback, 1 negative feedback, other NA feedbacks
List<MergedAnomalyResultDTO> anomalies = getMockMergedAnomalies(7,8);
PrecisionRecallEvaluator evaluator = new PrecisionRecallEvaluator(dummyAlertFilter, anomalies);
assertEquals(evaluator.getWeightedPrecision(), 0.1818, 0.0001);
assertEquals(evaluator.getRecall(), 1, 0.0001);
// test data with 1 positive feedback and others are NA feedbacks
anomalies = getMockMergedAnomalies(6,-1);
evaluator.init(anomalies);
assertEquals(evaluator.getWeightedPrecision(), 0.2, 0.0001);
assertEquals(evaluator.getRecall(), 1, 0.0001);
// test data with 0 positive feedback, 1 negative feedback and others are NA feedbacks
anomalies = getMockMergedAnomalies(-1,6);
evaluator.init(anomalies);
assertTrue(Double.isNaN(evaluator.getRecall()));
}
private List<MergedAnomalyResultDTO> getMockMergedAnomalies(int posIdx, int negIdx){
List<MergedAnomalyResultDTO> anomalyResultDTOS = new ArrayList<>();
int[] ws = {1, 1, 2, 3, 4, 4, 5, 6 ,7};
double[] severity = {2.0, 4.0, 2.0, 3.0, 1.0, 3.0, 2.0,1.0,3.0};
AnomalyFeedbackDTO positiveFeedback = new AnomalyFeedbackDTO();
AnomalyFeedbackDTO negativeFeedback = new AnomalyFeedbackDTO();
positiveFeedback.setFeedbackType(ANOMALY);
negativeFeedback.setFeedbackType(NOT_ANOMALY);
for(int i = 0; i < ws.length; i++){
MergedAnomalyResultDTO anomaly = new MergedAnomalyResultDTO();
anomaly.setStartTime(0l);
anomaly.setEndTime(ws[i] * 3600 * 1000l);
anomaly.setWeight(severity[i]);
if(i == posIdx) {
anomaly.setFeedback(positiveFeedback);
} else if(i == negIdx) {
anomaly.setFeedback(negativeFeedback);
} else {
anomaly.setFeedback(null);
}
anomalyResultDTOS.add(anomaly);
}
return anomalyResultDTOS;
}
}