[7주차 - Day5] ML_basics - 실습

2023. 6. 22. 13:00BOOTCAMP/프로그래머스 인공지능 데브코스

이 프로젝트에서는 음식 배달 서비스의 배달 시간을 예측하는 모델을 개발했습니다. 이 모델은 주문의 다양한 특성(예: 주문 아이템 수, 가격, 주문 방식 등)을 기반으로 실제 배달 시간을 예측합니다. 이 모델은 사용자 경험을 향상하고, 서비스 효율성을 높이는 데 도움이 될 것입니다.

 

# 라이브러리
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
import numpy as np
# 데이터 불러오기
df = pd.read_csv('/content/delivery_raw.csv')
# 결측치 처리
df = df.dropna()
df

# 'create_at'과 'actual_delivery_time'을 datetime 형태로 변환
df['created_at'] = pd.to_datetime(df['created_at'])
df['actual_delivery_time'] = pd.to_datetime(df['actual_delivery_time'])
# 배달 시간을 초 단위로 계산
df['delivery_time'] = (df['actual_delivery_time'] - df['created_at']).dt.total_seconds()
# 'created_at'과 'actual_delivery_time' 열 삭제
df = df.drop(['created_at', 'actual_delivery_time'], axis=1)
# 범주형 변수를 레이블 인코딩
encoder = LabelEncoder()
df['market_id'] = encoder.fit_transform(df['market_id'])
df['store_id'] = encoder.fit_transform(df['store_id'])
df['store_primary_category'] = encoder.fit_transform(df['store_primary_category'])
df['order_protocol'] = encoder.fit_transform(df['order_protocol'])
# 학습 데이터와 테스트 데이터로 분할
train_df, test_df = train_test_split(df, test_size=0.1, random_state=42)
# 특성과 타겟 분리
X_train = train_df.drop('delivery_time', axis=1)
y_train = train_df['delivery_time']
X_test = test_df.drop('delivery_time', axis=1)
y_test = test_df['delivery_time']
# 모델 학습
model = RandomForestRegressor(random_state=42)
model.fit(X_train, y_train)

# 예측
predictions = model.predict(X_test)
# RMSE 계산
rmse = np.sqrt(mean_squared_error(y_test, predictions))
print(f'Root Mean Square Error (RMSE): {rmse}')

 

Root Mean Square Error (RMSE): 1025.0554373262496데이터 전처리와 속성 생성에 대한 간단한 설명
# Under-prediction의 비율 계산
under_predictions = [pred for pred, actual in zip(predictions, y_test) if pred < actual]
under_prediction_ratio = len(under_predictions) / len(y_test)
print(f'Under-prediction Ratio: {under_prediction_ratio}')
Under-prediction Ratio: 0.40573444077824555

데이터 전처리 과정에서는 먼저 결측치를 제거했습니다. 그 다음, 'created_at'과 'actual_delivery_time'을 datetime 형태로 변환하고, 이 두 속성의 차이를 초 단위로 계산하여 'delivery_time' 속성을 생성했습니다. 그리고 범주형 변수를 처리하기 위해 LabelEncoder를 사용했습니다.

 

학습을 위해서 어떤 모델을 사용했는지 그리고 어떠한 손실함수를 사용했는지를 간단히 설명

 

랜덤 포레스트 회귀 모델을 사용하여 배달 시간을 예측했습니다. 랜덤 포레스트는 여러 개의 결정 트리를 학습하고, 그 예측을 평균 내어 최종 예측을 생성하는 알고리즘입니다. 이 모델은 각 트리가 과적 합하는 경향을 평균화하여, 전체적으로는 더 안정적인 예측을 제공합니다. 손실 함수로는 평균 제곱 오차(MSE)를 사용했습니다.

 

테스트 데이터에 대한 평가지표들

 

테스트 데이터에 대한 평가지표로는 Root Mean Square Error (RMSE)와 Under-prediction의 비율을 사용했습니다. RMSE는 예측 오차의 제곱근으로, 예측 오차의 크기를 직관적으로 이해할 수 있게 해줍니다. Under-prediction의 비율은 예측된 배달 시간이 실제 배달 시간보다 짧은 경우의 비율을 나타냅니다.