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

> 此函数实现了随机逻辑回归。它可用于二元分类问题，支持与 stochasticLinearRegression 相同的自定义参数，使用方式也相同。

# stochasticLogisticRegression

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

Introduced in: v20.1.0

此函数实现了随机逻辑回归。
它可用于二元分类问题，支持与 [`stochasticLinearRegression`](/zh/reference/functions/aggregate-functions/stochasticLinearRegression) 相同的自定义参数，用法也完全相同。

**用法**

此函数的使用分为两步：

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
stochasticLogisticRegression(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;
```

这里，我们还需要将数据插入到 `train_data` 表中。
参数的数量不是固定的，它只取决于传递给 `logisticRegressionState` 的参数个数。
它们都必须是数值。
请注意，包含目标值 (也就是我们希望学习并预测的值) 的列会作为第一个参数插入。

预测标记必须位于 \[-1, 1] 范围内。

2. 预测

使用已保存的状态，我们可以预测某个对象具有标记 `1` 的概率。

```sql theme={null}
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) 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, param1, param2) 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`](/zh/reference/data-types/float)
* `l2_regularization_coef` — L2 正则化系数，有助于防止过拟合。默认值为 `0.1`。[`Float64`](/zh/reference/data-types/float)
* `mini_batch_size` — 设置执行一次梯度下降时用于计算并累加梯度的元素数量。纯随机下降只使用一个元素，但使用较小的批次 (约 10 个元素) 会让梯度下降步骤更稳定。默认值为 `15`。[`UInt64`](/zh/reference/data-types/int-uint)
* `method` — 权重更新方法：`Adam` (默认) 、`SGD`、`Momentum`、`Nesterov`。`Momentum` 和 `Nesterov` 需要稍多一些计算和内存，但在随机梯度方法的收敛速度和稳定性方面通常更有帮助。[`String`](/zh/reference/data-types/string)
* `target` — 目标二元分类标记。必须在 \[-1, 1] 范围内。[`Float`](/zh/reference/data-types/float)
* `x1, x2, ...` — 特征值 (自变量) 。必须全部为数值类型。[`Float`](/zh/reference/data-types/float)

**返回值**

返回训练后的逻辑回归模型权重。使用 `evalMLMethod` 进行预测，该方法会返回样本标记为 `1` 的概率。[`Array(Float64)`](/zh/reference/data-types/array)

**示例**

**训练模型**

```sql title=Query theme={null}
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
```

```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 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}
使用概率阈值返回二元分类标记
```

**另请参阅**

* [stochasticLinearRegression](/zh/reference/functions/aggregate-functions/stochasticLogisticRegression)
* [线性回归与逻辑回归的区别](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression)
