> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по функциям машинного обучения

# Функции машинного обучения

<div id="evalmlmethod">
  ## evalMLMethod
</div>

Для получения прогноза с помощью обученных регрессионных моделей используется функция `evalMLMethod`. См. ссылку в `linearRegression`.

<div id="stochasticlinearregression">
  ## stochasticLinearRegression
</div>

Агрегатная функция [stochasticLinearRegression](/ru/reference/functions/aggregate-functions/stochasticLinearRegression) реализует метод стохастического градиентного спуска с использованием линейной модели и функции потерь MSE. Для предсказания на новых данных используется `evalMLMethod`.

<div id="stochasticlogisticregression">
  ## stochasticLogisticRegression
</div>

Агрегатная функция [stochasticLogisticRegression](/ru/reference/functions/aggregate-functions/stochasticLogisticRegression) реализует метод стохастического градиентного спуска для решения задачи бинарной классификации. Для прогнозирования на новых данных используется `evalMLMethod`.

<div id="naivebayesclassifier">
  ## naiveBayesClassifier
</div>

Классифицирует входной текст с помощью модели Naive Bayes, использующей n-граммы и сглаживание Лапласа. Перед использованием модель необходимо настроить в ClickHouse.

**Синтаксис**

```sql theme={null}
naiveBayesClassifier(model_name, input_text);
```

**Аргументы**

* `model_name` — Имя предварительно настроенной модели. [String](/ru/reference/data-types/string)
  Модель должна быть определена в файлах конфигурации ClickHouse (см. ниже).
* `input_text` — Текст для классификации. [String](/ru/reference/data-types/string)
  Текст обрабатывается в точности в том виде, в котором он передан (с сохранением регистра и пунктуации).

**Возвращаемое значение**

* Идентификатор предсказанного класса в виде беззнакового целого числа. [UInt32](/ru/reference/data-types/int-uint)
  Идентификаторы классов соответствуют категориям, заданным при построении модели.

**Пример**

Классифицируйте текст с помощью модели определения языка:

```sql theme={null}
SELECT naiveBayesClassifier('language', 'How are you?');
```

```response theme={null}
┌─naiveBayesClassifier('language', 'How are you?')─┐
│ 0                                                │
└──────────────────────────────────────────────────┘
```

*Результат `0` может соответствовать английскому, а `1` — французскому; значения классов зависят от ваших обучающих данных.*

***

<div id="implementation-details">
  ### Подробности реализации
</div>

