Skip to content

feat: rolling window 로더 추가 및 hub_only 제거#10

Open
pkhyrn268 wants to merge 5 commits into
mainfrom
feat/loader-multibase
Open

feat: rolling window 로더 추가 및 hub_only 제거#10
pkhyrn268 wants to merge 5 commits into
mainfrom
feat/loader-multibase

Conversation

@pkhyrn268
Copy link
Copy Markdown
Contributor

@pkhyrn268 pkhyrn268 commented May 29, 2026

개요

BTS 데이터 로딩 방식을 multi-base 학습에 맞게 전면 수정함.
hub_only 필터 제거, 동일 데이터 복제 문제 해결, 공항 ID 불일치 문제 수정,
crew base 명시적 입력을 위한 함수 추가.

loader의 주 파이프라인은:
build_airport_map() → bases_to_ids() → load_flights_rolling()

1. hub_only 필터 제거

기존 코드 문제점

  • hub_only는 "RL이 ATL로 반드시 복귀해야 한다"는 조건을 데이터 레벨에서 강제하는 필터이다.
  • 실제 데이터 전체를 그대로 반영하지 않아 spoke-spoke 항공편(BOS→ORD 등)을 전혀 학습할 수 없어 현실 운항 패턴과 달라진다.
  • MIN_REST = 8.0 부분이 하드코딩되어 있어 constraints.py 기준 9.5h와 불일치 함.
  • multi-base 환경에서는 ATL 이외의 base 기준 round-trip 보장이 불가능해 hub_only 개념 자체가 필요없다.

수정

  • load_flights()에서 hub_only 파라미터 및 관련 블록 전체 제거.
  • load_flights_multiday() 함수 자체 제거. 동일 데이터 반복이 문제의 본질이므로 하위 호환을 위한 유지도 불필요하다고 판단. load_flights_rolling()으로 대체.
    base 복귀는 environment의 BASE_PENALTY가 담당 예정(찬주 확인 부탁!!)

2. 에피소드마다 동일한 데이터 반복

기존 코드 문제점

  • 모든 에피소드가 완전히 동일한 800(200*4)개 flight를 반복해서 본다.
  • 특정 dep_time 패턴에 과적합되어 다른 날짜 데이터에 대한 일반화가 없다.
  • 날짜별 실제 운항 변동(계절, 요일)을 전혀 반영하지 못한다.
  • 학습/평가 시간 분리(train-eval split)가 구조적으로 불가능하다.

수정
load_flights_rolling(path, window_days, offset_days, airport_map) 추가

  • 실제 날짜 데이터를 슬라이딩 윈도우로 로드한다.
  • offset_days를 에피소드마다 다르게 지정하면 서로 다른 날짜 구간의 flight를 학습한다.
  • window 안에서 랜덤 샘플링하면 시간 연속성이 깨지기 때문에 flight 수는 window_days`로만 제어한다.

3. 에피소드 간 공항 ID 불일치 버그 (load_flights_rolling)

기존 문제
load_flights() 내부에서 로드된 subset 기준으로 airport_map을 재계산했다. rolling window를 쓰면 윈도우마다 포함되는 공항 집합이 달라지므로 같은 "BOS"가 윈도우 1에서 ID=3, 윈도우 2에서 ID=7이 될 수 있었다. 모델의 airport_emb는 ID를 인덱스로 사용하므로 ID가 바뀌면 embedding 학습이 무의미해진다.

수정
build_airport_map(path) 신설. 전체 CSV 기준으로 고정 맵을 한 번 만든다. 이후 모든 load_flights_rolling() 호출에 airport_map= 파라미터로 주입하면 어떤 윈도우를 쓰더라도 ATL=0, DTW=1, MSP=2가 항상 보장된다.


4. load_flights() 자체의 airport_map 버그

기존 문제점
load_flights(limit=50)load_flights(limit=200)이 서로 다른 airport_map을 생성한다. 학습에 limit=200, 평가에 limit=50을 쓰면 공항 ID가 달라져 embedding이 완전히 다른 공항을 가리킨다.

수정
df.head(limit) 이전에 전체 df 기준으로 airport_map을 먼저 계산한다.

airport_counts = Counter(list(df["ORIGIN"]) + list(df["DEST"]))  # 전체 기준
airport_map = {a: i for i, a in enumerate(airports_sorted)}
df = df.head(limit)  # 이후 자름

5. bases_to_ids() 추가 — crew base 명시적 입력

기존 문제
기존코드에서는 빈도 기반으로 자동 계산(get_bases())하거나 base_airport=0을 고정으로 썼다. 이를 crew base가 어디인지 외부에서 명시적으로 입력받도록 수정.
수정
build_airport_map()으로 만든 전체 CSV 기준 맵을 통해 문자열 코드를 정수 ID로 변환한다. 없는 코드가 있으면 즉시 오류를 발생시켜 잘못된 base 입력을 조기에 감지한다.

get_bases(flights, n_bases) 함수는 유지했고, 주 파이프라인에서는 bases_to_ids()를 통한 명시적 입력이 우선되도록 하였다.


Comment thread RL/loader.py
airport_map: build_airport_map()으로 생성한 공항→int 맵

Returns:
정수 ID 리스트. airport_map에 없는 코드는 무시한다.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bases_to_ids() Returns 설명에 "없는 코드는 무시한다"라고 되어있는데, 실제 코드는 없는 코드가 있으면 raise ValueError 하고 있는데 어떤걸 의도한거야 ??

Comment thread RL/loader.py
Comment on lines +152 to +153
df["dep_time"] = df["CRS_DEP_TIME"].apply(convert_time)
df["arr_time"] = df["CRS_ARR_TIME"].apply(convert_time)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overnight 항공편(23:30 출발 → 00:30 도착)은 arr_time < dep_time이 돼서 비행시간이 음수가 나올 수 있을 것 같아! BTS 데이터에 CRS_ELAPSED_TIME(분 단위)이 있으니까 arr_time = dep_time + CRS_ELAPSED_TIME / 60으로 바꾸면 될 것 같은데 어때 ??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants