sailorCat
작성일
2022. 1. 25. 09:34
작성자
sailorCat
728x90

음식배달 서비스(배민, 쿠팡이츠 등)를 위한 예측모델

예측값 : 음식 배달에 걸리는 시간

 

예측값인 배달시간보다 실제 배달시간이 더 걸리는 경우(Under prediction)에는 사용자의 경험에 많은 영향을 끼친다.

배달 시간과 가까운 값을 예측하는 동시에 Under prediction 값이 최소화 하는 것이 좋은 모델이다.

 

시간 속성

market_id: 지역(배달이 이루어지는 도시) 아이디

created_at: 주문이 생성된 시간의 Timestamp(UTC)

actual_delivery_time: 주문자가 배달을 받은 시간의 Timestamp(UTC)

 

식당 속성

store_id: 식당 아이디

store_primary_category: 식당의 카테고리(italian, asian 등)

order_protocol: 주문을 받을 수 있는 방식을 나타내는 아이디 주문 속성

total_items: 주문에 포함된 아이템(음식) 개수

subtotal: 가격(센트 단위)

num_distinct_items: 주문에 포함된 비중복 아이템 개수

min_item_price: 주문에 포함된 아이템 중 가장 싼 아이템의 가격

max_item_price: 주문에 포함된 아이템 중 가장 비싼 아이템의 가격

 

지역 상황 속성

total_onshift: 주문이 생성되었을 때 가게로부터 10마일 이내에 있는 배달원들의 수

total_busy: 위 배달원들 중 주문에 관여하고 있는 사람들의 수

total_outstanding_orders: 주문한 가게로부터 10마일 이내에 있는 다른 주문들의 수 다른 모델들의 예측값 estimated_order_place_duration: 식당이 주문을 받을 때까지 걸릴 것으로 예상되는 시간(초단위) estimated_store_to_consumer_driving_duration: 식당에서 출발해 주문자에 도착할 때까지 걸릴 것으로 예측되는 시간

 

 

데이터를 가져오고, 주문시간 created_at 도착시간 actual_delivery_time의 차이를 통해 배달시간 delivery_time을 새로 만들었다.

 

전체 데이터는 197428 개의 행으로 이루어져 있다.

결측치가 상당히 많다.

 

 

 

 

 

데이터 전처리 Preprocessing

 

1. imputer를 통해 수치형 데이터의 중간값 median을 찾아 새로운 데이터 프레임 delivery_에 결측치를 채운 값을 생성

2. 수치형 데이터가 아닌 market_id, order_protocol, store_primary_category 의 값의 결측치를 0.0 과 str,other로 채움

3. OrdinalEncoding으로 store_primary_category를 수치형으로 바꿈

4. OneHotEncoding으로 market_id, order_protocol, store_primary_category 변환하여 저장

5. 원본데이터 delivery에 바꾼 모든 값 병합

6. 예상 주문시간, 예상 배달시간을 합친 총 예상 시간을 estimated_time으로 생성

 

 

 

 

Train Set, Test Set 분리

데이터가 하나로 되어있기 때문에 모델 훈련과 예측이 가능하도록 전처리를 모두 진행하고 분리시켜주었다.

sklearn.model_Selection의 train_test_split으로 분할했다.

 

 

 

 

 

 

파이프라인 Pipeline

모델 훈련에 사용되는 features, 레이블 값인 delivery_time을 위한 값들을 생성

파이프라인으로 연속형 변수로 스케일링하고 수치형 데이터와 Onehotencoding 값을 fit transform 하여 prepared 데이터를 생성

 

 

 

 

 

모델 훈련 

LinearRegression

Lasso

Ridge

DecisionTreeRegressor

ElasticNet

 

훈련데이터에 대한 성능 측정은 RMSE와 Under Prediction값을 사용했다.

Under prediction = 배달 예상시간보다 실제 배달시간이 더 걸린 경우/ 전체 경우

 

 

 

 

 

테스트 데이터셋으로 최종 평가하기 

두 가지 결과가 괜찮은 것을 비교했다.

DecisionTreeRegressor

ElasticNet

 

728x90