Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

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

evalMLMethod

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

stochasticLinearRegression

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

stochasticLogisticRegression

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

naiveBayesClassifier

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

Синтаксис

naiveBayesClassifier(model_name, input_text);

Аргументы

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

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

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

Пример

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

SELECT naiveBayesClassifier('language', 'How are you?');
┌─naiveBayesClassifier('language', 'How are you?')─┐
│ 0                                                │
└──────────────────────────────────────────────────┘

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


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

Алгоритм Использует алгоритм классификации Naive Bayes со сглаживанием Лапласа для обработки ранее не встречавшихся n-грамм, опираясь на вероятности 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.5 1.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-граммы и запишите их в сериализованный файл.


evalMLMethod

Добавленный в: v20.1.0

Применяет обученную модель машинного обучения к входным признакам, чтобы получить прогнозы.

Синтаксис

evalMLMethod(model, x1[, x2, ...])

Аргументы

  • model — Обученная модель машинного обучения. AggregateFunctionState
  • x1, x2, ... — Значения признаков для прогнозирования. Float* или (U)Int*

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

Возвращает предсказанное значение на основе обученной модели. Float64

Примеры

Пример использования

CREATE TABLE trips (pickup_datetime DateTime('UTC'), trip_distance Float64, total_amount Float64) ENGINE = Memory;

-- A fare of 3, plus 2.5 for every unit of distance.
INSERT INTO trips
SELECT toDateTime('2020-01-01 00:00:00', 'UTC') + number * 60, number % 10 + 1, 2.5 * (number % 10 + 1) + 3
FROM numbers(1000);

-- One model per year of the data.
CREATE TABLE models ENGINE = Memory AS
SELECT
    toYear(pickup_datetime) AS year,
    stochasticLinearRegressionState(0.01, 0.0, 10, 'SGD')(total_amount, trip_distance) AS model
FROM trips
GROUP BY year;

SELECT
    trip_distance,
    round(evalMLMethod(model, trip_distance), 2) AS predicted,
    total_amount
FROM trips
LEFT JOIN models ON year = toYear(pickup_datetime)
ORDER BY pickup_datetime
LIMIT 5
┌─trip_distance─┬─predicted─┬─total_amount─┐
│             1 │      4.05 │          5.5 │
│             2 │      6.79 │            8 │
│             3 │      9.53 │         10.5 │
│             4 │     12.28 │           13 │
│             5 │     15.02 │         15.5 │
└───────────────┴───────────┴──────────────┘

naiveBayesClassifier

Добавленный в: v25.11.0

Классифицирует входной текст с помощью словаря NAIVE_BAYES. Возвращает то же предсказанное значение класса, что и dictGet(dictionary_name, class_attribute, input_text), где class_attribute — имя атрибута метки класса, заданного в структуре словаря. В отличие от dictGet, тип результата всегда UInt32, а не объявленный тип атрибута класса, и input_text должен иметь тип String (преобразование типа ключа не выполняется).

Синтаксис

naiveBayesClassifier(dictionary_name, input_text)

Аргументы

  • dictionary_name — Имя словаря со структурой NAIVE_BAYES. String
  • input_text — Текст для классификации. String

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

Идентификатор предсказанного класса. UInt32

Примеры

Классификация текста

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT naiveBayesClassifier('sentiment', 'a good and great film') AS class_id;
┌─class_id─┐
│        0 │
└──────────┘

naiveBayesClassifierWithAllProbs

Добавленный в: v26.7.0

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

Синтаксис

naiveBayesClassifierWithAllProbs(dictionary_name, input_text)

Аргументы

  • dictionary_name — Название словаря со структурой NAIVE_BAYES. String
  • input_text — Текст для классификации. String

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

Массив кортежей (class_id, probability), упорядоченных по убыванию вероятности. Array(Tuple(UInt32, Float64))

Примеры

Вероятности для всех классов

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT arrayMap(p -> (p.1, round(p.2, 4)), naiveBayesClassifierWithAllProbs('sentiment', 'a good and great film')) AS predictions;
┌─predictions─────────────┐
│ [(0,0.9677),(1,0.0323)] │
└─────────────────────────┘

naiveBayesClassifierWithProb

Добавленный в: v26.7.0

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

Синтаксис

naiveBayesClassifierWithProb(dictionary_name, input_text)

Аргументы

  • dictionary_name — Имя словаря со структурой NAIVE_BAYES. String
  • input_text — Текст для классификации. String

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

Кортеж (class&#95;id, probability). Tuple(UInt32, Float64)

Примеры

Классификация с вероятностью

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

WITH naiveBayesClassifierWithProb('sentiment', 'a good and great film') AS p
SELECT (p.1, round(p.2, 4)) AS prediction;
┌─prediction─┐
│ (0,0.9677) │
└────────────┘
Navigation