**Алгоритм**
Использует алгоритм классификации Naive Bayes со [сглаживанием Лапласа](https://en.wikipedia.org/wiki/Additive_smoothing) для обработки ранее не встречавшихся n-грамм, опираясь на вероятности n-грамм, как описано [здесь](https://web.stanford.edu/~jurafsky/slp3/4.pdf).

**Ключевые возможности**

* Поддерживает n-граммы любого размера
* Три режима токенизации:
  * `byte`: Работает с сырыми байтами. Каждый байт — один токен.
  * `codepoint`: Работает со скалярными значениями Unicode, декодированными из UTF‑8. Каждая кодовая точка — один токен.
  * `token`: Разбивает по последовательностям пробельных символов Unicode (регулярное выражение `\s+`). Токены — это подстроки без пробельных символов; знаки пунктуации входят в токен, если примыкают к нему (например, "you?" — это один токен).

***

<div id="model-configuration">
  ### Конфигурация модели
</div>

Пример исходного кода для создания модели Naive Bayes для определения языка можно найти [здесь](https://github.com/nihalzp/ClickHouse-NaiveBayesClassifier-Models).

Кроме того, [здесь](https://github.com/nihalzp/ClickHouse-NaiveBayesClassifier-Models/tree/main/models) доступны примеры моделей и связанные с ними файлы конфигурации.

Ниже приведен пример конфигурации модели Naive Bayes в ClickHouse:

```xml theme={null}
<clickhouse>
    <nb_models>
        <model>
            <name>sentiment</name>
            <path>/etc/clickhouse-server/config.d/sentiment.bin</path>
            <n>2</n>
            <mode>token</mode>
            <alpha>1.0</alpha>
            <priors>
                <prior>
                    <class>0</class>
                    <value>0.6</value>
                </prior>
                <prior>
                    <class>1</class>
                    <value>0.4</value>
                </prior>
            </priors>
        </model>
    </nb_models>
</clickhouse>
```

**Параметры конфигурации**

| Параметр   | Описание                                                                                                                    | Пример                                                   | По умолчанию              |
| ---------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------- |
| **name**   | Уникальный идентификатор модели                                                                                             | `language_detection`                                     | *Обязательно*             |
| **path**   | Полный путь к бинарному файлу модели                                                                                        | `/etc/clickhouse-server/config.d/language_detection.bin` | *Обязательно*             |
| **mode**   | Метод токенизации:<br />- `byte`: последовательности байтов<br />- `codepoint`: символы Unicode<br />- `token`: токены слов | `token`                                                  | *Обязательно*             |
| **n**      | Размер n-грамм (режим `token`):<br />- `1`=одно слово<br />- `2`=пары слов<br />- `3`=тройки слов                           | `2`                                                      | *Обязательно*             |
| **alpha**  | Коэффициент сглаживания Лапласа, используемый при классификации для n-грамм, которых нет в модели                           | `0.5`                                                    | `1.0`                     |
| **priors** | Вероятности классов (% документов, относящихся к классу)                                                                    | 60% — класс 0, 40% — класс 1                             | Равномерное распределение |

**Руководство по обучению модели**

**Формат файла**
В человекочитаемом формате для `n=1` и режима `token` модель может выглядеть так:

```text theme={null}
<class_id> <n-gram> <count>
0 excellent 15
1 refund 28
```

Для `n=3` в режиме `codepoint` это может выглядеть так:

```text theme={null}
<class_id> <n-gram> <count>
0 exc 15
1 ref 28
```

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

**Сведения о бинарном формате**
Каждая n-грамма хранится в следующем виде:

1. 4-байтовый `class_id` (UInt, little-endian)
2. 4-байтовая длина `n-gram` в байтах (UInt, little-endian)
3. Необработанные байты `n-gram`
4. 4-байтовый `count` (UInt, little-endian)

**Требования к предварительной обработке**
Перед созданием модели на основе корпуса документов необходимо предварительно обработать документы, чтобы извлечь n-граммы в соответствии с указанными `mode` и `n`. Ниже описаны шаги предварительной обработки:

1. **Добавьте маркеры границ в начало и конец каждого документа в зависимости от режима токенизации:**

   * **Byte**: `0x01` (начало), `0xFF` (конец)
   * **Codepoint**: `U+10FFFE` (начало), `U+10FFFF` (конец)
   * **Token**: `<s>` (начало), `</s>` (конец)

   *Примечание:* `(n - 1)` токенов добавляются и в начало, и в конец документа.

2. **Пример для `n=3` в режиме `token`:**

   * **Документ:** `"ClickHouse is fast"`
   * **После обработки:** `<s> <s> ClickHouse is fast </s> </s>`
   * **Сгенерированные триграммы:**
     * `<s> <s> ClickHouse`
     * `<s> ClickHouse is`
     * `ClickHouse is fast`
     * `is fast </s>`
     * `fast </s> </s>`

Чтобы упростить создание модели для режимов `byte` и `codepoint`, бывает удобно сначала разбить документ на токены (список `byte` для режима `byte` и список `codepoint` для режима `codepoint`). Затем добавьте `n - 1` начальных токенов в начало документа и `n - 1` конечных токенов — в его конец. Наконец, сгенерируйте n-граммы и запишите их в сериализованный файл.

***

{/*AUTOGENERATED_START*/}
