이번 글에서는 시계열 예측을 위한
예측 모형의 종류에 대해서 간략히 알아보겠습니다.

미래를 예측하는 것은 돈을 벌 수 있기 때문에
솔깃하면서도 어려운 과제입니다.
특히.. 미래의 주가를 예측할 수 있으면 얼마나 좋을까요?
이러한 예측 모형에는 다양한 것들이 있는데,
회귀 모형의 Ridge, Lasso
머신러닝 모델로 부스팅계열의 XGBoost, LightGBM 그리고 CatBoost
배깅 계열의 RandomForest,
딥러닝 모델로 LSTM, GRU이 있습니다.
Ridge & Lasso
먼저, Ridge와 Lasso는 회귀 모형으로
한 개 이상의 변수가 만들어내는 일정한 패턴을 활용해서 예측하는 것을 말합니다.
이러한 회귀모형을 기반으로 규제를 적용한 Regularization Model인데요.
Regularization Model...?
예측한 값과 실제값의 차이인 오차를 최소로 하는 회귀 계수를 찾되,

훈련 데이터만 잘 맞추는 High-Variance한 모델이 되지 않도록
변수 앞 곱해지는 회귀계수 크기(기울기)의 제약을 주는 모델입니다.
Ridge와 Lasso 의 큰 차이는 없으나,
Lasso(Least Absolute Shrinkage and Selection Operator)는
람다가 특정값일때, 회귀계수가 완전히 0으로 수렴할 수 있어 변수 선택기능을 가집니다.
Lasso는 회귀계수의 "절대값"의 합의 규제(L1 norm)를 가하는 모델이여서,
그래서 변수 선택시 사용되거나, 간단한 모델을 구축할 수 있지만,
람다가 큰 값으로 설정되어 있을 시, 변수 선택이 제대로 되지 않아,
예측성능이 저하될 수 있으니, 이럴 때는 람다 값을 적게 수정해주시면 됩니다.
Ridge는 회귀계수 "제곱"의 합의 규제(L2 norm)를 가하는 모델입니다.
회귀계수는 모델이 학습하는 파라미터이지만,
람다는 0~양의 무한대의 값이고 CV를 통해 최적의 람다값을 정할 수 있습니다.
어떤 값이 최적의 람다값 또는 범위인지 알수 없어
0.001, 0.01, 0.1, 1, 2, 3 등의 범위를 테스트 해볼 수 있습니다.
다만, 람다의 크기가 너무 크면 학습이 안되는 Underfitting이 일어나거나,
너무 작을 경우에는 Overfitting이 되므로 주의하여야 합니다.
Random Forest
Regression Tree ( Decision Tree 의 한 종류 ) 를 이해하여야 하는데,
관측치들과 예측치의 오차가 가장 적은 특징 분기를 루트노드로 설정한 후,
그에 대한 트리를 만들어간다.
하지만, 모든 관측치에 대해 예측값이 생겨버리면,
Overfitting이 일어날 수 있기 때문에, 몇가지 테크닉을 할 수 있다.
1. leaf가 되기 위한 조건
(min_samples_split, min_samples_leaf)
분기를 하기 위한 최소 관측치 수(min_samples_split), 그리고
leaf가 되기 위한 최소 관측치 수(min_samples_leaf)등으로 Overfitting을 방지할 수 있다.
2. pruning
(ccp_alpha)
tree의 수(leaf의 수)의 상수를 곱한값을 SSR(Sum of Squared Residuals)와 더하여 오차를 계산한다.
ccp_alpha가 커질수록 트리의 크기가 작아진다.
Random Forest 는 샘플 중 임의의 데이터를 뽑아 Bootstrapped Dataset 을 만들고,
임의의 특징 갯수 만큼 의사결정트리를 구축하기 위한 특징을 뽑는다.
n_estimators 의 수만큼 트리를 구축한 다음에
그 결과를 다수결의 원칙 또는 평균으로 집계한다.
이를 Boostrapped Dataset 을 aggreataion 하였다고 하여 Bagging기법이라고 한다.
Boostrapped Dataset에는 Original Dataset 의 중복을 허용하고,
또한, Original Dataset의 1/3 정도는 포함되지 않는다.
이를 Out-of-Bag samples 라고 하는데, 이 데이터를 사용한 점수(oob_score)로
Random Forest 모형의 일반화 성능을 확인가능하다.
XGBoost
XGBoost 를 이해하기 위해서는
Gradient Boosting Macine을 알아야 합니다.
GBM은 예측하고자 하는 값의 평균을 초기 예측값으로 설정한 후,
실제값과 예측값의 차이인 잔차(Residual)를 예측하는 의사결정트리를 모델을 구축합니다.

