Help wanted!

The following content of this documentation page has been machine-translated. But unlike other websites, it is not done on the fly. This translated text lives on GitHub repository alongside main ClickHouse codebase and waits for fellow native speakers to make it more human-readable. You can also use the original English version as a reference.

Help ClickHouse documentation by editing this page

在ClickHouse中应用Catboost模型

CatBoost 是一个由Yandex开发的开源免费机器学习库。

通过这篇指导,您将学会如何用SQL建模,使用ClickHouse预先训练好的模型来推断数据。

在ClickHouse中应用CatBoost模型的一般过程:

  1. 创建数据表.
  2. 将数据插入到表中.
  3. 将CatBoost集成到ClickHouse中 (可跳过)。
  4. 从SQL运行模型推断.

有关训练CatBoost模型的详细信息,请参阅 训练和模型应用.

先决条件

请先安装 Docker

Docker 是一个软件平台,用户可以用来创建独立于其余系统、集成CatBoost和ClickHouse的容器。

在应用CatBoost模型之前:

1. 从容器仓库拉取docker映像 (https://hub.docker.com/r/yandex/tutorial-catboost-clickhouse) :

  1. $ docker pull yandex/tutorial-catboost-clickhouse

此Docker映像包含运行CatBoost和ClickHouse所需的所有内容:代码、运行环境、库、环境变量和配置文件。

2. 确保已成功拉取Docker映像:

  1. $ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. yandex/tutorial-catboost-clickhouse latest 622e4d17945b 22 hours ago 1.37GB

3. 基于此映像启动一个Docker容器:

  1. $ docker run -it -p 8888:8888 yandex/tutorial-catboost-clickhouse

1. 创建数据表

为训练样本创建ClickHouse表:

1. 在交互模式下启动ClickHouse控制台客户端:

  1. $ clickhouse client

ClickHouse服务器已经在Docker容器内运行。

2. 使用以下命令创建表:

  1. :) CREATE TABLE amazon_train
  2. (
  3. date Date MATERIALIZED today(),
  4. ACTION UInt8,
  5. RESOURCE UInt32,
  6. MGR_ID UInt32,
  7. ROLE_ROLLUP_1 UInt32,
  8. ROLE_ROLLUP_2 UInt32,
  9. ROLE_DEPTNAME UInt32,
  10. ROLE_TITLE UInt32,
  11. ROLE_FAMILY_DESC UInt32,
  12. ROLE_FAMILY UInt32,
  13. ROLE_CODE UInt32
  14. )
  15. ENGINE = MergeTree ORDER BY date

3. 从ClickHouse控制台客户端退出:

  1. :) exit

2. 将数据插入到表中

插入数据:

1. 运行以下命令:

  1. $ clickhouse client --host 127.0.0.1 --query 'INSERT INTO amazon_train FORMAT CSVWithNames' < ~/amazon/train.csv

2. 在交互模式下启动ClickHouse控制台客户端:

  1. $ clickhouse client

3. 确保数据已上传:

  1. :) SELECT count() FROM amazon_train
  2. SELECT count()
  3. FROM amazon_train
  4. +-count()-+
  5. | 65538 |
  6. +-------+

3. 将CatBoost集成到ClickHouse中

可跳过。 Docker映像包含运行CatBoost和ClickHouse所需的所有内容。

CatBoost集成到ClickHouse步骤:

1. 构建评估库。

评估CatBoost模型的最快方法是编译 libcatboostmodel.<so|dll|dylib> 库文件.

有关如何构建库文件的详细信息,请参阅 CatBoost文件.

2. 创建一个新目录(位置与名称可随意指定), 如 data 并将创建的库文件放入其中。 Docker映像已经包含了库 data/libcatboostmodel.so.

3. 创建一个新目录来放配置模型, 如 models.

4. 创建一个模型配置文件,如 models/amazon_model.xml.

5. 描述模型配置:

  1. <models>
  2. <model>
  3. <!-- Model type. Now catboost only. -->
  4. <type>catboost</type>
  5. <!-- Model name. -->
  6. <name>amazon</name>
  7. <!-- Path to trained model. -->
  8. <path>/home/catboost/tutorial/catboost_model.bin</path>
  9. <!-- Update interval. -->
  10. <lifetime>0</lifetime>
  11. </model>
  12. </models>

6. 将CatBoost库文件的路径和模型配置添加到ClickHouse配置:

  1. <!-- File etc/clickhouse-server/config.d/models_config.xml. -->
  2. <catboost_dynamic_library_path>/home/catboost/data/libcatboostmodel.so</catboost_dynamic_library_path>
  3. <models_config>/home/catboost/models/*_model.xml</models_config>

4. 运行从SQL推断的模型

测试模型是否正常,运行ClickHouse客户端 $ clickhouse client.

让我们确保模型能正常工作:

  1. :) SELECT
  2. modelEvaluate('amazon',
  3. RESOURCE,
  4. MGR_ID,
  5. ROLE_ROLLUP_1,
  6. ROLE_ROLLUP_2,
  7. ROLE_DEPTNAME,
  8. ROLE_TITLE,
  9. ROLE_FAMILY_DESC,
  10. ROLE_FAMILY,
  11. ROLE_CODE) > 0 AS prediction,
  12. ACTION AS target
  13. FROM amazon_train
  14. LIMIT 10

函数 modelEvaluate 返回带有多类模型的每类原始预测的元组。

执行预测:

  1. :) SELECT
  2. modelEvaluate('amazon',
  3. RESOURCE,
  4. MGR_ID,
  5. ROLE_ROLLUP_1,
  6. ROLE_ROLLUP_2,
  7. ROLE_DEPTNAME,
  8. ROLE_TITLE,
  9. ROLE_FAMILY_DESC,
  10. ROLE_FAMILY,
  11. ROLE_CODE) AS prediction,
  12. 1. / (1 + exp(-prediction)) AS probability,
  13. ACTION AS target
  14. FROM amazon_train
  15. LIMIT 10

查看函数说明 exp()

让我们计算样本的LogLoss:

  1. :) SELECT -avg(tg * log(prob) + (1 - tg) * log(1 - prob)) AS logloss
  2. FROM
  3. (
  4. SELECT
  5. modelEvaluate('amazon',
  6. RESOURCE,
  7. MGR_ID,
  8. ROLE_ROLLUP_1,
  9. ROLE_ROLLUP_2,
  10. ROLE_DEPTNAME,
  11. ROLE_TITLE,
  12. ROLE_FAMILY_DESC,
  13. ROLE_FAMILY,
  14. ROLE_CODE) AS prediction,
  15. 1. / (1. + exp(-prediction)) AS prob,
  16. ACTION AS tg
  17. FROM amazon_train
  18. )

查看函数说明 avg()log()

原始文章