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_data는 train_data와 비슷한 테이블이지만 대상 값은 포함하지 않을 수 있어요.
참고 사항 (Notes)
- 두 모델을 병합하려면 다음과 같은 쿼리를 만들 수 있어요:
SELECT state1 + state2 FROM your_models
여기서 your_models 테이블은 두 모델을 모두 담고 있어요. 이 쿼리는 새 AggregateFunctionState 객체를 반환해요.
-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.Momentum과Nesterov는 계산과 메모리를 조금 더 필요로 하지만, 수렴 속도와 확률적 경사 방법의 안정성 측면에서 유용할 수 있어요. 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)