> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Эта функция реализует стохастическую логистическую регрессию. Её можно использовать для задач бинарной классификации, она поддерживает те же пользовательские параметры, что и stochasticLinearRegression, и работает аналогично.

# stochasticLogisticRegression

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

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

Эта функция реализует стохастическую логистическую регрессию.
Её можно использовать для задачи бинарной классификации; она поддерживает те же пользовательские параметры, что и [`stochasticLinearRegression`](/docs/ru/reference/functions/aggregate-functions/stochasticLinearRegression), и работает так же.

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

Функция используется в два этапа:

1. Обучение

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

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

INSERT INTO train_data VALUES (-1, 1, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLogisticRegressionState(1.0, 1.0, 10, 'SGD')(target, x1, x2)
AS state FROM train_data;
```

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

Предсказанные метки должны находиться в диапазоне \[-1, 1].

2. Предсказание

Используя сохранённое состояние, можно предсказать вероятность того, что объект имеет метку `1`.

```sql theme={null}
CREATE TABLE IF NOT EXISTS test_data
(
    x1 Float64,
    x2 Float64
) ENGINE = Memory;

INSERT INTO test_data VALUES (1, 1), (9, 9);

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

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

Мы также можем задать порог вероятности, который относит элементы к разным меткам.

```sql theme={null}
SELECT result < 1.1 AND result > 0.5 FROM
(WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) AS result FROM test_data)
```

В результате будут получены метки.

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

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

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

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

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

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

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

**Примеры**

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

```sql title=Query theme={null}
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (-1, 1, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

CREATE TABLE your_model
ENGINE = MergeTree
ORDER BY tuple()
AS SELECT
stochasticLogisticRegressionState(1.0, 1.0, 10, 'SGD')(target, x1, x2)
AS state FROM train_data;

SELECT count() FROM your_model
```

```response title=Response theme={null}
1
```

**Получение прогнозов**

```sql title=Query theme={null}
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (-1, 1, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

CREATE TABLE your_model
ENGINE = MergeTree
ORDER BY tuple()
AS SELECT
stochasticLogisticRegressionState(1.0, 1.0, 10, 'SGD')(target, x1, x2)
AS state FROM train_data;

CREATE TABLE test_data (x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO test_data VALUES (1, 1), (9, 9);

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

```response title=Response theme={null}
1
1
```

**Классификация по пороговому значению**

```sql title=Query theme={null}
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (-1, 1, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

CREATE TABLE your_model
ENGINE = MergeTree
ORDER BY tuple()
AS SELECT
stochasticLogisticRegressionState(1.0, 1.0, 10, 'SGD')(target, x1, x2)
AS state FROM train_data;

CREATE TABLE test_data (x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO test_data VALUES (1, 1), (9, 9);

SELECT result < 1.1 AND result > 0.5
FROM (
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) AS result FROM test_data)
```

```response title=Response theme={null}
0
0
```

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

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