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-грамма хранится в следующем виде:
- 4-байтовый
class_id(UInt, little-endian) - 4-байтовая длина
n-gramв байтах (UInt, little-endian) - Необработанные байты
n-gram - 4-байтовый
count(UInt, little-endian)
Требования к предварительной обработке
Перед созданием модели на основе корпуса документов необходимо предварительно обработать документы, чтобы извлечь n-граммы в соответствии с указанными mode и n. Ниже описаны шаги предварительной обработки:
-
Добавьте маркеры границ в начало и конец каждого документа в зависимости от режима токенизации:
- Byte:
0x01(начало),0xFF(конец) - Codepoint:
U+10FFFE(начало),U+10FFFF(конец) - Token:
<s>(начало),</s>(конец)
Примечание:
(n - 1)токенов добавляются и в начало, и в конец документа. - Byte:
-
Пример для
n=3в режимеtoken:- Документ:
"ClickHouse is fast" - После обработки:
<s> <s> ClickHouse is fast </s> </s> - Сгенерированные триграммы:
<s> <s> ClickHouse<s> ClickHouse isClickHouse is fastis 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— Обученная модель машинного обучения.AggregateFunctionStatex1, 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.Stringinput_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.Stringinput_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.Stringinput_text— Текст для классификации.String
Возвращаемое значение
Кортеж (class_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) │
└────────────┘