지난 주에 이어 KNIME를 활용한 코스피 방향 예측을 계속 진행해보자. 개별 모델의 결과는 다음과 같았다.
<상승 예측 모델 Test 결과>
| Model | Accuracy | Precision |
| Random Forest | 56.11 | 35.48 |
| SVM | 60.88 | 0 |
| Xgboost | 53.1 | 35.14 |
| Catboost | 58.23 | 41.38 |
| LightGBM | 54.34 | 37.91 |
<하락 예측 모델 Test 결과>
| Model | Accuracy | Precision |
| Random Forest | 60 | 38.6 |
| SVM | 62.3 | 0 |
| Xgboost | 61.06 | 45.68 |
| Catboost | 62.3 | 50 |
| LightGBM | 60.88 | 44.74 |
python으로 진행했을 때는 원문과 동일하게 상승 예측 모델이 우세를 보였으나, KNIME은 하락 예측 모델이 우세를 보이고 있음을 확인할 수 있다. 동일한 데이터를 사용했음에도 결과가 상반되는 이유는 KNIME과 python의 default hyperparameter가 다르기 때문으로 추정된다. 여러 모델을 혼합한 hybrid model을 사용해보고, 최종적으로 결과를 비교해도록 하자.
H2O AutoML
python에서는 hybrid를 위해 voting(soft / hard / weight)과 stacking을 사용했다. KNIME에서 voting과 stacking을 사용하려고 했으나, 직접적으로 지원하는 node를 사용하니 SVM과 동일하게 의미없는 편향된 결과가 나옴을 확인할 수 있었다. 모델을 혼합하기 위해 다른 방법을 모색하던 도중, H2O AutoML에 stacking ensemble 방법을 발견하고 사용해 보았다. H2O를 사용하려면, 먼저 AutoML의 정의에 대해 살펴볼 필요가 있다.
AutoML은 머신러닝의 전체 프로세스를 자동화하는 방법론으로, 데이터 전처리, 특성 공학, 모델 선택, Hyper parameter tuning 등 수작업을 자동화하여 최적의 모델을 구축하도록 설계되어 있다. H2O는 AutoML을 기반으로하는 Framework으로, KNIME 뿐만 아니라 python에서도 패키지를 사용할 수 있다. 전체 Workflow를 보고, 하나씩 내용을 확인해보자.

전체적인 흐름은 개별 모델을 사용할 때와 거의 유사하다. 하지만 H2O를 사용하기 때문에 전용 node가 추가되었고, 단순 학습보다 훨씬 시간이 오래걸린다는 차이점이 있다. 사진을 보면, 상승 모델의 학습이 진행되고 있음을 확인할 수 있다.
Partitioning까지는 8주차에 포스팅 한 내용이기 때문에 생략하고, H2O node들의 특징부터 하나씩 살펴보자.
Table to H2O

Table to H2O는 말 그대로, Table 형식의 데이터를 H2O Frame으로 변환하는 역할을 수행한다. H2O Frame은 dataframe과 유사하지만, 데이터가 메모리에 할당되지 않는다는 차이점이 존재한다. 즉, 실제 데이터를 직접 저장하지 않기 때문에 효율적으로 메모리를 관리하고, 큰 규모의 데이터셋 처리도 원활하게 진행할 수 있다는 장점이 있다.
H2O AutoML Learner

H2O AutoML Learner에서는 Flow variables를 안쓴다면, 3가지의 설정을 지정해야 한다. 첫 번째로, General Settings에 대해 알아보자, General Settings는 Target이 되는 Column과 어떤 feature를 학습에 사용할지 지정할 수 있다. 또한, 학습의 최대 실행 시간(초 단위) 및 최대 모델 수를 지정해서 능동적으로 모델을 조정할 수 있다는 장점이 존재한다. workflow에서는 H2O로 변환된 데이터에서 target을 지정하고, 나머지 데이터 모두를 학습에 활용하였다. 옵션은 seed를 제외하고는 시간이 오래걸리더라도 정확한 결과를 도출해보고 싶어서 지정하지 않았다.

KNIME의 H2O는 Random Forest, Generalized Linear Model, GBM, DL, Stacked Ensemble을 지원한다. python model과 동일한 결과를 도출해보기 위해 deep learning을 배제하고 다른 4가지 모델을 사용해보았다. 가장 좋은 모델을 선택하기 위해서 metric을 지정할 수 있는데, binary classification에서 class의 비율이 크게 차이 나기 때문에 정밀도와 재현율에 기반한 AUPRC(Area Under Precision-Recall Curve)와 개별 클래스별로 에러를 측정하는 Mean Per-Class Error를 사용했다. 처음보는 용어들도 있어서, 제공하는 metric에 대해 간단하게 정리해보았다.
- Auto : Auto는 일반적으로 사용하는 default 설정이다. H2O는 회귀와 분류에 따라 자동으로 metric을 선택한다.
- LogLoss : 분류 문제에 사용되며, 모델이 예측한 확률과 실제 결과 사이의 차를 나타내는 loss function이다.
- MSE(Mean Squared Error) : 회귀 문제에 사용되며, 예측 값과 실제 값 사이의 제곱 오차의 평균을 나타낸다.
- RMSE(Root Mean Squared Error) : MSE의 제곱근으로, 회귀 문제에서 널리 사용된다.
- AUC(Area Under Curve) : ROC Curve 아래의 영역을 나타낸다. 이 값은 0과 1 사이로, 값이 클수록 모델의 성능이 좋다고 해석할 수 있다.
- AUPRC(Area Under the Precision-Recall Curve) : 불균형 데이터셋에서 분류 성능을 평가하는데 사용된다.
- Mean Per-Class Error : 다중 클래스 분류 문제에서 각 클래스에 대한 에러률의 평균을 측정한다.

사용할 Model과 Metric, 교차 검증의 횟수를 정했으면 마지막으로 Advanced Settings를 설정할 수 있다. Early stopping 역시 model의 평가에 사용하는 metric 처럼 사용할 수 있다. 먼저, 앞서 소개한 내용을 제외하고 새로운 내용을 간단히 정리해보았다.
- Lift Top Group : 모델이 예측한 확률 순서대로 그룹화 했을 때, 가장 높은 점수를 받은 그룹(일반적으로 전체의 상위 10% 혹은 20%)에서 실제 정답 비율을 의미한다. 특히 마케팅에서 전체 고객 중 상위 %에게 제안을 보낼 때, 그 그룹에서 실제로 반응할 고객을 분류하는 용도로 사용한다.
- Missclassification : 잘못 분류된 비율로, 낮을수록 좋다.
metric 뿐만 아니라 stopping_tolerance 수치를 지정하면, value보다 오차가 개선되지 않는 경우 훈련을 중지한다. 또한 이동 평균을 기반으로 지정된 숫자 동안 개선되지 않는 경우에도 훈련을 중단시킬 수 있다. 훈련을 위해 Mean per Class Error를 사용했으며, 다른 옵션들은 따로 사용하지 않았다.
아래에 보면 Balance Classes 옵션이 있는데, 현재 분석하려는 데이터가 불균형 데이터셋이므로 over sampling 혹은 under sampling을 활용하면 좋을 것 같다는 생각이 들었다. 단, 수치를 과하게 설정하면 정보 손실 혹은 overfitting이 발생할 수 있기 때문에, 소수 class의 수치만 1.4배로 늘려서 분석을 진행했다.
그 외 효율적 학습을 위한 개별 모델의 최대 학습 시간, column의 가중치를 지정할 수 있지만, 해당 부분은 따로 활용하지 않았다.
AutoML 분석 결과
상승과 하락 예측 모델 모두 동일한 방식으로 결과를 도출하였다. 아래에 사용한 방법 및 하이퍼 파라미터 조정에 따른 결과를 표로 정리해보았다.
| Leader Model | Metric | Class balance | Accuracy | Precision | |
| 상승 | Random Forest | Mean Per Class Error | [1.0, 1.4] | 61.4 | 44.95 |
| 하락 | Stacking Ensemble | AUPRC | [1.0, 1.0] | 61.93 | 40.43 |
상승 예측 모델은 개별 모델과 비교하면 유의미하게 성능이 향상된 것을 확인할 수 있지만, 하락 예측 모델은 오히려 개별 모델보다 성능이 안나오는 문제가 발생했다. 또한 하락 예측모델에서 Class Balance를 조절하면 Bias가 생겨서 하락 여부를 전혀 예측하지 못하는 경우도 존재했는데, 차후 다시 한 번 원인을 탐색해 볼 예정이다. 상승 예측 모델을 기준으로, python에서 default 값을 사용한 Random Forest 보다 AutoML을 통해 tree의 hyper parameter를 조절한 모델이 더 좋은 성능을 보이고 있음을 확인할 수 있다.


금주까지 9주간 학부연구생을 시작하고 처음으로 진행했던 프로젝트를 리뷰해보았다. 진행하면서 이전에 어떤 부분이 부족하고 미흡했는지 확인할 수 있었고, 정리를 하면서 새롭게 알게 된 부분도 다수 존재하였다. 다음 포스팅에서는 코스피 방향 예측 프로젝트 경험을 바탕으로 참가했던 Dacon에서 진행한 제1회 KRX 금융 빅데이터 활용 아이디어 경진대회에 대한 리뷰를 진행할 예정이다. 대회를 통해 어떤 아이디어가 발굴되었는지, 그리고 그것을 어떻게 금융 데이터 분석에 활용했는지 살펴보도록 하자.
'데이터 분석 > 주식 선행연구 분석' 카테고리의 다른 글
| [주식] 기계학습을 활용한 주식 데이터 분석 - 8주차 (0) | 2023.09.03 |
|---|---|
| [주식] 기계학습을 활용한 주식 데이터 분석 - 7주차 (0) | 2023.08.19 |
| [주식] 기계학습을 활용한 주식 데이터 분석 - 6주차 (0) | 2023.08.14 |
| [주식] 기계학습을 활용한 주식 데이터 분석 - 5주차 (0) | 2023.08.08 |
| [주식] 기계학습을 활용한 주식 데이터 분석 - 4주차 (0) | 2023.08.06 |