stochasticLinearRegression

stochasticLinearRegression

이 함수는 확률적 선형 회귀(stochastic linear regression)를 구현해요. 학습률, L2 정규화 계수, 미니배치 크기 등 사용자 지정 매개변수를 지원하고, 가중치를 갱신하는 몇 가지 방법(Adam, 단순 SGD, Momentum, Nesterov)이 있어요.

출처: 문서

본문

stochasticLinearRegression은 확률적 선형 회귀를 구현하는 집계 함수예요. v20.1.0에 도입되었어요.

이 함수는 확률적 선형 회귀를 구현해요. 다음을 위한 사용자 지정 매개변수를 지원해요:

  • 학습률(learning rate)
  • L2 정규화 계수
  • 미니배치 크기(mini-batch size)

또한 가중치를 갱신하는 몇 가지 방법이 있어요:

  • Adam (기본값)
  • 단순 SGD
  • Momentum
  • Nesterov

사용법 (Usage)

이 함수는 두 단계로 사용돼요: 모델을 적합(fitting)하고 새 데이터에 대해 예측하기.

1. 적합 (Fitting)

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

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에 전달되는 인자의 개수에만 의존해요. 모두 숫자 값이어야 해요. 예측을 배우고 싶은 대상 값(target value)이 담긴 컬럼을 첫 번째 인자로 넣는다는 점을 유의하세요.

2. 예측 (Predicting)

상태(state)를 테이블에 저장한 뒤에는 예측에 여러 번 사용하거나, 다른 상태와 병합해 더 좋은 새 모델을 만들 수도 있어요.

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 객체이고, 그 뒤에 따라오는 것은 특성(feature) 컬럼들이에요. test_datatrain_data와 비슷한 테이블이지만 대상 값은 포함하지 않을 수 있어요.

참고 사항 (Notes)

  1. 두 모델을 병합하려면 다음과 같은 쿼리를 만들 수 있어요:
SELECT state1 + state2 FROM your_models

여기서 your_models 테이블은 두 모델을 모두 담고 있어요. 이 쿼리는 새 AggregateFunctionState 객체를 반환해요.

  1. -State 콤비네이터를 사용하지 않는다면, 모델을 저장하지 않고 만들어진 모델의 가중치를 가져올 수 있어요.
SELECT stochasticLinearRegression(0.01)(target, x1, x2)
FROM train_data

이런 쿼리는 모델을 적합시키고 그 가중치를 반환해요. 처음 값들은 모델의 매개변수에 대응하고, 마지막 값은 편향(bias)이에요. 그래서 위 예시의 쿼리는 3개의 값을 가진 컬럼을 반환해요.

구문 (Syntax)

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

인자 (Arguments)

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

반환 값 (Returned value)

학습된 선형 회귀 모델의 가중치를 반환해요. 처음 값들은 모델의 매개변수에 대응하고, 마지막 값은 편향이에요. 예측에는 evalMLMethod를 사용해요.

  • 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, 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

참고 (See Also)

더 알아보기 (Learn more)