Написание тестов для обобщенных линейных машин для Shogun с использованием платформы GoogleTest.

Обзор

Я был очень наивен с моей стороны, думая, что будет достаточно просто написать код GLM. Тестирование — это огромная часть процесса разработки, которая гарантирует, что выпущенный или развернутый код всегда работает. Непрерывная интеграция Shogun действительно эффективна и помогает в этом процессе, проверяя каждый запрос на вытягивание по мере его поступления. Все, что вам нужно сделать, это написать несколько тестов с использованием платформы тестирования Google, которые будут проверять целостность ваш код. Все модульные тесты и интеграционные тесты мета-примеров проверяются каждый раз.

Когда я закончил писать базовый код GLM, мне нужно было убедиться, что он работает. Для этой цели я написал базовый модульный тест, который запускал алгоритм GLM на небольшом выборочном наборе данных и сравнивал результаты с исходным кодом pyGLMnet. И не к моему удивлению, значения отличались на тысячи. Мне нужно было что-то сделать, чтобы исправить это, поэтому я сделал все функции общедоступными и выполнил функцию путем анализа и сравнения функций. Сначала я обработал всю математику, которую написал от руки в блокноте, и нашел там несколько ошибок в коде. После этого было несколько других ошибок, связанных с моей интерпретацией библиотеки shogun linalg, которую мне пришлось исправить. Наконец, все было в порядке, код возвращал более или менее одинаковые ответы. И все же ответы были не совсем одинаковыми. Это было просто потому, что набор данных, который я использовал, был очень маленьким, и 1000 итераций было недостаточно для сходимости, поэтому окончательные веса во многом зависели от исходных случайно выбранных весов.

Чтобы решить эту проблему, я устанавливал веса вручную перед обучением алгоритма, и, наконец, каждый раз тест проходил успешно.

После этого я начал добавлять простой тест для проверки самого важного аспекта кода: функции get_gradient(). Я должен был убедиться, что они работают нормально, так как большая часть математики, связанной с кодом, лежала там. Это было относительно проще, так как код уже работал. На этом моя тестовая запись была завершена.

Рассмотрим тесты подробнее:

Генерация данных

Давайте поговорим о генерации данных. pyGLMnet предоставляет нам простую функцию simulate_glm(), которая может сделать это за нас. Все, что мне нужно было сделать, это написать простой скрипт на Python, который будет генерировать функцию обучения и метки. Первое, что я сделал, это инициализировал веса и смещения для генерации данных:

Тест GLM get_gradient()

Этот тест просто сравнивает результаты двух функций вычисления градиента. Сначала я вычислил градиент с помощью функции pyGLMnet:

Затем я сравнил его с градиентами, рассчитанными функцией shogun get_gradient().

Завершить тест GLM

В этом тесте я просто сравнил окончательные предсказанные значения.

Вот как я написал модульные тесты для регрессии Пуассона для Shogun.