123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "media/learning/impl/one_hot.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace media {
- namespace learning {
- class OneHotTest : public testing::Test {
- public:
- OneHotTest() {}
- };
- TEST_F(OneHotTest, EmptyLearningTaskWorks) {
- LearningTask empty_task("EmptyTask", LearningTask::Model::kExtraTrees, {},
- LearningTask::ValueDescription({"target"}));
- TrainingData empty_training_data;
- OneHotConverter one_hot(empty_task, empty_training_data);
- EXPECT_EQ(one_hot.converted_task().feature_descriptions.size(), 0u);
- }
- TEST_F(OneHotTest, SimpleConversionWorks) {
- LearningTask task("SimpleTask", LearningTask::Model::kExtraTrees,
- {{"feature1", LearningTask::Ordering::kUnordered}},
- LearningTask::ValueDescription({"target"}));
- TrainingData training_data;
- training_data.push_back({{FeatureValue("abc")}, TargetValue(0)});
- training_data.push_back({{FeatureValue("def")}, TargetValue(1)});
- training_data.push_back({{FeatureValue("ghi")}, TargetValue(2)});
- // Push a duplicate as the last one.
- training_data.push_back({{FeatureValue("def")}, TargetValue(3)});
- OneHotConverter one_hot(task, training_data);
- // There should be one feature for each distinct value in features[0].
- const size_t adjusted_feature_size = 3u;
- EXPECT_EQ(one_hot.converted_task().feature_descriptions.size(),
- adjusted_feature_size);
- EXPECT_EQ(one_hot.converted_task().feature_descriptions[0].ordering,
- LearningTask::Ordering::kNumeric);
- EXPECT_EQ(one_hot.converted_task().feature_descriptions[1].ordering,
- LearningTask::Ordering::kNumeric);
- EXPECT_EQ(one_hot.converted_task().feature_descriptions[2].ordering,
- LearningTask::Ordering::kNumeric);
- TrainingData converted_training_data = one_hot.Convert(training_data);
- EXPECT_EQ(converted_training_data.size(), training_data.size());
- // Exactly one feature should be 1.
- for (size_t i = 0; i < converted_training_data.size(); i++) {
- EXPECT_EQ(converted_training_data[i].features[0].value() +
- converted_training_data[i].features[1].value() +
- converted_training_data[i].features[2].value(),
- 1);
- }
- // Each of the first three training examples should have distinct vectors.
- for (size_t f = 0; f < adjusted_feature_size; f++) {
- int num_ones = 0;
- // 3u is the number of distinct examples. [3] is a duplicate.
- for (size_t i = 0; i < 3u; i++)
- num_ones += converted_training_data[i].features[f].value();
- EXPECT_EQ(num_ones, 1);
- }
- // The features of examples 1 and 3 should be the same.
- for (size_t f = 0; f < adjusted_feature_size; f++) {
- EXPECT_EQ(converted_training_data[1].features[f],
- converted_training_data[3].features[f]);
- }
- // Converting each feature vector should result in the same one as before.
- for (size_t f = 0; f < adjusted_feature_size; f++) {
- FeatureVector converted_feature_vector =
- one_hot.Convert(training_data[f].features);
- EXPECT_EQ(converted_feature_vector, converted_training_data[f].features);
- }
- }
- TEST_F(OneHotTest, NumericsAreNotConverted) {
- LearningTask task("SimpleTask", LearningTask::Model::kExtraTrees,
- {{"feature1", LearningTask::Ordering::kNumeric}},
- LearningTask::ValueDescription({"target"}));
- OneHotConverter one_hot(task, TrainingData());
- EXPECT_EQ(one_hot.converted_task().feature_descriptions.size(), 1u);
- EXPECT_EQ(one_hot.converted_task().feature_descriptions[0].ordering,
- LearningTask::Ordering::kNumeric);
- TrainingData training_data;
- training_data.push_back({{FeatureValue(5)}, TargetValue(0)});
- TrainingData converted_training_data = one_hot.Convert(training_data);
- EXPECT_EQ(converted_training_data[0], training_data[0]);
- FeatureVector converted_feature_vector =
- one_hot.Convert(training_data[0].features);
- EXPECT_EQ(converted_feature_vector, training_data[0].features);
- }
- TEST_F(OneHotTest, UnknownValuesAreZeroHot) {
- LearningTask task("SimpleTask", LearningTask::Model::kExtraTrees,
- {{"feature1", LearningTask::Ordering::kUnordered}},
- LearningTask::ValueDescription({"target"}));
- TrainingData training_data;
- training_data.push_back({{FeatureValue("abc")}, TargetValue(0)});
- training_data.push_back({{FeatureValue("def")}, TargetValue(1)});
- training_data.push_back({{FeatureValue("ghi")}, TargetValue(2)});
- OneHotConverter one_hot(task, training_data);
- // Send in an unknown value, and see if it becomes {0, 0, 0}.
- FeatureVector converted_feature_vector =
- one_hot.Convert(FeatureVector({FeatureValue("jkl")}));
- EXPECT_EQ(converted_feature_vector.size(), 3u);
- for (size_t i = 0; i < converted_feature_vector.size(); i++)
- EXPECT_EQ(converted_feature_vector[i], FeatureValue(0));
- }
- } // namespace learning
- } // namespace media
|