From a7e20555a3abcb61a87f5f80447d23cbf1b1bf33 Mon Sep 17 00:00:00 2001 From: AbdealiJK Date: Sun, 4 Dec 2016 14:34:36 +0530 Subject: [PATCH] tests/cpp: Add tests for rank_metrics.cc --- tests/cpp/metric/test_rank_metric.cc | 121 +++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/cpp/metric/test_rank_metric.cc diff --git a/tests/cpp/metric/test_rank_metric.cc b/tests/cpp/metric/test_rank_metric.cc new file mode 100644 index 000000000..10a612e49 --- /dev/null +++ b/tests/cpp/metric/test_rank_metric.cc @@ -0,0 +1,121 @@ +// Copyright by Contributors +#include + +#include "../helpers.h" + +TEST(Metric, AMS) { + EXPECT_ANY_THROW(xgboost::Metric::Create("ams")); + xgboost::Metric * metric = xgboost::Metric::Create("ams@0.5"); + ASSERT_STREQ(metric->Name(), "ams@0.5"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 0.311, 0.001); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.29710, 0.001); + + delete metric; + metric = xgboost::Metric::Create("ams@0"); + ASSERT_STREQ(metric->Name(), "ams@0"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 0.311, 0.001); +} + +TEST(Metric, AUC) { + xgboost::Metric * metric = xgboost::Metric::Create("auc"); + ASSERT_STREQ(metric->Name(), "auc"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.5, 0.001); + EXPECT_ANY_THROW(GetMetricEval(metric, {0, 1}, {})); + EXPECT_ANY_THROW(GetMetricEval(metric, {0, 0}, {0, 0})); +} + +TEST(Metric, Precision) { + // When the limit for precision is not given, it takes the limit at + // std::numeric_limits::max(); hence all values are very small + // NOTE(AbdealiJK): Maybe this should be fixed to be num_row by default. + xgboost::Metric * metric = xgboost::Metric::Create("pre"); + ASSERT_STREQ(metric->Name(), "pre"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 0, 1e-7); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0, 1e-7); + + delete metric; + metric = xgboost::Metric::Create("pre@2"); + ASSERT_STREQ(metric->Name(), "pre@2"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 0.5, 1e-7); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.5, 0.001); + + EXPECT_ANY_THROW(GetMetricEval(metric, {0, 1}, {})); +} + +TEST(Metric, NDCG) { + xgboost::Metric * metric = xgboost::Metric::Create("ndcg"); + ASSERT_STREQ(metric->Name(), "ndcg"); + EXPECT_ANY_THROW(GetMetricEval(metric, {0, 1}, {})); + EXPECT_NEAR(GetMetricEval(metric, {}, {}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.6509, 0.001); + + delete metric; + metric = xgboost::Metric::Create("ndcg@2"); + ASSERT_STREQ(metric->Name(), "ndcg@2"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.3868, 0.001); + + delete metric; + metric = xgboost::Metric::Create("ndcg@-"); + ASSERT_STREQ(metric->Name(), "ndcg@-"); + EXPECT_NEAR(GetMetricEval(metric, {}, {}), 0, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.6509, 0.001); + + delete metric; + metric = xgboost::Metric::Create("ndcg@2-"); + ASSERT_STREQ(metric->Name(), "ndcg@2-"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.3868, 0.001); +} + +TEST(Metric, MAP) { + xgboost::Metric * metric = xgboost::Metric::Create("map"); + ASSERT_STREQ(metric->Name(), "map"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.5, 0.001); + EXPECT_NEAR(GetMetricEval(metric, {}, {}), 1, 1e-10); + + delete metric; + metric = xgboost::Metric::Create("map@-"); + ASSERT_STREQ(metric->Name(), "map@-"); + EXPECT_NEAR(GetMetricEval(metric, {}, {}), 0, 1e-10); + + delete metric; + metric = xgboost::Metric::Create("map@2"); + ASSERT_STREQ(metric->Name(), "map@2"); + EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}), 1, 1e-10); + EXPECT_NEAR(GetMetricEval(metric, + {0.1, 0.9, 0.1, 0.9}, + { 0, 0, 1, 1}), + 0.25, 0.001); +}