Перейти к основному содержанию
Перейти к основному содержанию

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

evalMLMethod

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

stochasticLinearRegression

Агрегатная функция stochasticLinearRegression реализует метод стохастического градиентного спуска с использованием линейной модели и функции потерь MSE. Использует evalMLMethod для предсказаний на новых данных.

stochasticLogisticRegression

Агрегатная функция stochasticLogisticRegression реализует метод стохастического градиентного спуска для задачи бинарной классификации. Использует evalMLMethod для предсказания по новым данным.

naiveBayesClassifier

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

Синтаксис

naiveBayesClassifier(model_name, input_text);

Аргументы

  • model_name — Имя предварительно настроенной модели. String
    Модель должна быть определена в конфигурационных файлах ClickHouse (см. ниже).
  • input_text — Текст для классификации. String
    Входные данные обрабатываются в точности в том виде, в котором они переданы (регистр и пунктуация сохраняются).

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

  • Предсказанный идентификатор класса (ID) в виде беззнакового целого числа. UInt32
    Идентификаторы классов соответствуют категориям, определённым при построении модели.

Пример

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

SELECT naiveBayesClassifier('language', 'Как дела?');
┌─naiveBayesClassifier('language', 'How are you?')─┐
│ 0                                                │
└──────────────────────────────────────────────────┘

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


Подробности реализации

Алгоритм Использует алгоритм классификации Naive Bayes с сглаживанием Лапласа для обработки ранее не встречавшихся n-грамм на основе их вероятностей, как описано здесь.

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

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

Конфигурация модели

Пример исходного кода для создания модели Naive Bayes для определения языка можно найти здесь.

Кроме того, примеры моделей и соответствующие конфигурационные файлы доступны здесь.

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

<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Метод токенизации:
- byte: последовательности байтов
- codepoint: символы Unicode
- token: токены слов
tokenОбязательный
nРазмер n-граммы (в режиме token):
- 1 = одно слово
- 2 = пары слов
- 3 = тройки слов
2Обязательный
alphaКоэффициент сглаживания Лапласа, используемый при классификации для обработки n-грамм, отсутствующих в модели0.51.0
priorsАприорные вероятности классов (% документов, принадлежащих каждому классу)60% для класса 0, 40% для класса 1Равномерное распределение

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

Формат файла В человекочитаемом формате, при n=1 и режиме token, модель может выглядеть следующим образом:

<class_id> <n-gram> <count>
0 excellent 15
1 refund 28

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

<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-граммы и запишите их в сериализованный файл.