> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Эта функция реализует стохастическую линейную регрессию. Она поддерживает настраиваемые параметры скорости обучения, коэффициента L2-регуляризации, размера мини-батча, а также несколько методов обновления весов (Adam, простой SGD, Momentum, Nesterov.)

# stochasticLinearRegression

<div id="stochasticLinearRegression">
  ## stochasticLinearRegression
</div>

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

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

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

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

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

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

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

1. Обучение

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

```sql theme={null}
CREATE TABLE IF NOT EXISTS train_data
(
    param1 Float64,
    param2 Float64,
    target Float64
) ENGINE = Memory;

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`.
Все они должны быть числовыми значениями.
Обратите внимание, что столбец с целевым значением (которое мы хотим научить модель предсказывать) передаётся как первый аргумент.

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

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

```sql theme={null}
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_data
```

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

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

**Примечания**

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

```sq; theme={null}
SELECT state1 + state2 FROM your_models
```

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

2. Вы можете получить веса созданной модели для собственных нужд, не сохраняя саму модель, если не используется комбинатор `-State`.

```sql theme={null}
SELECT stochasticLinearRegression(0.01)(target, param1, param2)
FROM train_data
```

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

**Синтаксис**

```sql theme={null}
stochasticLinearRegression([learning_rate, l2_regularization_coef, mini_batch_size, method])(target, x1, x2, ...)
```

**Аргументы**

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

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

Возвращает веса обученной модели линейной регрессии. Первые значения соответствуют параметрам модели, последнее — свободному члену. Используйте `evalMLMethod` для предсказания. [`Array(Float64)`](/ru/reference/data-types/array)

**Примеры**

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

```sql title=Query theme={null}
CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data
```

```response title=Response theme={null}
Сохраняет состояние обученной модели в таблицу
```

**Построение прогнозов**

```sql title=Query theme={null}
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_data
```

```response title=Response theme={null}
Возвращает предсказанные значения для тестовых данных
```

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

```sql title=Query theme={null}
SELECT stochasticLinearRegression(0.01)(target, x1, x2) FROM train_data
```

```response title=Response theme={null}
Возвращает веса модели без сохранения состояния
```

**См. также**

* [stochasticLogisticRegression](/ru/reference/functions/aggregate-functions/stochasticLogisticRegression)
* [Разница между линейной и логистической регрессией](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression)