또 다시 트리를 만들어서 그에 대한 잔차를 예측해서
이를 더하여 예측하는 과정이죠.
소수의 이상치가 있을 경우에는,
예측하려는 잔차의 평균이 치우쳐질 수 있기 때문에 성능이 악화될 수 있습니다.
이러한 GBM을 시초로 효율성을 향상시키기 위한 변형 모델로,
XGBoost(2014), LigthGBM(2017), CatBoost(2017)등 모두
GBM의 효율성을 향상시키기 위해 변형된 모델입니다.
Adaboost는 Boosting 모형의 시초로, GBM이 더 유연하다고 볼 수 있습니다.
하지만, GBM에서도 RF와 마찬가지로 Overfitting 문제가 있을 수 있습니다.
1. Learning Rate
2. Gamma
1. Leanring Rate
따라서, 잔차에 곱해지는 상수로, Learning Rate를 조절하는데,
이 Learning Rate는 0~1 사이의 값이 됩니다.
2. Gamma
XGBoost 의 Prning 은 gamma 를 설정하여, Gain이 gamma 보다 작을 경우
Prning 을 합니다.
3. Lambda
Decision Tree에서는 루트노드를 설정할때,
오차가 가장 적은 특징을 분기로 사용했다면, XGBoost에서는 Gain이 큰 특징을 분기로 사용한다.
Gain이 크다는 것은 양쪽이 고루 분배가 되지 않는다는 것을 의미한다.
Gain ( Left_sim + Right_sim - Root_sim )
Similarty Score = Sum of Residuals, Squared / No. of Res + lambda
Lambda 는 개별 관측치의 영향도를 적게 해줍니다.
따라서 Lambda 가 클수록 Gain이 낮아져 Prning 될 확률이 높아집니다.
그러면, 새로운 설명변수가 주어졌을때,
다수의 의사결졍트리에 따라 예측할 수 있게 되죠.
XGBoost 는 속도와 메모리 사용 측면에서
GBM의 개선된 모델이고
정규화를 사용한 Similarity Score 을 계산하는
모델을 사용합니다.
CatBoost
CatBoost는 Category Boosting의 약자로 범주형 변수에 사용하기 좋은 모델입니다.
범주형 변수, 수치형 모두 타 Boosting기법(ex. GBM, XGBoost, LightGBM)보다 우수한 성능을 보이는데,
이는 CatBoost가 Prediction Shift, Target Leakage 2가지 문제점을 해결하였기 때문입니다.
1. Ordered Boosting 을 사용하여 Prediction Shift 문제를 해결함.
학습 데이터에 대한 조건부 확률과 테스트 데이터 조건부 확률이 다르다.
2. Ordered Target Statistics 를 사용하여 Target Leakage 를 해결함.
타겟 변수가 입력 변수에 새어 나간다.
부스팅 계열(ex. XGBoost)에서 Target Statistic 라는 개념을 사용하여 범주형 변수를 수치형 변수로 변환합니다.
이때, 학습 데이터와 테스트 데이터의 조건부 분포가 다름으로써 생기는 Conditional Shift 가 일어납니다.
동일한 데이터 Set 을 가지고
잔차 예측 모델을 만듬으로써, 정답을 이미 알고 있다는 상황을 가정하기 때문에 target leakage(타겟 누수)가 발생하는데,
그에 반면, CatBoost는 데이터 셋을 분리해 놓고, A 데이터 셋을 가지고 학습한 모델을 사용하여
B 데이터 셋의 의 잔차를 예측함으로써 오버피팅 및 타겟 누수를 방지합니다.
ordered boosting 이라는 개념 등장
훈련데이터 M1 학습 후 이 모델로 다른 데이터의 subset의 잔차를 계산함.
-> 오버피팅, 타겟 누수 방지
기존 부스팅 모델은 2가지 문제점을 가지고 있다.
1. 느린 학습속도
2. 오버피팅
1.느린 학습속도 같은 경우 부스팅 모델이 배깅 모델보다 학습속도가 느린데요. 그 이유는 병렬적으로 수행되는 배깅과 달리
부스팅은 순차적으로 학습해가서 그렇죠.
2. 오버피팅 같은 경우, 잔차를 학습하기 때문에 굉장히 High Variance 한 모형일 수 있습니다.
CatBoost 는 이 두가지 문제점을 해결하기 위해 테크닉들을 사용합니다.
LSTM
이제는 딥러닝 모델을 알아보도록 해요
기존 머신러닝 모델들은 대략 1,000개의 샘플로 학습이 가능하였지만,
복잡한 딥러닝 모델은 평균적으로 10,000 ~ 100,000개의 샘플이 필요하며,
언어 번역과 같은 고차원 문제 같은 경우에는 백만개의 샘플정도가 필요합니다.
LSTM은 음성, 언어, 그리고 시계열 데이터와 같은 시퀀스 데이터에 사용되는 모형으로
Hochreiter & Schmidhuber(1997)에 의해 소개되었다.
GRU
GRU는 LSTM의 구조를 단순화하여 더 적은 가중치를 학습하는 구조입니다.
따라서, 데이터가 충분하지 않을 경우, RNN의 시퀀스가 길어질수록 앞의 정보를 잊어버리는
vanishing gradient 문제를 해결하였지만,
RNN보다 더 많은 가중치를 학습하여야 했습니다.
이에 따라 데이터가 충분하지 않은 경우에는 과적합 문제가 발생하였는데,
LSTM의 gate 수를 줄임으로써 더 적은 파라미터를 학습하는 구조로 변환시키는 것이 GRU 모형입니다.
실험한 결과 가장 좋은 하이퍼파라미터
Lasso : alpha 0.01
Ridge: alpha 3
Adaboost : learning_rate : 0.1, n_estimators : 50
HyperParameter
| Ridge | Lasso | Random Forest | XGB | CatBoost | LSTM | GRU |
| lambda (ex. 1e-3, 1e-2, 1e-1, 1, 2, 3) |
lambda (ex. 1e-3, 1e-2, 1e-1, 1, 2, 3) |
min_samples_split (ex. 20) *default = 2 |
learning_rate (ex. 0.1, 0.5) *default = 0.3 |
learning_rate (ex. 0.1, 0.5) *default = 0.3 |
batch_size (ex. 32, 64, 128, 256) |
|
| min_samples_leaf (ex. 20) *default = 1 |
gamma (ex. 0) *default=0 |
reg_lambda (ex. 0, 1) *default = 0 |
epoch (ex. 1000) |
|||
| ccp_alpha (ex. 1, 2 ) *default = 0 |
reg_lambda (ex. 0, 1) *default = 0 |
n_estimators | early_stopping (ex. 10, 30, 50) |
|||
| boostrap *default=True |
n_estimators | dropout (ex. 0.1, 0.3) |
||||
| max_features *default=n_features |
LSTM units (ex. 16, 32, 64, 128, 256) |
|||||
| n_estimators *default=100 |
||||||
| oob_score *default=False |