참고: https://www.jmlr.org/papers/volume3/stoppiglia03a/stoppiglia03a.pdf
[서론]
빅데이터를 다루다보면 많은 feature들을 마주하게 됩니다. 많은 feature 들이 다 유의미한 값을 가져서 target값을 예측하는 경우도 있겠지만, 위의 문제점은 차원이 높아져서 학습하는데 어려움이 있고 오버피팅이나 정확한 타겟을 예측 못하는 경우가 발생할 수 있다는 것입니다. 이런 문제들 때문에 무조건 많은 feature 를 써서 고차원 모델을 만드는 것 보다, 때때로 차원을 낮춰주어 모델을 단순화 해주는 것이 normalization 즉 일반화를 더 잘 하는 모델이 되는 경우가 존재합니다.
그렇다면 어떤 feature를 쓰고 어떤 feature를 안쓰는 것이 좋은지 알 수 있는 방법은 무엇이 있을까요? 대표적으로 통계적 추론을 해보는 것이 있습니다. 표본을 모으고 귀무가설을 세우고 가설검정을 해보는 방법이 있겠지만, 이는 시간이 다소 걸리며 통계학을 잘 아는 사람이 아니면 어려움이 있을 수 있습니다. 하지만 이런 어려움 없이 위 논문에서는 기발하며 빠르고 쉽게 적용시킬 수 있는 머신러닝 방법을 제시하였고 도움이 된다생각하여 글을 적어보게 되었습니다.
[본론]
위 논문에서는 간단하게 두가지 방법을 통해서 중요한 feature들을 선택할 수 있다고 말하고 있습니다.
1. 가우시안 분포를 따르는 랜덤한 피쳐를 하나 생성합니다.
2. 각 피쳐의 중요도 (feature importance)를 순서대로 나열합니다.
예를 들어 설명해 보겠습니다. 만약 내가 체인점들의 매출액을 알고있고 음료수 체인점을 오픈하려 합니다. 어디에 오픈하는게 좋을지 머신러닝을 통해 알고싶은데, 어떤 feature 를 써야 좋은 예측값을 주는지 아직까지 알수는 없습니다. 그러기 위해 유의미하다고 생각되는 데이터를 API를 통해 모으게 되었고 아래와 같은 feature들을 모았다고 생각해봅시다.
Variable 에 대해서 간략히 설명을 드리자면 대부분은 KakaoAPI에서 주변 카테고리를 crawling 하였고 거기에 더해서 선택한 위치에서 스타벅스, 맥도날드까지의 거리등이 있습니다. (distance2SB, distance2MD)
위 정보들을 이용하여 내가 알고있던 타겟값 (매출액)을 예측하려 하는데, 분명 예측에 도움이 되는 feature들도 있지만 크게 도움이 되지않아서 모델을 오히려 더 일반화 시켜주지못하고 오버피팅하게 만드는 피처들도 존재할 수 있습니다. 그리하여 유의미한 feature 몇개만 뽑아서 차원을 낮추고 싶을때 가우시안 분포를 따르는 랜덤 feature를 생성하였습니다.
import numpy as np
np.random.normal(size = (1250,1)) # 데이터 갯수가 1250개일 경우
랜덤 feature를 생성 후 feature importance를 순서대로 나열해 보면 위와 같이 나오게 됩니다. 방금 임의로 생성한 dummy 라는 variable 도 들어가 있는것을 확인할 수 있습니다. 이와 같은경우, dummy 아래의 variable 을 지울 때의 리스크는 랜덤 숫자를 지울때의 리스크 보다 낮다고 판단하여 지우고 더 위의 랭킹에 있는 feature들만 사용하여 학습을 하는 것 입니다.(위의 경우 5가지: distance2SB, FD6, PK6, CE7, HP8)
[테스트 결과]
테스트는 매출액을 정확히 예측하는 것이 목표가 아닌, 주변 상권을 예측하는데 의미가 있어서 매출액을 아래와 같이 나눈 후 classification 을 진행 하였습니다.
0~30% = 0
30~60% = 1
60~100% = 2
Percent quantile | target |
0%~30% | 0 |
30%~60% | 1 |
60%~100% | 2 |
Hyperparameter Tune 을 진행하지 않고 간단히 여러 모델들을 사용하여 모델을 비교해 보았습니다. 각자 가장 최적화된 모델은 달랐으나 결과값은 근사치를 보여줬습니다. 이번 실험에서 보여주듯이, dummy variable 아래의 feature 들은 지웠을경우 모델에 큰 risk를 주지 않는것을 확인 할 수 있었고, 오히려 테스트모델을 돌렸을경우 더 일반화가 잘된 결과를 얻을 수 있었습니다.
Accuracy | AUC | F1 | |
All Features (ExtremeRandomTrees) |
0.619 | 0.831 | 0.622 |
Features above dummy (Random Forest) |
0.639 | 0.832 | 0.642 |
[결론]
위의 방법은 정통적인 통계적 접근에 비해 단점도 있지만 분명한 장점도 존재합니다. 대표적인 단점으로는, 위 방법은 error loss를 줄이는데 최적화 되있으며 regression 모델이 아닐경우 적합하지 않을 수 있다는것입니다. 하지만 장점으로는 굉장히 빠르게 테스트를 진행해 볼 수 있다는 것입니다. 특정 지식이 없어도 간단히 랜덤 피처를 생성하여 빠르게 낮은차원의 모델을 일반화하여 비슷한 정확도나 그 이상의 정확도로 만들 수 있다는 것입니다.
'2. Data Science Basics > Python' 카테고리의 다른 글
Python 스크립트 폴더 정리방법 (0) | 2023.11.27 |
---|---|
데이콘 쇼핑몰 지점별 매출액 예측 경진대회 (TOP 10%) (0) | 2022.08.08 |
Dynamic Time Warping을 이용하여 비슷한 주식 clustering 하기 (1) | 2022.03.03 |
Dynamic Time Warping (DTW) (0) | 2022.03.02 |
Python 을 이용하여 MDD / Sharp Ratio 구하기 (0) | 2022.01.03 |
댓글