机器学习函数
evalMLMethod
使用 evalMLMethod 函数进行使用拟合的回归模型预测。请参阅 linearRegression 中的链接。
stochasticLinearRegression
stochasticLinearRegression 聚合函数使用线性模型和 MSE 损失函数实现随机梯度下降方法。使用 evalMLMethod 对新数据进行预测。
stochasticLogisticRegression
stochasticLogisticRegression 聚合函数为二元分类问题实现随机梯度下降方法。使用 evalMLMethod 对新数据进行预测。
naiveBayesClassifier
使用 n-gram 和拉普拉斯平滑的朴素贝叶斯模型对输入文本进行分类。在使用之前,必须在 ClickHouse 中配置模型。
语法
参数
model_name— 预配置模型的名称。 字符串 该模型必须在 ClickHouse 的配置文件中定义(见下文)。input_text— 要分类的文本。 字符串 输入将按原样提供(保留大小写/标点符号)。
返回值
- 预测的类 ID,为无符号整数。 UInt32 类 ID 对应于模型构建期间定义的类别。
示例
使用语言检测模型对文本进行分类
结果 0 可能代表英语,而 1 可能表示法语 - 类含义取决于您的训练数据。
实现细节
算法 使用带有 拉普拉斯平滑 的朴素贝叶斯分类算法,基于 此 的 n-gram 概率来处理未见的 n-gram。
主要特性
- 支持任意大小的 n-gram
- 三种分词模式
byte:在原始字节上操作。每个字节是一个 token。codepoint:在从 UTF‑8 解码的 Unicode 标量值上操作。每个码点是一个 token。token:在 Unicode 空白符(正则表达式 \s+)上拆分。Token 是非空白符的子字符串;如果相邻,标点符号是 token 的一部分(例如,“you?” 是一个 token)。
模型配置
您可以在 此处 找到用于创建语言检测的朴素贝叶斯模型的示例源代码。
此外,示例模型及其关联的配置文件可在 此处 找到。
这是 ClickHouse 中朴素贝叶斯模型的示例配置
配置参数
| 参数 | 描述 | 示例 | 默认值 |
|---|---|---|---|
| name | 唯一的模型标识符 | language_detection | 必需 |
| path | 模型二进制文件的完整路径 | /etc/clickhouse-server/config.d/language_detection.bin | 必需 |
| mode | 分词方法 - byte:字节序列- codepoint:Unicode 字符- token:单词 token | token | 必需 |
| n | N-gram 大小(token 模式)- 1=单个单词- 2=单词对- 3=单词三元组 | 2 | 必需 |
| alpha | 在分类过程中使用的拉普拉斯平滑因子,用于解决模型中未出现的 n-gram | 0.5 | 1.0 |
| priors | 类概率(属于某个类的文档的百分比) | 60% 类 0,40% 类 1 | 均等分布 |
模型训练指南
文件格式 以人类可读的格式,对于 n=1 和 token 模式,模型可能如下所示
对于 n=3 和 codepoint 模式,它可能如下所示
ClickHouse 不直接使用人类可读的格式;它必须转换为下面描述的二进制格式。
二进制格式详细信息 每个 n-gram 存储为
- 4 字节
class_id(UInt,小端字节序) - 4 字节
n-gram字节长度(UInt,小端字节序) - 原始
n-gram字节 - 4 字节
count(UInt,小端字节序)
预处理要求 在从文档语料库创建模型之前,必须根据指定的 mode 和 n 提取 n-gram。以下步骤概述了预处理
-
根据分词模式,在每个文档的开头和结尾添加边界标记
- Byte:
0x01(开始),0xFF(结束) - Codepoint:
U+10FFFE(开始),U+10FFFF(结束) - Token:
<s>(开始),</s>(结束)
注意:
(n - 1)个 token 添加到文档的开头和结尾。 - Byte:
-
token模式下n=3的示例- 文档:
"ClickHouse is fast" - 处理为:
<s> <s> ClickHouse is fast </s> </s> - 生成的 trigram
<s> <s> ClickHouse<s> ClickHouse isClickHouse is fastis fast </s>fast </s> </s>
- 文档:
为了简化 byte 和 codepoint 模式的模型创建,可以先将文档标记化为 token(对于 byte 模式,是 byte 的列表;对于 codepoint 模式,是 codepoint 的列表)。然后,在文档的开头添加 n - 1 个开始 token,在结尾添加 n - 1 个结束 token。最后,生成 n-gram 并将其写入序列化文件。