brunch

You can make anything
by writing

C.S.Lewis

by TOBESOFT Ai Lab Aug 26. 2021

[DACON] 구내식당 식수 인원 예측 AI 경진대회

한국토지주택공사 점심/저녁 식수인원 예측

[INDEX]


1. 대회 소개 및 규칙

2. 데이터 분석 및 전처리

2. 텍스트 데이터 처리

4. 모델 적용 및 성능 평가

5. 마무리...



1. 대회 소개 및 규칙


1-1) 대회 소개

[그림1] 대회 요약 및 구성도

  회사 안에 있는 구내 식당에는 하루에도 수백명 혹은 그 이상이 이용을 한다. 구내식당은 주문을 받은 후 음식을 준비하는 일반 식당과는 다르게 식수 인원을 예측하여 미리 음식을 준비해야 한다. 그렇기 때문에 구내 식당에서 그날 음식을 먹을 인원이 몇명인지를 보다 정확히 예측하는 것이 매우 중요한 일이다. 식수 인원을 정확히 예측 할 수록 버려지는 음식을 줄여 예산을 줄이고, 더 좋은 서비스를 제공 할 수 있다. 하지만, 지금까지는 단순한 시계열 추세와 담당자의 작관적 경험에 의존하여 식수 인원을 예측 하였다. 그래서 이번 프로젝트를 통해 빅데이터 분석과 인공지능 모델을 이용해 보다 높은 식수 인원 예측을 통해 잔반 발생량을 획기적으로 줄이고자 한다.


1-2) 대회 규칙

[그림2] 대회 규칙 상세 내용

  본 대회는 [그림2]와 같이 평가 방법과 대회 운영에 있어 몇 가지 중요한 규칙을 가지고 있다. 모델의 성능은 MAE(Mean Absolute Error)를 사용 하여 평가하고, 최종 평가 데이터의 30%를 이용하여 Public Score를 측정하여 리더보드에 제공하고, 대회 최종 평가는 나머지 70% 데이터를 이용하여 Private Score를 측정하여 순위를 결정하고, 상위 팀들의 코드 검증을 통해 최종 순위를 결정하는 방식을 사용했다. 



2. 데이터 분석 및 전처리


2-1) 데이터 소개

[그림3] 데이터 종류 및 소개

  구내식당 식수 인원을 예측하기 위해 제공된 데이터는 총 12가지 이다. [그림3]에서 보는것과 같이 총 12개의 데이터 중에서 왼쪽 박스 안에 있는 10개는 Feature Data로 사용되고 나머지 오른쪽 2개는 예측 결과 데이터로 사용된다. 즉, 10개의 데이터를 이용해서 점심 식수 인원과 저녁 식수 인원 각각 예측해야 한다. 주어진 데이터에 카테고리 데이터를 추가하여 점심과 저녁을 예측하는 하나의 모델을 생성 할 수도 있고, 점심과 저녁 각각 예측하는 모델 2개를 생성 할 수도있다. 


2-2) 데이터 분석

[그림4] 데이터 분석 결과

  데이터 타입을 살펴보면 날짜데이터는 날짜 형식으로 되어 있고, 요일 데이터는 텍스트로 되어 있다. 인원 관련 데이터는 모두 숫자로 표기 되어 있고, 마지막으로 아침/점심/저녁 식사 메뉴는 텍스트 형식으로 되어 있다. 텍스트 데이터는 숫자 데이터로 치환이 필요 하다. 요일 데이터는 단순 category 치환을 통해 쉽게 변경 할수 있지만 아침/점심/저녁 메뉴에 대한 텍스트 데이터는 NLP 등을 적용하는 것도 좋은 방법일 수 있다.


2-3) 데이터 치환

[그림5] 데이터 치환 및 제거

  날짜 데이터는 년도별/월별/일별 등의 요소를 적용하기 위해 분활하여 년도/월/일 데이터를 추가 하였다. 본사 총 인원은 항상 같거나 입사/퇴사 자에 따라 10명 미만의 변동율이 발생하기 때문에 불필요한 데이터라고 판단되어 제거하였고 대신 본사 총 인원을 이용해 의미가 있는 근무 인원을 추가 하였다. 근무 인원은 본사 총 인원에서 야근 신청 인원, 재택 근무 인원, 출장 인원 그리고 휴가 인원을 뺀 나머지 값으로 구한 값이다. 요일 데이터는 당순 카테고리화를 이용해 숫자 값으로 치환 하였고, 아침 메뉴는 일반적으로 점심이나 저녁 메뉴에 영향을 미치는 요소가 아니라고 판단되어 제거 하였다.


2-4) 저녁 식수 인원이 '0'인 데이터 처리

[그림6] 실제 Train 데이터 셋

  [그림6]은 저녁 식수 인원(석식계)이 0인 데이터의 일부를 보여주고 있다. 이 데이터를 보면 특이한 점을 보이고 있다. 대부분 '마지막 주 수요일' 이라는 점이며, 이날은 문화가 있는 날로서, 2014년 문화체육관광부에서 시행하였으며 2016년에 문화기본법에 명문으로 근거 규정을 두었다. 위의 데이터를 보면 2016년 말부터 시행된것을 보아 문화가 있는 날이라는 새로운 Feature가 있음을 확인 할 수 있었다. 또한 2020년 3월 부터는 코로나 대유행으로 이해 문화가 있는 날에도 석식 이용자가 있음을 확인 할 수 있었다. 이 때문에 '문화가 있는 날'과 '코로나 대유행'이라는 Feature를 적용하여 문제를 해결 하려 하였지만, 생각 보다 좋은 결과를 보여주지는 않았다. 우선 규칙성이 명확하지 않고 코로나가 식수 인원에 미친 영향이 그렇게 크지 않다고 판단되었다. 그리고 대부분 석식계가 0인경우는 메뉴가 없는 날이 었다. 즉, 구내식당을 운영하지 않았기 때문에 인원이 0명인 것으로 파악되었다. [그림6]에서는 0이지만 메뉴가 있는 경우가 2번 있는 것으로 보여주는데 이는 데이터의 양이 적어 식수 인원을 파악하는 추세에 방해되는 Noise 데이터로 판단된다. 하여 석식계가 0인 데이터를 제거하여 문제 해결에 접근 하였다.



3. 텍스트 데이터 처리


3-1) Fast-Text 적용

[그림7] FastText 적용

  텍스트 데이터를 처리하기 위한 첫번째 방법Word-Embedding 방식중 하나인 FastText를 적용하였다. FestText는 글자를 다차원 Vector의 형태로 바꿔주는 Word2Vec의 다음 버전으로 기본적으로 모든 기능과 성능은 똑같으나 형태소 분석의 기능이 추가된 형태로 보다 많은 단어를 처리 할 수 있는 장점이 있다. 예를 들어 Word2Vec을 이용해 '오징어찌개'를 처리하면 오징어찌개 한 단어에 대해서만 결과를 얻을 수 있지만 FastText를 적용하면 '오징어'와 '찌개' 그리고 '오징어찌개' 총 3개의 단어에 대한 결과를 얻을 수 있다. 이렇게 얻은 같은 크기의 단어에 대한 Vector값의 평균을 구해 메뉴에 대한 값을 300차원의 Vector값으로 표현하고 이를 Feature로 사용 할 수 있다.


3-2) Word 2 Index 적용

[그림8] Word 2 Index 적용

  두번째 방법은 메뉴를 구성하고 있는 각 요소마다 Index를 적용하여 수치화 시키는 방법이다. One-hot-encoding방식을 활용한 방식으로 메뉴는 크게 '밥', '국' 그리고 '반찬'으로 구성되어 있다. 각 요소들에 해당되는 메뉴들의 등장 순서에 따라 Index값을 적용하여 3개의 Index List를 생성한 후 해당 메뉴가 등장할때마다 해당되는 Index 수치 값으로 치환하여 글자를 수치화 시키는 방법이다.  이 방법을 사용했을때 FastText방식을 사용했을때보다 좋은 성능을 보여 주었다.



