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_data는 train_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.Momentum과Nesterov는 계산과 메모리를 조금 더 필요로 하지만, 수렴 속도와 확률적 경사 방법의 안정성 측면에서 유용할 수 있어요. 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)