Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLogisticRegression

stochasticLogisticRegression

Introduced in: v20.1.0

此函数实现了随机逻辑回归。 它可用于二元分类问题,支持与 stochasticLinearRegression 相同的自定义参数,用法也完全相同。

用法

此函数的使用分为两步:

  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_data 是一个类似于 train_data 的表,但可以不包含目标值。

语法

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

参数

  • learning_rate — 执行梯度下降时的步长系数。学习率过大可能会导致模型权重无限增大。默认值为 0.00001Float64
  • l2_regularization_coef — L2 正则化系数,有助于防止过拟合。默认值为 0.1Float64
  • mini_batch_size — 设置执行一次梯度下降时用于计算并累加梯度的元素数量。纯随机下降只使用一个元素,但使用较小的批次 (约 10 个元素) 会让梯度下降步骤更稳定。默认值为 15UInt64
  • 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