time_cols = [c for c in df.columns if "시" in c]
id_cols = ["요일구분", "호선", "역번호", "출발역", "상하구분"]
So what : 시간대 컬럼을 자동으로 감지하고 기준 컬럼은 명시적으로 정의했다
So why: 시간대 컬럼은 시와 분의 규칙이 있어 자동 감지가 가능하다. 반면 id_cols는 의미가 있는 컬럼들이기에 명시를 하였다.
df_long = df.melt(
id_vars=id_cols,
value_vars=time_cols,
var_name="시간대",
value_name="혼잡대"
)
So what: Wide 형태를 Long 형태로 변환한다
So why: 모델은 각 행이 하나의 샘플이어야 한다. 시간대를 하나의 피처로 새롭게 만들어야 새로운 시간대도 예측 가능하고 모델의 구조가 변환하지 않는다.
def time_to_slot(t):
t = t.replace("시", ":").replace("분", "").strip()
parts = t.split(":")
h = int(parts[0])
m = int(parts[1]) if len(parts) > 1 and parts[1].strip() != "" else 0
return h * 2 + (1 if m >= 30 else 0)
So what: 30분 단위 Slot index로 변환한다 0 ~ 47 총 48개로 이루어져있다
So why: 문자열 시간대를 모델이 이해할 수 있는 숫자로 바꿔야하는데 30분 단위인 이유는 데이터 셋의 시간 간격이 30분이기 때문이다. 예측 또한 같은 방식의 Slot으로 변환해서 일관성을 맞춘다
cat_cols = ["요일구분", "호선", "출발역", "상하구분"]
for col in cat_cols:
le = LabelEncoder()
df_long[col + "_enc"] = le.fit_transform(df_long[col].astype(str))
encoders[col] = le
joblib.dump(le, f"{ENC_DIR}/{col}_encoder.pkl")
So what: 문자열 범주형 컬럼을 숫자로 인코딩하고 인코더를 파일로 저장하는 역할이다
So why: 모델은 문자열을 직접 처리할 수 없다. 예측할 때와 학습할 때는 똑같은 매핑으로 변환해야 하기에 인코더를 저장한다.
저장을 안할 시 다른 값으로 예측될 수 있다.
'Project > SSAFY2학기 특화 PJT' 카테고리의 다른 글
| [BE, AI] 언어 선택 이유 (0) | 2026.03.13 |
|---|---|
| [BE] odsay.rs ( ODSAY API 연동 ) (0) | 2026.03.13 |
| [AI] main.py ( 서버 실행 ) (0) | 2026.03.13 |
| [AI] train.py ( 모델 훈련 ) (0) | 2026.03.13 |
| 팀 프로젝트 정리 사이트 (0) | 2026.03.03 |
