stochasticLinearRegression
Добавленный в: v20.1.0
Эта функция реализует стохастическую линейную регрессию. Она поддерживает пользовательские параметры для:
- скорости обучения
- коэффициента L2-регуляризации
- размера мини-батча
Также доступны несколько методов обновления весов:
- Adam (используется по умолчанию)
- простой SGD
- Momentum
- Nesterov
Использование
Функция используется в два этапа: обучение модели и выполнение прогнозов на новых данных.
- Обучение
Для обучения можно использовать такой запрос:
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.
Все они должны быть числовыми значениями.
Обратите внимание, что столбец с целевым значением (которое мы хотим научить модель предсказывать) передаётся как первый аргумент.
- Прогнозирование
После сохранения состояния в таблице мы можем многократно использовать его для прогнозирования или даже объединять с другими состояниями, создавая новые, ещё более качественные модели.
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, но она может не содержать целевое значение.
Примечания
- Чтобы объединить две модели, пользователь может создать такой запрос:
SELECT state1 + state2 FROM your_modelsгде таблица your_models содержит обе модели.
Этот запрос вернет новый объект AggregateFunctionState.
- Вы можете получить веса созданной модели для собственных нужд, не сохраняя саму модель, если не используется комбинатор
-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.Float64l2_regularization_coef— Коэффициент L2-регуляризации, который может помочь предотвратить переобучение. Значение по умолчанию —0.1.Float64mini_batch_size— Задаёт количество элементов, для которых вычисляются и суммируются градиенты, чтобы выполнить один шаг градиентного спуска. Чистый стохастический спуск использует один элемент, однако небольшие батчи (около 10 элементов) делают шаги градиента более стабильными. Значение по умолчанию —15.UInt64method— Метод обновления весов:Adam(по умолчанию),SGD,Momentum,Nesterov.MomentumиNesterovтребуют немного больше вычислений и памяти, однако полезны с точки зрения скорости сходимости и стабильности методов стохастического градиента.const Stringtarget— Целевое значение (зависимая переменная), которое нужно научиться предсказывать. Должно быть числовым.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_model1Прогнозирование
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_data1
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_data3См. также