Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLinearRegression

stochasticLinearRegression

引入版本:v20.1.0

此函数实现了随机线性回归。 它支持以下自定义参数:

  • 学习率
  • L2 正则化系数
  • 小批次大小

它还提供了几种权重更新方法:

  • Adam (默认)
  • 简单 SGD
  • Momentum
  • Nesterov

用法

该函数的使用分为两步:拟合模型,以及对新数据进行预测。

  1. 拟合

进行拟合时,可以使用如下查询:

CREATE TABLE IF NOT EXISTS train_data
(
    target Float64,
    x1 Float64,
    x2 Float64
) ENGINE = Memory;

INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;

这里,我们还需要将数据插入 train_data 表。 参数个数不是固定的,只取决于传递给 linearRegressionState 的 argument 数量。 它们都必须是数值。 请注意,包含目标值 (即我们希望模型学会预测的值) 的列要作为第一个 argument 插入。

  1. 预测

将状态保存到表中后,我们可以多次将其用于预测,甚至将其与其他状态 merge,创建新的、更好的模型。

CREATE TABLE IF NOT EXISTS test_data
(
    x1 Float64,
    x2 Float64
) ENGINE = Memory;

INSERT INTO test_data VALUES (10, 0), (20, 0);

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

该查询将返回一列预测值。 请注意,evalMLMethod 的第一个参数是 AggregateFunctionState 对象,后续参数为特征列。

test_data 是一个类似于 train_data 的表,但可能不包含目标值。

注意

  1. 要合并两个模型,用户可以创建如下查询:
SELECT state1 + state2 FROM your_models

其中,your_models 表同时包含这两个模型。 该查询将返回一个新的 AggregateFunctionState 对象。

  1. 如果未使用 -State 组合器,你可以在不保存模型的情况下提取已创建模型的权重,供其他用途使用。
SELECT stochasticLinearRegression(0.01)(target, x1, x2)
FROM train_data

这样的查询会拟合模型并返回其权重——前几个值是对应模型参数的权重,最后一个值是偏置项。 因此,在上面的示例中,该查询将返回一列包含 3 个值的数据。

语法

stochasticLinearRegression([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 需要略多一些计算和内存,但在收敛速度和随机梯度方法的稳定性方面通常更有优势。const String
  • target — 要学习预测的目标值 (因变量) 。必须为数值类型。Float*
  • x1, x2, ... — 特征值 (自变量) 。必须全部为数值类型。Float*

返回值

返回训练好的线性回归模型权重。前几个值对应模型参数,最后一个值为偏置项。使用 evalMLMethod 进行预测。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, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, '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, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

DROP TABLE IF EXISTS your_model;

CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, '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 (10, 0), (20, 0);

WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) > 0 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, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);

SELECT length(stochasticLinearRegression(0.01)(target, x1, x2)) FROM train_data
3

另请参阅

Navigation