stochasticLogisticRegression

stochasticLogisticRegression

이 함수는 확률적 로지스틱 회귀(stochastic logistic regression)를 구현해요. 이진 분류 문제에 사용할 수 있고, stochasticLinearRegression과 동일한 사용자 지정 매개변수를 지원하며 같은 방식으로 동작해요.

출처: 문서

본문

stochasticLogisticRegression은 확률적 로지스틱 회귀를 구현하는 집계 함수예요. v20.1.0에 도입되었어요.

이 함수는 확률적 로지스틱 회귀를 구현해요. 이진 분류 문제에 사용할 수 있고, stochasticLinearRegression과 동일한 사용자 지정 매개변수를 지원하며 같은 방식으로 동작해요.

사용법 (Usage)

이 함수는 두 단계로 사용돼요:

1. 적합 (Fitting)

적합을 위해 다음과 같은 쿼리를 사용할 수 있어요:

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] 범위에 있어야 해요.

2. 예측 (Predicting)

저장된 상태를 사용하면 객체가 레이블 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와 비슷한 테이블이지만 대상 값은 포함하지 않을 수 있어요.

구문 (Syntax)

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

인자 (Arguments)

  • learning_rate — 경사 하강 단계를 수행할 때의 스텝 길이 계수예요. 너무 큰 학습률은 모델의 가중치를 무한대로 만들 수 있어요. 기본값은 0.00001이에요. Float64 타입이에요.
  • l2_regularization_coef — 과적합을 막는 데 도움이 되는 L2 정규화 계수예요. 기본값은 0.1이에요. Float64 타입이에요.
  • mini_batch_size — 경사 하강의 한 단계를 수행하기 위해 기울기를 계산해 합산할 원소의 개수를 설정해요. 순수 확률적 하강은 한 원소를 사용하지만, 작은 배치(약 10개 원소)를 사용하면 경사 단계가 더 안정적이에요. 기본값은 15예요. UInt64 타입이에요.
  • method — 가중치를 갱신하는 방법이에요: Adam(기본값), SGD, Momentum, Nesterov. MomentumNesterov는 계산과 메모리를 조금 더 필요로 하지만, 수렴 속도와 확률적 경사 방법의 안정성 측면에서 유용할 수 있어요. String 타입이에요.
  • target — 이진 분류용 대상 레이블이에요. [-1, 1] 범위에 있어야 해요. Float 타입이에요.
  • x1, x2, ... — 특성 값(독립 변수)들이에요. 모두 숫자여야 해요. Float 타입이에요.

반환 값 (Returned value)

학습된 로지스틱 회귀 모델의 가중치를 반환해요. 예측에는 evalMLMethod를 사용해요. 이 함수는 객체가 레이블 1을 가질 확률을 반환해요.

  • Array(Float64) 타입이에요.

예시 (Examples)

모델 학습하기

쿼리:

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

참고 (See Also)

더 알아보기 (Learn more)