KT 에이블스쿨 : 5차 미니프로젝트 (3일차) - 시계열 데이터 전처리 - 비즈니스 평가
5차 미니프로젝트
3일차 : 24.04.26 (금)
파이프라인을 만드는 함수랑 비즈니스 평가하는 부분이 주된 부분이었다.
내가 파이프라인을 만들고, 비즈니스 평가를 위한 이미지 출력을 하는 코딩 파트를 맡았는데
파이프라인의 의도를 정확하게 인지하지 못해서 잘못된걸로 만드느라 시간을 허비했고,,,
전날 돌린 상품별 data.pkl이랑 오늘 돌리는 새로운 데이터셋의 컬럼이 달라서 성능 예측을 못했다.
오류를 해결하느라 많은 시간을 보냈는데
3시 제출마감하기 3분전에 코드를 다 돌려서 급하게 냈다. .. 휴 =3
성능은 개선하지 못했고, 그냥 코드를 다 돌려서 다행이었다.
하나 더 아쉬운거는 전날 팀원한테 보낸 코드의 data.pkl 이랑 내가 금일 돌린 data.pkl이 달라서
팀원들이 찾아준 하이퍼파라미터 값이 나의 data.pkl이랑 맞지 않아 성능이 마이너스로 나온게 아쉽다. .
애를 먹은 문제들
파이프라인의 의도
파이프라인은 test용인 새로운 데이터셋의 전처리 과정만 하면 되는데
파이프라인 안에 train_test_split부터 스케일링, 모델링 과정까지 넣은게 문제였다.
학습용 데이터로 학습한 모델이 새로운 데이터에서도 예측이 잘되는지 확인하는 용이기에
학습용 데이터랑 전처리만 똑같이 하면 되는거였는데, 이론적인 딥러닝 과정에 대한 이해가 미흡했다.
학습용 데이터의 전처리 과정(merge, 가변수화, 컬럼 추가 등)을 하고
def pipeline(sales_data, orders_data, oil_price_data, Product_ID):
...
...
x = df.drop(columns = ['Date', 'Target'])
y = df.loc[:, 'Target']
return x, y
x랑 target(y)으로만 나눠서, xy를 return하면 되는거였다. .
혹은 x, y로 나누지 않은 전처리된 df를 return하고나서 x, y를 다른셀에서 데이터분리해도됨
그리고나서 predict하고 평가지표 확인
x_test, y_test = pipeline(sales, orders, oil_price, 3)
y_pred = model03_rdf.predict(x_test)
print('RMSE:', mean_squared_error(y_test, y_pred, squared=False))
print('MAE:', mean_absolute_error(y_test, y_pred))
print('MAPE:', mean_absolute_percentage_error(y_test, y_pred))
print('R2:', r2_score(y_test, y_pred))
print('MSE:', mean_squared_error(y_test, y_pred))
예전에 3차 미프에서 회귀나 분류할때도 파이프라인을 만들었었는데, 그때도 파이프라인을 어려워하고 제대로 복습을 못해서 이번에 이부분이 애를 많이 먹은 것 같다.
학습 데이터 ≠ 평가 데이터 (다른 형식)
새롭게 받은 test 데이터는 2017년 3월 (한달치)의 데이터라서,
전날에 만들었던 학습데이터 전처리 방식을 똑같이 적용했을때 문제가 생긴다.
전날에 만들었던건, 1일전부터 ~ 30일전까지의 판매량을 반복문으로 shift 시켰다..
for x in range(1, 30):
df[f'Qty_Lag_{x}'] = df['Qty'].shift(x)
한달치 데이터인 test 데이터에 shift(1) 부터 shift(30)까지 준뒤, null값을 날리면
한달치 전체 데이터가 날라가서 남는 데이터가 없게된다. . ㅋ
그래서, data.pkl에서는 1일전 ~ 30일전까지의 판매량을 shift한게 들어있고,
test 데이터에는 1일전 ~ 3일전까지의 판매량을 shift한게 들어있었다.
모델 학습할때랑 test 데이터 돌릴때랑 데이터 구조가 다르다고, 에러가 났다. .
이 오류를 고치기 위해서 시간을 많이들임
하이퍼파라미터 튜닝
하이퍼파라미터 튜닝 담당은 다른 팀원이 했는데,
내가 전날 만들었던, 1일전 ~ 30일전까지의 판매량이 포함된 많은 컬럼은 data.pkl를 기준으로 모델 하이퍼파라미터 튜닝을 했다.
하지만, 최종적으로 돌아간거는 이날 만든 1일전 ~ 3일전까지의 판매량이 포함된 적은 컬럼의 데이터셋,, ,
즉,, 다른 데이터셋에 최적화된 하이퍼파라미터를 대입한 것 ㅠ
비즈니스 평가
- 상품 3 - 음료
- Random Forest
- RMSE: 6467.0849142239285
MAE: 5965.562962962963
MAPE: 0.6451449838436984
R2: -1.36031958886517
MSE: 41823187.287782714
- Light GBM
RMSE: 2072.5465800108136 MAE: 1530.1579077318622 MAPE: 0.1253566057832863 R2: 0.7575834400636526 MSE: 4295449.32631452
- 상품 12 - 우유
- Random Forest
MAE: 7804.567071358026 MAPE: 0.8926239473408488 R2: -5.609302158853525 MSE: 79587175.6734195
- Light GBM
MAE: 4159.738584437088 MAPE: 0.4603366652094462 R2: -0.6823165292017415 MSE: 20257936.152687807
- 상품 42 - 곡식
- Random Forest
RMSE: 23.338741101738794 MAE: 20.63753086419753 MAPE: 0.20070093125176486 R2: -0.8823607186537092 MSE: 544.6968362139918
- Light GBM
RMSE: 21.14602120388167 MAE: 18.67868565291494 MAPE: 0.1802828125768775 R2: -0.5452733875250277 MSE: 447.1542127550132
발표 타임
- 교차 상관분석해서 30일전 데이터랑 높은 연관성을 가진걸 알아냄 (lag_30)
- 자기 상관분석해서, 1일 후와 7일 후에 자기상관계수가 높음 => Qty_Lag_1, 7 변수 추가
- 2개의 열을 하나의 그래프에 같이 그리는게 더 보기좋은듯
-- 년도별 상품 판매량을 하나의 그래프로 그려서 비교함
-- 상품42(곡식) : seasons, quarters 열 추가하고 기존 열 삭제하니 선형회귀에서 성능 향상됨
- (가설, 추측) 해외시장의 경우 겨울 폭풍(12월 후)을 대비해 빵과 우유를 비축함
- 우리조가 찾은 곡식의 밀 수확시기의 관계
댓글
댓글 쓰기