Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLinearRegression

stochasticLinearRegression

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

Эта функция реализует стохастическую линейную регрессию. Она поддерживает пользовательские параметры для:

  • скорости обучения
  • коэффициента L2-регуляризации
  • размера мини-батча

Также доступны несколько методов обновления весов:

  • Adam (используется по умолчанию)
  • простой SGD
  • Momentum
  • Nesterov

Использование

Функция используется в два этапа: обучение модели и выполнение прогнозов на новых данных.

  1. Обучение

Для обучения можно использовать такой запрос:

CREATE TABLE IF NOT EXISTS train_data
(
    target Float64,
    x1 Float64,
    x2 Float64
) ENGINE = Memory;

INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;

Здесь нам также нужно вставить данные в таблицу train_data. Количество параметров не фиксировано и зависит только от числа аргументов, переданных в linearRegressionState. Все они должны быть числовыми значениями. Обратите внимание, что столбец с целевым значением (которое мы хотим научить модель предсказывать) передаётся как первый аргумент.

  1. Прогнозирование

После сохранения состояния в таблице мы можем многократно использовать его для прогнозирования или даже объединять с другими состояниями, создавая новые, ещё более качественные модели.

CREATE TABLE IF NOT EXISTS test_data
(
    x1 Float64,
    x2 Float64
) ENGINE = Memory;

INSERT INTO test_data VALUES (10, 0), (20, 0);

WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_data

Запрос вернёт столбец предсказанных значений. Обратите внимание, что первый аргумент evalMLMethod — объект AggregateFunctionState, а следующие — столбцы признаков.

test_data — это таблица, как train_data, но она может не содержать целевое значение.

Примечания

  1. Чтобы объединить две модели, пользователь может создать такой запрос:
SELECT state1 + state2 FROM your_models

где таблица your_models содержит обе модели. Этот запрос вернет новый объект AggregateFunctionState.

  1. Вы можете получить веса созданной модели для собственных нужд, не сохраняя саму модель, если не используется комбинатор -State.
SELECT stochasticLinearRegression(0.01)(target, x1, x2)
FROM train_data

Такой запрос выполнит подгонку модели и вернёт её веса: первыми идут веса, соответствующие параметрам модели, а последний — свободный член. Таким образом, в приведённом выше примере запрос вернёт столбец с 3 значениями.

Синтаксис

stochasticLinearRegression([learning_rate, l2_regularization_coef, mini_batch_size, method])(target, x1, x2, ...)

Аргументы

  • learning_rate — Коэффициент длины шага при выполнении шага градиентного спуска. Слишком высокая скорость обучения может привести к бесконечным весам модели. Значение по умолчанию — 0.00001. Float64
  • l2_regularization_coef — Коэффициент L2-регуляризации, который может помочь предотвратить переобучение. Значение по умолчанию — 0.1. Float64
  • mini_batch_size — Задаёт количество элементов, для которых вычисляются и суммируются градиенты, чтобы выполнить один шаг градиентного спуска. Чистый стохастический спуск использует один элемент, однако небольшие батчи (около 10 элементов) делают шаги градиента более стабильными. Значение по умолчанию — 15. UInt64
  • method — Метод обновления весов: Adam (по умолчанию), SGD, Momentum, Nesterov. Momentum и Nesterov требуют немного больше вычислений и памяти, однако полезны с точки зрения скорости сходимости и стабильности методов стохастического градиента. const String
  • target — Целевое значение (зависимая переменная), которое нужно научиться предсказывать. Должно быть числовым. Float*
  • x1, x2, ... — Значения признаков (независимые переменные). Все должны быть числовыми. Float*

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

Возвращает веса обученной модели линейной регрессии. Первые значения соответствуют параметрам модели, последнее — свободный член. Для предсказаний используйте evalMLMethod. Array(Float64)

Примеры

Обучение модели

DROP TABLE IF EXISTS train_data;

CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;

SELECT count() FROM your_model
1

Прогнозирование

DROP TABLE IF EXISTS train_data;

CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;

DROP TABLE IF EXISTS test_data;

CREATE TABLE test_data (x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO test_data VALUES (10, 0), (20, 0);

WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) > 0 FROM test_data
1
1

Получение весов модели

DROP TABLE IF EXISTS train_data;

CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

SELECT length(stochasticLinearRegression(0.01)(target, x1, x2)) FROM train_data
3

См. также

Navigation