이두잉의 AWS 세상

Amazon Forecast

2019.01.16 14:17 - leedoing leedoing

먼저 AWS 서비스 중 앞에 붙는 Amazon/AWS 별칭을 이해하자.

Amazon의 경우는 단독으로 사용 가능한 서비스며, AWS의 경우는 다른 Amazon, AWS의 서비스들과 연계해야 하는 서비스임.(예 Amazon EC2 / AWS Lambda 등)



그러므로 Amazon Forecast는 단독으로 사용할 수 있는 AWS의 시계열 데이터 기반 ML 서비스다. 기타 서비스처럼 Amazon.com에 적용한 ML 경험을 토대로 만든 서비스.

Forecast를 이용하면 ML 지식 없이도 ML을 사용할 수 있다. 본인은 간단한 데이터만 tensorflow/jupyter 끄적여봄.



Forecast는 AWS에서 미리 정의해놓은 1.Case템플릿과 2.알고리즘을 사용하는데, 미리 정의한 템플릿은 아래와 같음.

(https://docs.aws.amazon.com/forecast/latest/dg/howitworks-domains-ds-types.html)

현재 템플릿은 7개가 존재함. 가령 아래 상황일 때 쓰는 폼이라고 생각하면 된다.

CUSTOM: 기본 시계열 데이터

RETAIL: 웹쇼핑몰 상품 판매

INVENTORY_PLANNING: 제품 생산

WORK_FORCE: 인력 수요

EC2 CAPACITY: EC2 사용 갯수...

WEB_TRAFFIC: 네트워크 트래픽

METRICS: 수익/판매(자본?)


모든 템플릿의 필수 Dataset은 "timestamp / Item_id(예측할 대상_string) / data(데이터 수치_float)" 가 들어감. 당연히 그래프를 그려야 뭐가 나올테니... 기본적으로 그래프 생성을 위한 변수들이 필요함. 그리고 추가적으로 각 상황별 템플릿에 맞게 Optional 데이터를 입력할 수 있음. 가령 상품 판매를 예측한다면 추가로 price와 같은 Optional 데이터셋을 넣을 수 있음.


RETAIL을 예로 들면 아래와 같은 데이터셋을 Optional하게 추가할 수 있음.

-----------필수 Dataset-------

TARGET_TIME_SERIES Dataset Type: 

item_id(string) / timestamp(timestamp) / demand(float)

---------------------------------------


------------이하 옵셔널 Dataset-----

RELATED_TIME_SERIES Dataset Type(시계열 연관 데이터): 

price(float) / webpage_hits(float) / stockout_days(float) / inventory_onhand(float) / revenue(float) / in_stock(integer, boolean) / promotion_applied(integer, boolean)


ITEM_METADATA Dataset Type(아이템 메타 데이터): 

category(string) / brand(string) / color(string) / genre(string)

---------------------------------------


알고리즘은 ARIMA, DeepAR+ 등 8가지를 지원하는데 잘 모르겠음 패스.. Document에 각 알고리즘에 대한 설명이 나와있는데... Document에도 기본 취지가 ML 지식이 없는 엔지니어를 위해 만들었다고 하니까, 그냥 넘어가겠다. 다른거 하기도 바쁘다. 경험치가 쌓이면 그 때 봐도 될 것 같음. 

=> 따라서 AWS에서는 AutoML이라는 알고리즘을 제공하는데, 그냥 알아서 알고리즘을 선택해줌.(뭘 선택했는지는 아직 안 알려준다. 언젠가 업데이트 될 듯.)


Document Getting Started 해보자. (Preview 상태라 신청하고 승인이 떨어져야 한다.)

Amazon ForecastDocument에 Getting Started를 통해 아래와 같은 csv 샘플 데이터(시간/전기사용량/사용자)를 통해 실습을 진행할 수 있다. 전처리 된 데이터만 입력하면 된다. 인코딩, 하이퍼파라미터 튜닝 등의 작업은 필요없다. 다만 트레이닝/테스팅 데이터셋은 구분해줘야 한다. 

(https://docs.aws.amazon.com/forecast/latest/dg/getting-started.html)

Document Getting Started 실습에서 알고리즘은 AutoML로 수정했고, 결과 값을 확인하기 위해 트레이닝/테스팅 데이터셋을 1월까지 데이터만 넣어봤다.


Train predictor를 실행하면 Preview라 그런지 약 4시간 정도 트레이닝 시간이 소요된다. (정확한 로그를 확인할 수 없어, 원인 모를 Error가 뜰 수 있으니 알아서 잘 해결하길 바란다. 차분히 확인해보면 데이터 포맷이 잘못된 경우가 많을 듯.)


트레이닝이 끝나면 아래와 같이 RMSE, MAPE와 같은 결과는 받을 수 있는데, 기존 알고있던 평가 수치랑은 조금 다른 듯 하다. 

(http://vldb2018.lncc.br/documents/slides/VLDB2018-tutorial-forecasting-big-time-series.pdf)




Item이랑 기타 변수를 넣고, 예측 값을 구할 수 있다. 


그러나 테스트셋과 직관적인 비교는 할 수 없다. 아직 Forecast Console에서 Data Export가 불가능하며 정식으로 SDK도 지원하지 않는다. 


일단 엑셀 노가다를 해서 테스트 데이터셋과 비교하여 데이터 검증을 했다. 그래프 패턴은 상당히 유사하다.

P90 라인 내 실제값이 존재할 확률이 90%, P50 라인 내 실제값이 존재할 확률이 50%이다. Sample 데이터라 그런가... 예측값이 잘 맞는다. P90은 확률이 높은 대신 보수적으로 예측값을 나타내는 것을 알 수 있다.



실무에서 사용 시 이런 노가다를 할 수 없다. 확인해보니 SageMaker를 통해 Forecast 결과 데이터 Export가 가능하다. 

(https://github.com/aws-samples/amazon-forecast-samples)


이제 실제 데이터 import -> 트레이닝 -> 결과 export -> 그래프를 확인해보겠다. 문제는 실제 데이터가 AWS에서 제공하는 템플릿과는 딱 들어맞지 않는 성격의 데이터인데... 결과가 잘 나올지 모르겠다. (어떻게 보면 웹 트래픽이긴하다...)


일단 트레이닝은 필수 Dataset(item/수치/시간)으로만 사용했다. 참고로 트레이닝 후 배포하고, 배포 완료 메시지를 받았도 바로 lookup이 되지 않는다. (이 x같은 버그 때문에 계속 삽질했다. 다시 생각해도 x빡친다. 마루타 얼리어답터들에게 경의를 표한다.)


git을 따라서 IAM 등 권한을 생성하고, clone을 하면 Sagemaker Jupyter Note/Lab에서 Getting_started_with_Forecat라는 노트북 파일이 생성된다. 쭉 따라하면 Forecast Preview API를 설치할 수 있고, 파일 Import부터 Export까지 잘 설명되어 있다.


이미 AWS 콘솔에서 Import에서 Predictor 배포까지 완료한 상태이므로, Export 관련 API만 확인하고 노트북 파일을 새로 만들었다. 데이터를 Export하고 Jupyter에서 RMSE, MAPE를 구하고 mean, p10 값을 실제값과 비교해봤다. 


!!!!!!! 의미있는 결과가 나왔다. 오차률은 컸으나, 약 13개의 데이터 중 10개 이상의 결과 그래프 패턴이 유사했다.  아직 Preview라서 실 서비스 사용에는 무리가 있으나, 정식 런칭되면 활용성은 충분해보인다.


이제 Optional 데이터셋 등을 통해서 오차율을 줄여야한다. 블로깅은 여기가 끝!


'Machine Learning > Forecast' 카테고리의 다른 글

Amazon Forecast  (0) 2019.01.16