4. 모델 적용 및 성능 평가


4-1) 앙상블 모델 적용

[그림10] 균형 트리 분할 vs 리프 중심 트리 분할

  신용카드 사용자 연체 여부를 판별하기 위해 현재 Kaggle과 Dacon에서 좋은 성능을 보여주는 앙상블 모델(LightGBMXGBoost)을 사용 하였다. 두 모델은 결정 트리(Decision Tree)을 기반으로 만들어 졌지만 모델을 구성하는 방법론에서 [그림8]과 같은 차이점을 보인다. 일반적인 Tree 기반 알고리즘은 균형 트리 분할(Level-wise) 방법을 사용하는데, 이에 해당되는 대표적인 앙상블 모델이 XGBoost 모델 이다. 이 방법은 최대한 균형이 잡힌 트리를 유지하면서 분석 하기 때문에 트르의 깊이가 최소화가 될수 있지만 그 만큼 시간이 오래 걸리는 단점을 가지고 있다. LightGBM은 리프 중심 트리 분할(Leaf-wise)의 대표적인 모델이다. 이 방법은 균형 트리 분할과는 다르게 균형을 맞추지 않고 최대 손실 값(max data loss)을 가지는 리프 노트를 지속적으로 분할하면서 트리의 깊이가 깊고, 비대칭적인 트리를 생성 한다. 이렇게 생성된 비대칭 적인 트리는 균형 트리 분할보다 손실을 줄일 수 있는 장점이 있다.


4-2) 최적의 파라미터 검색

[그림11] GreadiSearchCV 적용

  각 모델은 고유한 파라미터값을 가지고 있고, 이 파라미터 값에 의해 모델의 성능을 향상 시킬 수 있다. 각 모델에서 최적의 파라미터를 찾기 위해 Scikit-learn에서 제공하는 GridSearchCV를 이용 하였다. 앙상블 모델에서 주요하게 사용되는 파라미터들의 범위를 설정하여 GridSearchV를 적용하면 설정된 범위안에서 모든 파라미터의 조합을 검색하여 최종적으로 가장 좋은 성능을 보여준 결과와 그에 해당하는 파라미터 값을 반환한다. XGBoost가 LightGBM보다 좋은 성능을 보여 주었다.


4-3) 모델 성능 평가

[그림12] 최종 성능

  앙상블 모델에(XGBoost, LightGBM) GridSearchCV를 적용해 확인된 최적의 파라미터를 적용했을때의 결과는 [그림10]과 같다. LightGBM보다 XGboost가 동일한 조건의 데이터를 사용했을때 더 좋은 성능을 보여 주었다.



5. 마무리...


  이번 대회는 다른 대회와는 다르게 수치 데이터와 텍스트 데이터 둘다 처리해야 하다 보니 조금더 복잡하면서도 실생활에서 많이 사용될 수 있는 종류의 대회였다고 생각이 들었다. 이번 대회에서 주어진 수치 데이터에서 추가적인 Feature를 뽑아내기에는 한계가 있었다. 다른 공유된 참여자 코드들을 보더라도 수치 데이터 처리보다는 텍스트 데이터 처리에 따라 성능의 편차를 보여 주었다. 앙상블 모델의 파라미터값은 이전에 참여한 대회(이전 포스팅 참조)에서 사용한 값과는 크게 차이를 보이지 않았다. 즉, 모델 학습을 위한 전처리가 모델의 성능을 좌우함에 있어 얼마나 중요한지를 다시한번 알게되는 순간이었다. 













작가의 이전글 Hand Gesture Recognition (1)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari