ClickHouse/docs/ru/guides/apply_catboost_model.md
Sergei Bocharov d52edf15c9 Fixes
2019-10-14 13:34:27 +03:00

251 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Применение модели CatBoost в ClickHouse {#applying-catboost-model-in-clickhouse}
[CatBoost](https://catboost.ai) — открытая программная библиотека разработанная компанией [Яндекс](https://yandex.ru/company/) для машинного обучения, использующая схему градиентного бустинга.
С помощью этой инструкции вы научитесь применять предобученные модели в ClickHouse: в результате вы запустите вывод модели из SQL.
Чтобы применить модель CatBoost в ClickHouse:
1. [Создайте таблицу](#create-table).
2. [Вставьте данные в таблицу](#insert-the-data-to-the-table).
3. [Настройте конфигурацию модели](#configure-the-model).
4. [Запустите вывод модели из SQL](#run-the-model-inference).
Подробнее об обучении моделей в CatBoost, см. [Обучение и применение моделей](https://catboost.ai/docs/features/training.html#training).
## Перед началом работы {#prerequisites}
Если у вас еще нет [Docker](https://docs.docker.com/install/), установите его.
!!! note "Примечание"
[Docker](https://www.docker.com) это программная платформа для создания контейнеров, которые изолируют установку CatBoost и ClickHouse от остальной части системы.
Перед применением модели CatBoost:
**1.** Скачайте [Docker-образ](https://hub.docker.com/r/yandex/tutorial-catboost-clickhouse) из реестра:
```bash
$ docker pull yandex/tutorial-catboost-clickhouse
```
Данный Docker-образ содержит все необходимое для запуска CatBoost и ClickHouse: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
**2.** Проверьте, что Docker-образ успешно скачался:
```bash
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
yandex/tutorial-catboost-clickhouse latest 3e5ad9fae997 19 months ago 1.58GB
```
**3.** Запустите Docker-контейнер основанный на данном образе:
```bash
$ docker run -it -p 8888:8888 yandex/tutorial-catboost-clickhouse
```
**4.** Удалите старую версию СlickHouse:
```bash
// Проверяем версию СlickHouse
$ dpkg -l | grep clickhouse-server
// Останавливаем СlickHouse Server
$ sudo service clickhouse-server stop
// Удаляем СlickHouse
$ sudo apt-get purge clickhouse-server-base
$ sudo apt-get purge clickhouse-server-common
$ sudo apt-get autoremove
// Проверяем, что все успешно удалилось
$ dpkg -l | grep clickhouse-server
```
**5.** Установите СlickHouse:
```bash
$ sudo apt-get install dirmngr
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
$ echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
$ sudo apt-get update
$ sudo apt-get install -y clickhouse-server clickhouse-client
$ sudo service clickhouse-server start
$ clickhouse-client
```
См. подробное описание в [Быстром старте](https://clickhouse.yandex/#quick-start).
## 1. Создайте таблицу {#create-table}
Чтобы создать таблицу в ClickHouse для обучающей выборки:
**1.** Запустите ClickHouse-клиент:
```bash
$ clickhouse client
```
!!! note "Примечание"
ClickHouse-сервер уже запущен внутри Docker-контейнера.
**2.** Создайте таблицу в ClickHouse с помощью следующей команды:
```sql
:) CREATE TABLE amazon_train
(
date Date MATERIALIZED today(),
ACTION UInt8,
RESOURCE UInt32,
MGR_ID UInt32,
ROLE_ROLLUP_1 UInt32,
ROLE_ROLLUP_2 UInt32,
ROLE_DEPTNAME UInt32,
ROLE_TITLE UInt32,
ROLE_FAMILY_DESC UInt32,
ROLE_FAMILY UInt32,
ROLE_CODE UInt32
)
ENGINE = MergeTree(date, date, 8192)
```
## 2. Вставьте данные в таблицу {#insert-the-data-to-the-table}
Чтобы вставить данные:
**1.** Выйдите из клиента ClickHouse:
```sql
:) exit
```
**2.** Загрузите данные:
```bash
$ clickhouse client --host 127.0.0.1 --query 'INSERT INTO amazon_train FORMAT CSVWithNames' < ~/amazon/train.csv
```
**3.** Проверьте, что данные действительно загрузились:
```sql
$ clickhouse client
:) SELECT count() FROM amazon_train
SELECT count()
FROM amazon_train
+-count()-+
| 32769 |
+---------+
```
## 3. Настройте конфигурацию модели {#configure-the-model}
Опциональный шаг: Docker-контейнер содержит все необходимые файлы конфигурации.
Создайте файл с конфигурацией модели в папке `models` (например, `models/config_model.xml`):
```xml
<models>
<model>
<!-- Тип модели. В настоящий момент ClickHouse предоставляет только модель catboost. -->
<type>catboost</type>
<!-- Имя модели. -->
<name>amazon</name>
<!-- Путь к обученной модели. -->
<path>/home/catboost/tutorial/catboost_model.bin</path>
<!-- Интервал обновления. -->
<lifetime>0</lifetime>
</model>
</models>
```
!!! note "Примечание"
Чтобы посмотреть конфигурационный файл в Docker-контейнере, выполните команду `cat models/amazon_model.xml`.
В конфигурации ClickHouse уже прописан параметр:
```xml
// ../../etc/clickhouse-server/config.xml
<models_config>/home/catboost/models/*_model.xml</models_config>
```
Чтобы убедиться в этом, выполните команду `tail ../../etc/clickhouse-server/config.xml`.
## 4. Запустите вывод модели из SQL {#run-the-model-inference}
Для тестирования запустите ClickHouse-клиент `$ clickhouse client`.
Проверьте, что модель работает:
```sql
:) SELECT
modelEvaluate('amazon',
RESOURCE,
MGR_ID,
ROLE_ROLLUP_1,
ROLE_ROLLUP_2,
ROLE_DEPTNAME,
ROLE_TITLE,
ROLE_FAMILY_DESC,
ROLE_FAMILY,
ROLE_CODE) > 0 AS prediction,
ACTION AS target
FROM amazon_train
LIMIT 10
```
!!! note "Примечание"
Функция [modelEvaluate](../query_language/functions/other_functions.md#function-modelevaluate) возвращает кортежи (tuple) с исходными прогнозами по классам для моделей с несколькими классами.
Спрогнозируйте вероятность:
```sql
:) SELECT
modelEvaluate('amazon',
RESOURCE,
MGR_ID,
ROLE_ROLLUP_1,
ROLE_ROLLUP_2,
ROLE_DEPTNAME,
ROLE_TITLE,
ROLE_FAMILY_DESC,
ROLE_FAMILY,
ROLE_CODE) AS prediction,
1. / (1 + exp(-prediction)) AS probability,
ACTION AS target
FROM amazon_train
LIMIT 10
```
!!! note "Примечание"
Подробнее про функцию [exp()](../query_language/functions/math_functions.md).
Посчитайте логистическую функцию потерь (LogLoss) на всей выборке:
```sql
:) SELECT -avg(tg * log(prob) + (1 - tg) * log(1 - prob)) AS logloss
FROM
(
SELECT
modelEvaluate('amazon',
RESOURCE,
MGR_ID,
ROLE_ROLLUP_1,
ROLE_ROLLUP_2,
ROLE_DEPTNAME,
ROLE_TITLE,
ROLE_FAMILY_DESC,
ROLE_FAMILY,
ROLE_CODE) AS prediction,
1. / (1. + exp(-prediction)) AS prob,
ACTION AS tg
FROM amazon_train
)
```
!!! note "Примечание"
Подробнее про функции [avg()](../query_language/agg_functions/reference.md#agg_function-avg), [log()](../query_language/functions/math_functions.md).