> ## 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/ja/reference/functions/aggregate-functions/stochasticLinearRegression) と同じカスタムパラメータをサポートし、同様に動作します。

**使用方法**

この関数は次の 2 つの手順で使用します。

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/ja/reference/data-types/float)
* `l2_regularization_coef` — 過学習の防止に役立つ場合がある L2 正則化係数です。デフォルトは `0.1` です。[`Float64`](/docs/ja/reference/data-types/float)
* `mini_batch_size` — 勾配降下法の 1 ステップを実行する際に、勾配を計算して合計する要素数を設定します。純粋な確率的勾配降下法では 1 つの要素を使用しますが、小さなバッチ (約 10 要素) を使うと勾配ステップがより安定します。デフォルトは `15` です。[`UInt64`](/docs/ja/reference/data-types/int-uint)
* `method` — 重みの更新方法です: `Adam` (デフォルト) 、`SGD`、`Momentum`、`Nesterov`。`Momentum` と `Nesterov` は計算量とメモリ消費がやや増えますが、収束速度と確率的勾配法の安定性の面で有用です。[`String`](/docs/ja/reference/data-types/string)
* `target` — 二値分類のターゲットラベルです。範囲 \[-1, 1] に含まれている必要があります。[`Float`](/docs/ja/reference/data-types/float)
* `x1, x2, ...` — 特徴量の値 (独立変数) です。すべて数値である必要があります。[`Float`](/docs/ja/reference/data-types/float)

**戻り値**

学習済みロジスティック回帰モデルの重みを返します。予測には `evalMLMethod` を使用します。この関数は、オブジェクトがラベル `1` を持つ確率を返します。[`Array(Float64)`](/docs/ja/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/ja/reference/functions/aggregate-functions/stochasticLogisticRegression)
* [線形回帰とロジスティック回帰の違い](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression)
