- 광양항 서부 컨테이너터미널 홈페이지에서 공개중인 컨테이너 반출입데이터 중 2025년 1월 1일 ~ 2025년 7월 29일까지의 데이터를 학습하고 최근 데이터를 통해 현재 장치장에 거치되어있는 컨테이너중 사용자의 회사 소유 컨테이너를 조회하는 기능과 장치장 상황을 공지하고 이후 상황을 예측하려는 시스템
- API Key 설정
- env파일 생성
- OPENAI_API_KEY='자신의 api key 입력'
- .gitignore 파일에 .env 삽입
- 주요 라이브러리
- fastapi=0.112.1
- pydantic=2.8.2
- tensorflow=2.19.0 #모델 학습에 사용한 버전으로 다른버전 사용 시 에러발생할수도 있음
- keras=3.10.0 #모델 학습에 사용한 버전으로 다른버전 사용 시 에러발생할수도 있음
- numpy=2.3.2 #tesnorflow와 호환버전
- pandas=2.1.3 #numpy와 호환버전
- scikit-learn #numpy와 호환버전
- typing
- FastAPI 실행
- uvicorn app:app --reload
📂 container_monitoring(root)
├── data/ # 전처리 전 CSV데이터
└──터미널 반출입 목록조회_GUEST_2025-08-07_111836.csv
├── models/ # 학습된 모델 파일(.h5)
└── best_lstm_model.h5
├── notebooks/ # 분석 및 실험용 Jupyter 노트북 (미정)
├── src/ # FastAPI/React 등 구현 코드
├── .env # openai의 api키 삽입 등의 환경변
├── .gitignore
├── affiliation_api.py # 사용자의 소속에 맞는 컨테이너의 상황만 필터링 하여 출력
├── app.py # FastAPI 어플리케이션 정의 및 데이터 전처리, 예측 실행
├── llm_summary.py # 예측된 내용을 바탕으로 이후 상황을 브리핑해주는 생성형 ai
├── occupancy_calculator_functional.py # 현재 장치장 점유율의 상황을 계산
├── README.md
└── requirements.txt # Python 의존성
사용한 컬럼명 : 선사, 컨테이너번호, 상태, 운송유형(반입/반출), 터미널 반입/반출일시, 장치장위치
- 광양항 서부 컨테이너터미널 홈페이지 E-service 에서 공개하고 있는 터미널 반출입 목록을 엑셀형태로 2025년 1월 1일~ 2025년 7월 29일까지의 데이터를 약 2주간격으로 다운받은 후 csv파일로 다시 저장하여 pandas를 이용해 데이터프레임으로 로드
- df.columns = df.columns.str.strip() 실행을 통해 컬럼 명에 있는 공백을 모두 제거
- 데이터프레임 merge 후 컨테이너번호와 터미널 반입일시가 같은 데이터를 중복데이터로 간주하고 제거 (총 데이터 610,631건) -> 이렇게 하는 이유는 데이터를 일정간격으로 여러번 다운로드 받으면서 컨테이너의 반입일시와 반출일시 사이의 간격이 긴 경우 중복되는 데이터가 있었기 때문
- 터미널 반입일시로부터 반출일시까지를 계산하고 해당 데이터가 어떤 장치장에 거치되어있었는지를 시계열 데이터로 전환
- 기준시간 30분 간격으로 전체 장치장에 얼마나 컨테이너가 있었는지를 학습
- LSTM
- LSTM + CNN
- 모델 선정 이유 : LSTM은 시계열 의존성을 학습 가능한 모델로써 하루 단위의 패턴, 주말/평일 패턴 등의 장기적인 반복성을 효과적으로 학습할 수 있음 CNN 모델을 결합하면서 특정 시간대에 집중되는 반출입이나 갑작스러운 점유율 급상승등의 단기 패턴을 학습할 수 있음. CNN이 먼저 특징을 압축하고 LSTM이 특징을 시간흐름에 맞춰 학습하게 되면서 성능향상과 동시에 계산량이 줄어 학습속도 향상과 불필요한 노이즈를 줄일수 있게 됨
| 모델 구성 | MAE | R2 SCORE |
|---|---|---|
| LSTM | 0.016 | -21.1183 |
| CNN + LSTM | 0.0142 | -6.1511 |
| CNN + LSTM_10min | 0.0003 | 0.9991 |
-
최종 선택한 모델은 CNN + LSTM_10min
-
CNN + LSTM 과 CNN + LSTM_10min의 차이점은 앞서 생성한 시계열데이터를 30분 단위를 기준으로 정한 것과 10분 단위를 기준으로 정한 것의 차이
-
최초 LSTM만 사용했을 때보다 CNN을 결합한 모델에서 약 11% 성능향상이 있었고 R2 스코어도 음수였지만 데이터 패턴을 더 잘 반영하기 시작했음
-
단위 시간을 10분으로 더 세분화 한 모델에서 MAE의 비약적인 성능향상과 함께 R2 스코어가 1에 가까운 모습을 보였음
기준 시간을 더 줄여보려고 했으나 gpu 메모리가 부족했음. 더 좋은 gpu가 있다면 기준시간을 더 줄여 학습하여 더 높은 성능을 낼 수 있을것으로 예상