Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

stochasticLogisticRegression

stochasticLogisticRegression

도입 버전: 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_datatrain_data와 같은 테이블(table)이지만 대상 값을 포함하지 않을 수 있습니다.

구문

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개를 사용하지만, 작은 배치(약 10개 요소)를 사용하면 그래디언트 단계가 더 안정적입니다. 기본값은 15입니다. UInt64
  • method — 가중치를 업데이트하는 메서드입니다: Adam(기본값), SGD, Momentum, Nesterov. MomentumNesterov는 계산량과 메모리를 조금 더 사용하지만, 수렴 속도와 확률적 경사 하강 메서드의 안정성 측면에서 유용합니다. 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