Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLogisticRegression

stochasticLogisticRegression

導入バージョン: v20.1.0

この関数は、確率的ロジスティック回帰を実装します。 二値分類問題に使用でき、stochasticLinearRegression と同じカスタムパラメータをサポートし、同様に動作します。

使用方法

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

  1. 学習

学習には、次のようなクエリを使用できます。

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);

DROP TABLE IF EXISTS your_model;

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] の範囲内でなければなりません。

  1. 予測

保存された状態を使用すると、あるオブジェクトがラベル 1 を持つ確率を予測できます。

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 オブジェクトで、その後に特徴量のカラムが続きます。

確率のしきい値を設定して、要素を異なるラベルに割り当てることもできます。

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_datatrain_data と同様のテーブルですが、目的値を含まない場合があります。

構文

stochasticLogisticRegression([learning_rate, l2_regularization_coef, mini_batch_size, method])(target, x1, x2, ...)

引数

  • learning_rate — 勾配降下法の各ステップにおけるステップ長の係数です。学習率が大きすぎると、モデルの重みが無限大になる可能性があります。デフォルトは 0.00001 です。Float64
  • l2_regularization_coef — 過学習の防止に役立つ場合がある L2 正則化係数です。デフォルトは 0.1 です。Float64
  • mini_batch_size — 勾配降下法の 1 ステップを実行する際に、勾配を計算して合計する要素数を設定します。純粋な確率的勾配降下法では 1 つの要素を使用しますが、小さなバッチ (約 10 要素) を使うと勾配ステップがより安定します。デフォルトは 15 です。UInt64
  • method — 重みの更新方法です: Adam (デフォルト) 、SGDMomentumNesterovMomentumNesterov は計算量とメモリ消費がやや増えますが、収束速度と確率的勾配法の安定性の面で有用です。String
  • target — 二値分類のターゲットラベルです。範囲 [-1, 1] に含まれている必要があります。Float
  • x1, x2, ... — 特徴量の値 (独立変数) です。すべて数値である必要があります。Float

戻り値

学習済みロジスティック回帰モデルの重みを返します。予測には evalMLMethod を使用します。この関数は、オブジェクトがラベル 1 を持つ確率を返します。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, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

DROP TABLE IF EXISTS your_model;

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
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, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

DROP TABLE IF EXISTS your_model;

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;

DROP TABLE IF EXISTS test_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
1
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, 1), (-1, 2, 1), (-1, 3, 2), (1, 8, 9), (1, 9, 8), (1, 10, 10);

DROP TABLE IF EXISTS your_model;

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;

DROP TABLE IF EXISTS test_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)
0
0

関連項目

Navigation