» » Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса

 

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса

Автор: admin от 28-01-2018, 18:35, посмотрело: 408

В каких ситуациях удобно применять предобученные модели машинного обучения внутри ClickHouse? Почему для такой задачи лучше всего подходит метод CatBoost? Не так давно мы провели встречу, посвящённую одновременному использованию этих двух опенсорс-технологий. На встрече выступил разработчик Николай Кочетов — его лекцией мы и решили с вами поделиться. Николай разбирает описанную задачу на примере алгоритма предсказания вероятности покупки.





— Сначала о том, как устроен ClickHouse. ClickHouse — это аналитическая распределенная СУБД. Она столбцовая и с открытым исходным кодом. Самое интересное слово здесь — «столбцовая». Что оно значит?ирисов. Эта выборка хороша тем, что для нее можно обучить маленькое дерево с глубиной два. У нее получается ошибка меньше 5%. Если вам так повезло, что у вас хорошая выборка, вы можете использовать маленькое дерево.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Можно написать запрос, условно, в виде двух функций выбора, и все тоже будет хорошо работать. Ингридиентный бустинг или лес, например. Нужно посчитать сумму или среднее. Я тоже протестировал это для маленького леса, 100 деревьев глубиной 3, в итоге получил качество даже хуже, и работает он в ClickHouse 2,5 секунды.



Не все так плохо, если бы я обучал больше деревьев, качество было бы лучше. Но почему я так не делал? Вот почему.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Вот как выглядит третья часть леса на 100 деревьев. Мне видно, что это очень похоже на лес. И если сделать запрос еще больше, то ClickHouse начинает просто тормозить на парсинге.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
И получили дополнительные недостатки. Помимо того, что запрос очень длинный, мы вынуждены его придумывать, и это может медленно работать в самой БД. К примеру, для деревьев, чтобы применить их, ClickHouse вынужден считать значение в каждом узле дерева. И это неэффективно, ведь мы могли бы посчитать значения только на пути от корня к листу.



Возникает проблема с производительностью, что-то может тормозить и неэффективно работать. Это не то, что мы хотим.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Мы хотели бы более простые вещи: сказать базе, что давай ты сама будешь разбираться с тем, как применять модель, мы просто скажем тебе, что здесь лежит библиотека машинного обучения, а ты мне дай просто функцию modelEvaluate, в которую мы положим список наших признаков. Такой подход, во-первых, обладает всеми преимуществами предыдущего, а во-вторых, перекладывает всю работу на базу данных. И всего есть один недостаток — ваша база должна поддерживать применение данных моделей.



В ClickHouse мы это реализовали для CatBoost, конечно, протестировали. Получили наилучшее качество, при том что я обучал… Время обучения не очень большое, всего 4 секунды. Это сравнимо хорошо по сравнению с лесом 100 глубиной 3.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Что можно видеть в итоге?

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Если вам важно видеть скорость работы, скорость обременения алгоритма, не так важно качество, то можно использовать логистическую регрессию, это все будет быстро работать.



Если вам важно качество, то обучите CatBoost и используйте его. Как же использовать CatBoost в ClickHouse?

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Нужно сделать несколько довольно простых действий. Первое — описать конфигурацию модели. Всего 4 значимых строки. Тип модели — сейчас это CatBoost, возможно, когда-то добавим новое.



Имя модели, которое будет использоваться как параметр функции modelEvaluate().



Расположение обученной модели на файловой системе.



Время обновления. Здесь 0 — это значит, мы не будем перечитывать материал диска. Если стояло бы 5, перечитывали бы каждые 5 секунд.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Далее нужно сказать ClickHouse, где лежит файл с конфигурацией, это нижний параметр на слайде. Там используется звездочка, это значит, что все файлы, что подходят под эту маску, будут загружены.



Также нужно сказать ClickHouse, где лежит сама библиотека машинного обучения, а именно модуль обертки для CatBoost.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Все, когда мы это указали, у нас получается возможность функцию modelEvaluate(), которая принимает первым аргументом имя модели из конфигурационного файла, остальным наши признаки. Причем надо указывать сначала числовые признаки, затем категориальные. Но не беспокойтесь, если вы что-то перепутаете. Во-первых, ClickHouse скажет вам, что у вас ошибка. Во-вторых, вы можете протестировать качество и понять, что все не так, как вы думали.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Чтобы было удобнее тестировать, мы также добавили поддержку чтения из пула данных CatBoost. Наверное, кто-то работал с CatBoost из консоли вместо того, чтобы работать с ним из Python или из R. Тогда вам пришлось бы использовать специальный формат описания вашей выборки. Формат довольно простой — всего два файла. Первый — TSV c тремя колонками, номер признака и его тип: категориальный, числовой или таргет. Плюс дополнительный опциональный параметр имени. Второй файл — сами данные, тоже TSV.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Как раз в ClickHouse мы добавили табличную функцию сatBoostPool, которая принимает эти два файла как аргументы, а возвращает специальную таблицу типа file, временную, из которой можно читать данные.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Я создал маленький CatBoost Pool из трех значений: два признака и таргет. В нем лежит пять строчек. Два — признаки, один — таргет, еще два дополнительно ALIAS.



Также поменялись местами числовая и категориальная фичи. Это сделано для удобства, чтобы можно было подавать параметры в функцию playModule в нужном порядке.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса

Если мы сделаем describe того, что выдаст запрос SELECT *, то значений стало меньше, остались всего два признаки в нужном порядке. Это снова сделано для того, чтобы можно было удобно использовать CatBoost Pool, а именно передавать звездочку в качестве остальных аргументов функции moduleEvaluate.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса

Давайте попробуем что-то применить. Для начала посчитаем вероятность покупки. Что мы будем использовать? В первую очередь, будем считать из CatBoost Pool, использовать функцию moduleEvaluate и передавать звездочку вторым параметром.



Последняя строчка, третья, применение сигмоида.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса

Давайте усложним запрос, посчитаем качество. Напишем предыдущий запрос как подзапрос ClickHouse. Всего мы добавили две значимые строчки, подсчет метрики logloss. Посчитали среднее, получили значение из таблицы.



Меня заинтересовало, насколько быстро такой запрос работает. Я провел три теста и получил вот такой график.

Применение моделей CatBoost внутри ClickHouse. Лекция Яндекса
Слева — чтение из таблицы, справа — из пула. Видно, что столбцы почти одинаковые, разницы почти нет, но чтение из таблицы ClickHouse работает чуть быстрее — видимо, потому, что ClickHouse сжимает данные, и мы не тратим лишнее время на чтение из файла. А CatBoost Pool не сжимает, так что мы тратим время на чтение и на транспонирование признаков. Получается немного быстрее, но все же CatBoost Pool удобно использовать для тестов.



Подведем итоги. Интеграция заключается в том, что мы можем применять обученные модели, использовать CatBoost Pool и читать из него данные, что довольно удобно. В планах — добавить применение других моделей. Также под вопросом задача обучения внутри базы данных, но пока мы не решили, делать ли его. Если будет много запросов — всерьез над этим подумаем.



Если возникают вопросы — можете прислать вопросы мне на почту или в Telegram. Спасибо!

Источник: Хабрахабр

Категория: Программирование

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *