머신러닝 적용사례 제 2장. Dynamic time warping과 MLflow를 활용한 판매 동향 감지

배경

당신이 3D 인쇄 제품을 만드는 회사를 소유하고 있다고 상상해 보십시오. 재작년에는 전화 케이스를 판매했지만 작년에는 드론 프로펠러의 매우 일관된 수요를 왔기 때문에 드론 프로펠러를 생산하고 판매했습니다. 새해가 다가오는 시점에서 당신은 회사에서 내년에 무엇을 생산해야 하는지 제조팀과 함께 고민하고 있습니다. 추가적으로 3D 프린터를 구입하면 대출을 받아야 하기 때문에 프린터가 항상 100% 가까운 가동률로 돌아가는지 확인해야 합니다.

 

당신은 노련한 경영자이기 때문에 내년에 공장의 생산 능력이 일정하지 않을 것이라는 것을 알고 있습니다. 동안은 생산 능력이 평소보다 높을 때가 있을 것입니다. 예를 들어 임시직 근로자를 추가 고용하는 여름에는 생산 능력이 평소보다 높을 것이고 3D 프린터의 필라멘트 공급망 이슈로 인해 매월 셋째 주에는 평소보다 낮을 것입니다. 아래 차트에서 당신 공장의 생산 능력 예상치를 보시기 바랍니다.


 

당신이 일은 주간 수요가 귀하의 생산 능력에 최대한 근접한 제품을 선택하는 것입니다. 제품의 작년 판매량이 포함된 제품 카탈로그를 보면 올해 판매량이 비슷할 것이라고 예상됩니다.

생산 능력을 초과하는 주간 수요가 있는 제품을 선택하면 고객 주문을 취소해야 하므로 비즈니스에 좋지 않습니다. 반면에 주간 수요가 충분하지 않은 제품을 선택하면 프린터를 최대 용량으로 가동할 없고 대출 상환에 실패할 있습니다.

때때로 선택한 제품의 수요와 공급이 일치하지 않기 때문에 Dynamic time warping 필요하게 됩니다. 수요에 비해 공급이 부족한 주간의 시간이 있지만 기간의 전후 1~2 동안 많은 제품을 생산하여 부족분을 만회할 있다면, 당신의 고객은 신경 쓰지 않을 것입니다.

 

우리가 유클리드 매칭만을 사용하여 판매 데이터와 생산 능력을 비교한다면 돈을 있는 기회를 놓치게 있습니다. 대신에 우리는 Dynamic time warping 사용하여 올해 당신의 회사에 적합한 제품을 선택할 것입니다.

 

제품 판매 Data Set 로드

UCI Data Set Repository 주간 판매 거래 데이터 세트 사용하여 판매 기반 시계열 분석을 수행해 보겠습니다. (출처 : James Tan, jamestansc@suss.edu.sg, Singapore University of Social Sciences)

제품은 행으로 표시되고 연도의 주는 열로 표시됩니다. 값은 주당 판매된 제품의 단위 수량을 나타냅니다. Data set에는 811개의 상품이 있습니다.

 

제품 코드별 최적 시계열까지의 거리 계산

 

계산된 Dynamic time warping “거리열을 사용하여 히스토그램에서 DTW 거리 분포를 있습니다.

 

히스토그램에서 우리는 최적의 판매 추세에 가장 가까운 제품 코드(, 계산된 DTW 거리가 가장 작은 제품) 식별할 있습니다. 중에서 가장 가까운 것을 표시해 봅시다.

 

쿼리와 함께, 최적 판매 추세에서 가장 멀리 떨어져 있는 제품 코드에 대한 쿼리를 실행함으로써, 추세에서 가장 가까운 제품과 가장 제품을 확인할 있었습니다. 제품을 모두 표시하고 차이점을 살펴보겠습니다.

보시다시피 제품 #675(주황색 삼각형 표시) 최적의 판매 추세와 가장 일치하지만 절대 주간 판매는 우리가 원하는 것보다 낮습니다(나중에 수정하겠습니다).

결과는 가장 가까운 DTW 거리를 가진 제품이 우리가 비교하는 메트릭을 어느 정도 반영하는 고점과 저점을 가질 것으로 예상하기 때문에 의미가 있습니다. (물론 제품의 정확한 시간 지표는 Dynamic time warping으로 인해 주별로 다를 있습니다.)

반대로 제품 #716(녹색 표시) 가장 일치하지 않는 제품으로 거의 변동성이 없습니다.

 

최적의 제품 찾기: 작은 DTW 거리와 유사한 절대 판매량

이제 공장의 예상 생산량(“최적 판매 추세“) 가장 가까운 제품 목록을 개발했으므로 DTW 거리가 작고 절대 판매 수치가 유사한 제품으로 필터링할 있습니다. 가지 좋은 후보는 DTW 거리가 6.86이고 모집단 중앙값 거리가 7.89이며 최적의 추세를 매우 밀접하게 추적하는 제품 #202입니다.

 

MLflow 아티팩트를 사용하여 최고 / 최악의 제품 추적

MLflow 실험, 재현성 배포를 포함한 머신 러닝 수명 주기를 관리하기 위한 오픈 소스 플랫폼입니다. MLflow 설계는 우리가 수행하는 실험의 모든 입력과 출력을 체계적이고 재현 가능한 방식으로 기록하는 기능을 중심으로 합니다. “실행이라고 하는 데이터를 통과할 때마다 실험을 기록할 있습니다.

l  매개변수: 모델에 대한 입력

l  Metrics: 우리 모델의 결과물 또는 우리 모델의 성공 척도

l  인공물: 우리 모델에 의해 생성된 모든 파일예를 들어, PNG 플롯 또는 CSV 데이터 출력

l  모델: 나중에 다시 로드하여 예측을 제공하는 사용할 있는 모델 자체

 

우리의 경우 시계열 데이터에 적용할 있는 최대 왜곡 양인Stretch factor 변경하면서 데이터에 대해 Dynamic time warping 알고리즘을 여러 실행하는 사용할 있습니다. MLflow 실험을 시작하고 mlflow.log_param(), mlflow.log_metric(), mlflow.log_artifact() mlflow.log_model() 사용하여 쉽게 로깅할 있도록 하기 위해 다음 코드를 사용하여 기본 기능을 래핑합니다.

아래의 축약된 코드를 참조하시기 바랍니다.

데이터를 실행할 때마다 사용 중인 ” stretch factor” 매개변수의 로그와 DTW 거리 측정항목의 z-점수를 기반으로 이상치(outlier) 분류된 제품의 로그를 만들었습니다. DTW 거리의 히스토그램의 아티팩트(파일) 저장할 있었습니다.

 

MLflow 실험의 로그를 저장했으므로 이제 돌아가서 결과를 검토할 있습니다. Databricks 노트북에서 오른쪽 모서리에 있는실행아이콘을 선택하여 실행의 결과를 보고 비교할 있습니다. 당연하게도신축률 높이면 거리측정 항목이 감소합니다. 직관적으로 이것은 의미가 있습니다. 알고리즘에 시간 인덱스를 앞뒤로 휘게 있는 유연성을 많이 부여하면 데이터에 맞는 것을 찾을 있습니다. 본질적으로 우리는 편차를 위해 약간의 편향을 교환했습니다.

 

MLflow 로깅 모델

MLflow에는 실험 매개변수, 메트릭 아티팩트(: 플롯 또는 CSV 파일) 기록할 있을 뿐만 아니라 머신 러닝 모델도 기록할 있습니다. MLflow 모델은 다른 MLflow 도구 기능과의 호환성을 보장하는 일관된 API 준수하도록 구성된 폴더입니다. 상호 운용성은 매우 강력하여 모든 Python 모델을 다양한 유형의 프로덕션 환경에 빠르게 배포할 있습니다.

 

MLflow에는 scikit-learn, Spark MLlib, PyTorch, TensorFlow 등을 포함하여 가장 널리 사용되는 많은 머신 러닝 라이브러리에 대한 다수의 공통 모델 “flavors” 사전 로드 되어 있습니다. 블로그 게시물 설명된 것처럼 이러한 모델 특징을 사용하면 모델을 처음 생성한 로그 다시 로드하는 일이 간단해집니다. 예를 들어 scikit-learn 함께 MLflow 사용할 모델 로깅은 실험 내에서 다음 코드를 실행하는 것만큼 쉽습니다.

 

MLflow 또한 타사 라이브러리(: XGBoost 또는 spaCy) 또는 간단한 Python 함수 자체의 모든 모델을 MLflow 모델로 저장할 있는 “Python 함수” flavor 제공합니다. Python 함수 flavor 사용하여 생성된 모델은 동일한 생태계 내에 있으며 Inference API 통해 다른 MLflow 도구와 상호 작용할 있습니다. 모든 사용 사례를 계획하는 것은 불가능하지만 Python 함수 모델은 가능한 보편적이고 유연하도록 설계되었습니다. ETL 응용 프로그램에 유용할 있는 사용자 지정 프로세싱과 논리 평가를 허용합니다. 많은공식모델 버전이 온라인에 제공되더라도 일반 Python 기능 버전은 여전히 중요한다목적 보관함 (catchall)” 역할을 하여 모든 종류의 Python 코드와 MLflow 강력한 추적 도구 키트 사이의 다리를 제공합니다.

 

Python 함수 flavor 사용하여 모델을 로깅하는 것은 간단한 프로세스입니다. 모든 모델 또는 함수는 한가지 요구 사항으로 모델로 저장할 있습니다. pandas DataFrame 입력으로 가져와 DataFrame 또는 NumPy 배열을 반환해야 합니다. 해당 요구 사항이 충족되면 여기에 설명된 대로 함수를 MLflow 모델로 저장하려면 PythonModel에서 상속하는 Python 클래스를 정의하고 사용자 지정 함수로 .predict() 메서드를 재정의해야 합니다.

 

실행 하나에서 로깅된 모델 로드

이제 여러 다른 Stretch factor 사용하여 데이터를 실행했으므로 자연스러운 다음 단계는 결과를 검토하고 기록된 메트릭에 따라 특히 수행된 모델을 찾는 것입니다. MLflow 사용하면 다음 지침에 따라 로깅된 모델을 쉽게 다시 로드하고 이를 사용하여 데이터에 대한 예측을 수행할 있습니다.

1. 모델을 로드하려는 실행에 대한 링크를 클릭합니다.

2. “실행 ID” 복사

3. 모델이 저장된 폴더의 이름을 기록해 둡니다. 경우에는 단순히모델이라고 이름을 지정합니다.

4. 아래와 같이 모델 폴더 이름과 실행 ID 입력합니다.

 

모델이 의도한 대로 작동하고 있음을 보여주기 위해 이제 모델을 로드하고 변수 new_sales_units 내에서 생성한 개의 제품에서 DTW 거리를 측정하는 사용할 있습니다.

 

다음 단계

보시다시피 MLflow 모델은 새롭고 보이지 않는 값을 쉽게 예측합니다. 그리고 Inference API 준수하기 때문에 모든 서빙 플랫폼(: Microsoft Azure ML 또는 Amazon SageMaker) 모델을 배포하거나 로컬 REST API 엔드포인트로 배포하거나 사용자 정의 함수(UDF) 생성할 있습니다. Spark SQL 함께 쉽게 사용할 있습니다. 마지막으로 Databricks Unified Data Analytics Platform 사용하여 Dynamic time warping 사용하여 판매 추세를 예측하는 방법을 시연했습니다.

네피리티
No Comments

Sorry, the comment form is closed at this time.