13inline void VerifyBinaryAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
16 Metric* metric = uni_ptr.get();
17 ASSERT_STREQ(metric->Name(),
"auc");
20 EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {0, 1}, {}, {}, data_split_mode), 1.0f, 1e-10);
21 EXPECT_NEAR(GetMetricEval(metric, {0, 1}, {1, 0}, {}, {}, data_split_mode), 0.0f, 1e-10);
22 EXPECT_NEAR(GetMetricEval(metric, {0, 0}, {0, 1}, {}, {}, data_split_mode), 0.5f, 1e-10);
23 EXPECT_NEAR(GetMetricEval(metric, {1, 1}, {0, 1}, {}, {}, data_split_mode), 0.5f, 1e-10);
24 EXPECT_NEAR(GetMetricEval(metric, {0, 0}, {1, 0}, {}, {}, data_split_mode), 0.5f, 1e-10);
25 EXPECT_NEAR(GetMetricEval(metric, {1, 1}, {1, 0}, {}, {}, data_split_mode), 0.5f, 1e-10);
26 EXPECT_NEAR(GetMetricEval(metric, {1, 0, 0}, {0, 0, 1}, {}, {}, data_split_mode), 0.25f, 1e-10);
29 auto p_fmat = EmptyDMatrix();
30 MetaInfo& info = p_fmat->Info();
31 info.labels = linalg::Tensor<float, 2>{{0.0f, 0.0f}, {2}, -1};
32 float auc = metric->Evaluate({1, 1}, p_fmat);
33 ASSERT_TRUE(std::isnan(auc));
34 *info.labels.Data() = HostDeviceVector<float>{};
35 auc = metric->Evaluate(HostDeviceVector<float>{}, p_fmat);
36 ASSERT_TRUE(std::isnan(auc));
38 EXPECT_NEAR(GetMetricEval(metric, {0, 1, 0, 1}, {0, 1, 0, 1}, {}, {}, data_split_mode), 1.0f,
42 EXPECT_NEAR(GetMetricEval(metric, {0.9f, 0.1f, 0.4f, 0.3f}, {0, 0, 1, 1},
43 {1.0f, 3.0f, 2.0f, 4.0f}, {}, data_split_mode),
47 ASSERT_NEAR(GetMetricEval(metric, {0.79523796, 0.5201713, 0.79523796, 0.24273258, 0.53452194,
48 0.53452194, 0.24273258, 0.5201713, 0.79523796, 0.53452194,
49 0.24273258, 0.53452194, 0.79523796, 0.5201713, 0.24273258,
50 0.5201713, 0.5201713, 0.53452194, 0.5201713, 0.53452194},
51 {0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0}, {}, {},
56inline void VerifyMultiClassAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
59 auto metric = uni_ptr.get();
63 EXPECT_NEAR(GetMetricEval(metric,
69 {0, 1, 2}, {}, {}, data_split_mode),
72 EXPECT_NEAR(GetMetricEval(metric,
78 {0, 1, 2}, {1.0f, 1.0f, 1.0f}, {}, data_split_mode),
81 EXPECT_NEAR(GetMetricEval(metric,
87 {2, 1, 0}, {}, {}, data_split_mode),
90 EXPECT_NEAR(GetMetricEval(metric,
96 {2, 0, 1}, {}, {}, data_split_mode),
100 float auc = GetMetricEval(metric,
106 {0, 1, 1}, {}, {}, data_split_mode);
107 EXPECT_TRUE(std::isnan(auc)) << auc;
109 HostDeviceVector<float> predts{
110 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
112 std::vector<float> labels{1.0f, 0.0f, 2.0f, 1.0f};
113 auc = GetMetricEval(metric, predts, labels, {1.0f, 2.0f, 3.0f, 4.0f}, {}, data_split_mode);
114 ASSERT_GT(auc, 0.714);
117inline void VerifyRankingAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
122 EXPECT_NEAR(GetMetricEval(metric.get(), {0.7f, 0.2f, 0.3f, 0.6f}, {1.0f, 0.8f, 0.4f, 0.2f},
123 {}, {0, 4}, data_split_mode),
127 EXPECT_NEAR(GetMetricEval(metric.get(), {0, 1, 2, 0, 1, 2}, {0, 1, 2, 0, 1, 2}, {},
128 {0, 3, 6}, data_split_mode),
131 EXPECT_NEAR(GetMetricEval(metric.get(), {0, 1, 2, 0, 1, 2}, {0, 1, 2, 0, 1, 2},
132 {1.0f, 2.0f}, {0, 3, 6}, data_split_mode),
136 ASSERT_TRUE(std::isnan(
137 GetMetricEval(metric.get(), {0, 1, 2}, {0, 0, 0}, {}, {0, 2, 3}, data_split_mode)));
140 HostDeviceVector<float> predt{
141 0.33935383, 0.5149714, 0.32138085, 1.4547751, 1.2010975, 0.42651367, 0.23104341, 0.83610827,
142 0.8494239, 0.07136688, 0.5623144, 0.8086237, 1.5066161, -4.094787, 0.76887935, -2.4082742};
143 std::vector<bst_group_t> groups{0, 7, 16};
144 std::vector<float> labels{1., 0., 0., 1., 2., 1., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0.};
146 EXPECT_NEAR(GetMetricEval(metric.get(), std::move(predt), labels,
147 {}, groups, data_split_mode),
151inline void VerifyPRAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
155 ASSERT_STREQ(metric->
Name(),
"aucpr");
156 EXPECT_NEAR(GetMetricEval(metric, {0, 0, 1, 1}, {0, 0, 1, 1}, {}, {}, data_split_mode), 1, 1e-10);
158 GetMetricEval(metric, {0.1f, 0.9f, 0.1f, 0.9f}, {0, 0, 1, 1}, {}, {}, data_split_mode), 0.5f,
160 EXPECT_NEAR(GetMetricEval(metric, {0.4f, 0.2f, 0.9f, 0.1f, 0.2f, 0.4f, 0.1f, 0.1f, 0.2f, 0.1f},
161 {0, 0, 0, 0, 0, 1, 0, 0, 1, 1}, {}, {}, data_split_mode),
164 GetMetricEval(metric, {0.87f, 0.31f, 0.40f, 0.42f, 0.25f, 0.66f, 0.95f, 0.09f, 0.10f, 0.97f,
165 0.76f, 0.69f, 0.15f, 0.20f, 0.30f, 0.14f, 0.07f, 0.58f, 0.61f, 0.08f},
166 {0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1}, {}, {},
169 auto auc = GetMetricEval(metric, {0, 1}, {}, {}, {}, data_split_mode);
170 ASSERT_TRUE(std::isnan(auc));
173 EXPECT_NEAR(GetMetricEval(metric,
174 {0.29f, 0.52f, 0.11f, 0.21f, 0.219f, 0.93f, 0.493f, 0.17f, 0.47f, 0.13f,
175 0.43f, 0.59f, 0.87f, 0.007f},
176 {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0},
177 {1, 2, 7, 4, 5, 2.2f, 3.2f, 5, 6, 1, 2, 1.1f, 3.2f, 4.5f},
178 {}, data_split_mode),
182 auc = GetMetricEval(metric, {0, 0.1f, 0.3f, 0.5f, 0.7f}, {1, 1, 0, 0, 0}, {}, {0, 2, 5},
184 ASSERT_TRUE(std::isnan(auc));
188inline void VerifyMultiClassPRAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
194 std::vector<float> labels{1.0f, 0.0f, 2.0f};
195 HostDeviceVector<float> predts{
196 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
198 auc = GetMetricEval(metric.get(), predts, labels, {}, {}, data_split_mode);
199 EXPECT_EQ(auc, 1.0f);
201 auc = GetMetricEval(metric.get(), predts, labels, {1.0f, 1.0f, 1.0f}, {}, data_split_mode);
202 EXPECT_EQ(auc, 1.0f);
204 predts.HostVector() = {
205 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
207 labels = {1.0f, 0.0f, 2.0f, 1.0f};
208 auc = GetMetricEval(metric.get(), predts, labels, {1.0f, 2.0f, 3.0f, 4.0f}, {}, data_split_mode);
209 ASSERT_GT(auc, 0.699);
212inline void VerifyRankingPRAUC(DataSplitMode data_split_mode = DataSplitMode::kRow) {
217 std::vector<float> labels{1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f};
218 std::vector<uint32_t> groups{0, 2, 6};
221 auc = GetMetricEval(metric.get(), {1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f}, labels, {}, groups,
223 EXPECT_EQ(auc, 1.0f);
225 auc = GetMetricEval(metric.get(), {1.0f, 0.5f, 0.8f, 0.3f, 0.2f, 1.0f}, labels, {}, groups,
227 EXPECT_EQ(auc, 1.0f);
229 auc = GetMetricEval(metric.get(), {1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
230 {1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, {}, groups, data_split_mode);
231 ASSERT_TRUE(std::isnan(auc));
234 ASSERT_THROW(GetMetricEval(metric.get(), {1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
235 {1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 3.0f}, {}, groups, data_split_mode),
240 GetMetricEval(metric.get(),
241 {0.87f, 0.31f, 0.40f, 0.42f, 0.25f, 0.66f, 0.95f, 0.09f, 0.10f, 0.97f,
242 0.76f, 0.69f, 0.15f, 0.20f, 0.30f, 0.14f, 0.07f, 0.58f, 0.61f, 0.08f},
243 {0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1}, {},
244 {0, 2, 5, 9, 14, 20},
interface of evaluation metric used to evaluate model performance. This has nothing to do with traini...
Definition metric.h:29
static Metric * Create(const std::string &name, Context const *ctx)
create a metric according to name.
Definition metric.cc:46
virtual const char * Name() const =0
namespace of xgboost
Definition base.h:90
Context MakeCUDACtx(std::int32_t device)
Make a context that uses CUDA if device >= 0.
Definition helpers.h:410
exception class that will be thrown by default logger if DMLC_LOG_FATAL_THROW == 1
Definition logging.h:29
Copyright 2014-2023 by XGBoost Contributors.