Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLinearRegression

stochasticLinearRegression

Introduzido em: v20.1.0

Esta função implementa regressão linear estocástica. Ela oferece suporte a parâmetros personalizados para:

  • taxa de aprendizado
  • coeficiente de regularização L2
  • tamanho do mini-batch

Ela também inclui alguns métodos para atualizar os pesos:

  • SGD simples
  • Adam (usado por padrão)
  • Momentum
  • Nesterov

Uso

A função é usada em duas etapas: ajustar o modelo e fazer previsões com novos dados.

  1. Ajuste

Para o ajuste, pode-se usar uma consulta como esta:

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;

Aqui, também precisamos inserir dados na tabela train_data. O número de parâmetros não é fixo; ele depende apenas do número de argumentos passados para linearRegressionState. Todos eles devem ser valores numéricos. Observe que a coluna com o valor-alvo (que queremos aprender a prever) é inserida como o primeiro argumento.

  1. Predição

Após salvar um estado na tabela, podemos usá-lo várias vezes para predição ou até mesmo mesclá-lo com outros estados e criar modelos novos, ainda melhores.

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

A consulta retornará uma coluna de valores previstos. Observe que o primeiro argumento de evalMLMethod é um objeto AggregateFunctionState; os demais são colunas de atributos.

test_data é uma tabela como train_data, mas pode não conter o valor-alvo.

Observações

  1. Para mesclar dois modelos, o usuário pode criar a seguinte consulta:
SELECT state1 + state2 FROM your_models

onde a tabela your_models contém os dois modelos. Esta consulta retornará um novo objeto AggregateFunctionState.

  1. Você pode recuperar os pesos do modelo criado para uso próprio sem salvar o modelo, se nenhum combinador -State for usado.
SELECT stochasticLinearRegression(0.01)(target, x1, x2)
FROM train_data

Uma consulta como esta ajustará o modelo e retornará seus pesos — os primeiros são os pesos, que correspondem aos parâmetros do modelo; o último é o viés. Assim, no exemplo acima, a consulta retornará uma coluna com 3 valores.

Sintaxe

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

Argumentos

  • learning_rate — O coeficiente do tamanho do passo quando é executada uma etapa de descida do gradiente. Uma taxa de aprendizado muito alta pode fazer com que os pesos do modelo se tornem infinitos. O padrão é 0.00001. Float64
  • l2_regularization_coef — Coeficiente de regularização L2, que pode ajudar a evitar sobreajuste. O padrão é 0.1. Float64
  • mini_batch_size — Define o número de elementos cujos gradientes serão calculados e somados para executar um passo de descida do gradiente. A descida estocástica pura usa um único elemento; no entanto, usar batches pequenos (cerca de 10 elementos) torna os passos do gradiente mais estáveis. O padrão é 15. UInt64
  • method — Método para atualizar os pesos: Adam (padrão), SGD, Momentum, Nesterov. Momentum e Nesterov exigem um pouco mais de processamento e memória, mas acabam sendo úteis em termos de velocidade de convergência e estabilidade dos métodos de gradiente estocástico. const String
  • target — Valor-alvo (variável dependente) que se deseja prever. Deve ser numérico. Float*
  • x1, x2, ... — Valores das features (variáveis independentes). Todos devem ser numéricos. Float*

Valor retornado

Retorna os pesos do modelo de regressão linear treinado. Os primeiros valores correspondem aos parâmetros do modelo, e o último é o viés. Use evalMLMethod para fazer predições. Array(Float64)

Exemplos

Treinamento de um modelo

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

Fazendo predições

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

Obtendo os pesos do modelo

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

Veja também

Navigation