비운영 참조 이전 1차 운영 · 2026-08-17 ~ 08-19

재료 다 넣기

상호작용 로지스틱 회귀 · logistic-interactions-v1+fd482d90

한 줄 결론 — 노선·정류장·시간대의 고정 조합을 하나의 확률식으로 보는 후보다. 2026-08-17~08-19 에 1차 운영 모델로 뽑혔다가 08번에 자리를 넘겼고, 지금은 서빙에도 일일 채점에도 들어가지 않는 비운영 참조다. 비교 관문을 채우기 전이라 성능 우위는 확정하지 않았다.

왜 믿나

숫자의 출처와 상태

이 페이지의 성적은 2026-08-19 평가일까지 계산된 동결 이력이다. 페이지를 열면 마지막 이력을 한 번 가져오고, 실패하면 배포 시점 이력이 그대로 남는다. 어느 쪽인지는 아래 스탬프에 적힌다.

이 모델의 일일 채점은 2026-08-19 평가일까지로 끝났다. evaluation-v3에서 도입한 결정이고 현재 evaluation-v6도 이어받는다. 새 점수는 만들지 않으며 마지막 값과 중단 시점은 이력에 남는다.

관측일과 만석 표본이 모델 비교 관문에 못 미치는 동안 상태는 잠정이다. 관문과 지표 정의는 평가 규약에 있다.

동결 이력 성적

배포 시점 값 · 일일 평가 2026-08-16분 · 생성 08-17 00:15 KST

종합 점수
54.2

상태 잠정 — 아래 관문을 다 채우기 전의 점추정이다.

평가 관측일
2일 / 10일
만석 누적
173건 / 100건
만석 관측일
2일 / 5일

지표 10개

지표오늘 값읽는 법
Brier0.0097확률 예측의 제곱 오차 평균 · 낮을수록 좋다
만석 누락률100.0%실제 만석을 기준 50%에서 안심으로 놓친 비율 · 낮을수록 좋다
ROC-AUC0.844만석과 비만석을 가르는 힘 · 높을수록 좋다
Log loss0.0467확신하고 틀리면 커지는 벌점 · 낮을수록 좋다
ECCE-MAD0.0058누적 확률 오차의 흔들림 · 낮을수록 좋다
PR-AUC0.060드문 만석을 찾는 힘 · 높을수록 좋다
확률 쏠림0.0058예측 확률의 전체 쏠림 · 0에 가까울수록 좋다
잘못 안심 비용 1:10.0096놓침과 헛경보를 같게 친 비용 · 같은 가정끼리 비교한다
잘못 안심 비용 2:10.0209놓침을 2배로 친 비용
잘못 안심 비용 4:10.0436놓침을 4배로 친 비용

점수 50 = 시간순 과거 만석률 기준 모델 · 자세한 기준은 평가 규약

구간별 동결 이력 성적

구간행만석Brier만석 누락ROC-AUC
주말18,0551730.0097100.0%0.844
출근2,70200.0002——
퇴근4,195120.0053100.0%0.958
그 외11,1581610.0136100.0%0.886
노선 16507,5321600.0196100.0%0.814
노선 333010,523130.0026100.0%0.874
노선 1650·출근97000.0001——
노선 1650·퇴근1,694120.0067100.0%0.969
노선 1650·그 외4,8681480.0279100.0%0.829
노선 3330·출근1,73200.0002——
노선 3330·퇴근2,50100.0044——
노선 3330·그 외6,290130.0025100.0%0.938

평가 행이 없는 구간 1개: 평일

1차 운영 선택 — 2026-08-17, 08-19 교체

팀 검토(0817 BE 최종 검토안)로 이 모델을 1차 운영 모델로 정했다. 평가가 아직 잠정이라 성능 입증은 아니고, 운영 적용을 위한 선택이었다. 2026-08-19 팀 검토로 08번(차량 상태 조건부 좌석 분포)으로 교체했다. 이 모델은 폐기가 아니다 — 서빙 계약에서 빠지고 평가 규약에는 기록으로 남는다.

08-17~08-19 의 그 안은 노선 예보 조회 v1 계약 위에 있었다. 배포 ID는 logistic-interactions-20260817-001로 잡아 뒀고, 입력은 노선·정류장 순번·KST 시간대(MORNING 07~09 / EVENING 17~20 / OTHER) 셋뿐이었다. 현재 차량의 위치·잔여석이 추론 입력이 아니라서 수집이 잠깐 끊겨도 예보 값이 변하지 않는 구조였고, 새 발행은 시간대 경계(07:00·09:00·17:00·20:00 KST)를 지날 때와 모델 승격·노선 판본 변경 때만 나가도록 돼 있었다. 이 경로는 한 번도 가동되지 않았다 — 적재할 계수 번들이 없어 발행 processor 가 뜬 적이 없다.

지금 이 모델의 자리는 비운영 참조다. 2026-08-19 결정 전까지는 차량 상태를 쓰지 않는 나머지 여섯과 같은 표본 위에서 매일 겨루는 대조군이었고, 그 결정으로 일일 채점이 2026-08-19 평가일에서 끊겼다 — 겨루는 자리가 아니라 지난 기록이 됐다. 학습 사건에 노선 판본이 없는 문제는 그래서 이 모델에서는 해소되지 않은 채로 남는다.

Q. 이 모델은 지금 무엇을 계산하나?

그 노선·정류장·시간대에서, 정류장 통과를 처음 감지한 뒤 관측의 유효 잔여석이 0일 확률을 계산한다. 특정 차량을 고르는 예보가 아니다.

Q. 어떻게 계산하나?

평가 사건과 시간대를 고정한다

현재 운영 수집기의 라벨 규칙을 통과한 사건만 남기고 같은 통과 사건은 한 번만 센다. 응답 수신시각을 한국 표준시로 바꿔 사전에 정한 시간대에 넣는다.

고정된 범주항을 만든다

노선·시간대 기본항과 노선×정류장·노선×시간대·노선×정류장×시간대 항을 평가 규격에 고정된 방식으로 펼친다. 결과를 본 뒤 유리한 조합을 새로 만들지 않는다.

규제를 건 로지스틱 모델을 맞춘다

앞선 한국 표준시 날짜의 학습행만 사용하고 계수 크기를 줄이는 L2 벌점을 줘 희소 조합의 과적합을 줄인다. 모든 항의 합을 0과 1 사이의 원래 만석 확률로 바꾼다.

뒤 날짜에서 같은 규격으로 채점한다

뒤 한국 표준시 날짜의 사건에 확률을 한 번씩 적용한다. 전체와 사전 정의 구간의 점추정을 같은 평가 규격으로 계산하고 상태·표본·기간·버전과 함께 표시한다.

이 방식의 강점

재료 한눈에

운영 v1이 쓰는 재료의 정본 표다.

구분재료어떻게 쓰나
쓴다노선운영 수집기에서 승인된 공식 노선을 범주 입력으로 쓴다.
쓴다노선×정류장목표 정류장을 노선과 묶은 범주로 쓴다. 정류장 축은 노선 판본의 정류장 순번이다.
쓴다시간대응답 수신시각을 한국 표준시로 바꿔 출근·퇴근·그 외로 나눈다.
쓴다고정 상호작용노선×시간대, 노선×정류장×시간대 조합을 항으로 편다.
정답으로만출발 뒤 만석 라벨학습 정답으로만 쓰고 예측 입력에는 넣지 않는다.
안 쓴다차량 식별값내부 사건 결합에만 쓰고 모델 입력과 공개 산출물에서 뺀다.
안 쓴다실시간 상태현재 버스의 좌석·위치·상태, 직전 통과, 운행 간격, 노선 집계는 이 버전의 특징에 없다.
안 쓴다비정상 관측좌석 미제공·결측·90초 초과·순번 점프·출발 전 상태를 비만석으로 바꾸지 않는다.
안 쓴다공급자 시각공급자가 적은 시각과 HTTP 시각은 날짜·순서 기준으로 쓰지 않는다.
안 쓴다연구 자료운영 수집 계열이 아닌 연구 자료의 수치·사례·분할·승패는 학습·평가·공개 변화선에서 뺀다.

정원·점유율·혼잡도·API queryTime을 빼는 이유는 아래 장부의 "지금은 안 쓰는 재료 4개"에 있다.

연구 변형 재료 장부 — 33개 출처 필드

해설 기준: M1·M2 연구 변형(실시간 특징 37개)이다. 운영 v1 재료는 위 표가 정본이다.

쓰는 재료 33개 — 출처 필드까지

재료종류어느 API의 어느 필드
직전 통과 만석 여부 (previous_passage_is_full)인과 조건을 만족하는 가장 최근 같은 정류장 통과의 label_full을 가져온다.주의 — 직전 API 응답 한 대와 같은 뜻이 아니다. 직전으로 확정된 통과 사건이다.파생S1 passage_events.label_full, passage_events.label_observed_at, passage_events.passage_interval_end; 특징 previous_passage_is_fullS1 passage_events
직전 통과 출발 후 잔여석 (previous_passage_remain_seats)인과 조건을 만족하는 같은 정류장의 가장 최근 통과에서 label_remain_seats를 가져온다.주의 — 현재 목표 차량의 출발 후 좌석이 아니다.파생S1 passage_events.label_remain_seats, passage_events.label_observed_at, passage_events.passage_interval_end; 특징 previous_passage_remain_seatsS1 passage_events
직전 통과 라벨 나이 (previous_passage_label_age_sec)현재 질의 응답 수신시각에서 직전 통과 라벨 관측시각을 뺀다.주의 — msgHeader.queryTime으로 빼지 않는다.파생timing.response_received_at.kst, timing.response_received_at.utc; S1 E4 response_received_kst, response_received_utc; 코퍼스 collectedAt; S1 passage_events.label_observed_at, previous_passage_label_age_sec우리 수집기 응답 수신시각 + S1 passage_events
상류 버스 잔여석 (upstream_remain_seats)축거리와 동률 규칙으로 고른 상류 차량의 remainSeatCnt를 붙인다.주의 — -1은 0으로 바꾸지 않고 결측으로 둔다. 이 값은 목표 차량의 미래 라벨이 아니다.파생msgBody.busLocationList[].remainSeatCnt, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd, msgBody.busLocationList[].vehId; S1 upstream_remain_seatsGBIS 버스위치정보 getBusLocationListv2 + S1 최근접 상류차 선택
상류 버스 축거리 (upstream_axis_gap_seq)상류 후보 중 목표에 가장 가까운 차량을 고르고 target station_seq-last_passed를 계산한다.주의 — 동률은 출발 stateCd=2, 교차 0, 도착 1 순, 더 최신 운행, 차량키 사전순으로 푼다. 좌석값은 선택 기준이 아니다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; S1 정규화 last_passed; S1 upstream_axis_gap_seqGBIS 버스위치정보 getBusLocationListv2 + S1 스냅샷 특징 빌더
상류 버스 좌석 변화율 (upstream_seat_change_per_min)선택된 차량을 직전 적격 응답의 같은 차량과 잇고 (현재 좌석-직전 좌석)/(경과초/60)을 계산한다.주의 — 두 좌석값이 비음수이고 0<경과<=90초, 정규화 순번 변화가 0 또는 1일 때만 만든다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd, msgBody.busLocationList[].remainSeatCnt; timing.response_received_at.kst, timing.response_received_at.utc; S1 upstream_seat_change_per_minGBIS 버스위치정보 getBusLocationListv2 + 우리 수집기 응답 수신시각 + S1 차량 연결
상류 버스 축 속도 (upstream_speed_seq_per_min)같은 차량의 정규화 순번 변화량을 (경과초/60)으로 나눈다.주의 — 0<경과<=90초이고 순번 변화가 0 또는 1일 때만 만든다. +2 이상 도약은 속도로 쓰지 않는다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; timing.response_received_at.kst, timing.response_received_at.utc; S1 upstream_speed_seq_per_minGBIS 버스위치정보 getBusLocationListv2 + 우리 수집기 응답 수신시각 + S1 차량 연결
지난 버스 잔여석 (passed_remain_seats)축거리와 동률 규칙으로 고른 지난 차량의 remainSeatCnt를 붙인다.주의 — -1은 결측이다. 목표 정류장을 지난 뒤의 관측이라도 목표 차량의 정답 라벨과는 다른 스냅샷 차량이다.파생msgBody.busLocationList[].remainSeatCnt, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd, msgBody.busLocationList[].vehId; S1 passed_remain_seatsGBIS 버스위치정보 getBusLocationListv2 + S1 최근접 지난 차 선택
지난 버스 축거리 (passed_axis_gap_seq)이미 지난 후보 중 목표에 가장 가까운 차량을 고르고 last_passed-target station_seq를 계산한다.주의 — 동률 규칙은 상류 선택과 같다. 좌석값은 선택 기준이 아니다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; S1 정규화 last_passed; S1 passed_axis_gap_seqGBIS 버스위치정보 getBusLocationListv2 + S1 스냅샷 특징 빌더
목표 축 순번 (station_seq)stateCd=1이면 현재 stationSeq-1, stateCd=0·2이면 현재 stationSeq를 마지막 통과 순번으로 놓는다. 인접 적격 응답에서 이 값이 전진한 끝점을 통과 사건 순번으로 삼는다.주의 — 모델 축은 routestation 전체 순번이다. 학습 행은 서비스 정차점만 남겨도 축 간격에는 미정차·경유 지점이 들어간다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; routestation.staOrder; S1 station_seqGBIS 버스위치정보 getBusLocationListv2 + GBIS routestation 마스터 + S1 통과 사건 빌더
KST 하루 중 분 (query_minute_of_day)KST 시각에서 hour*60+minute을 계산한다.주의 — msgHeader.queryTime은 쓰지 않는다. 초는 버린다.파생timing.response_received_at.kst, timing.response_received_at.utc; S1 E4 response_received_kst, response_received_utc; 코퍼스 collectedAt; S1 query_minute_of_day우리 수집기 응답 수신시각; 제한 코퍼스는 수집기가 붙인 collectedAt
계획 배차간격 (master_dispatch_interval_min)현재 구현은 평일 06:30~09:29·17:00~20:29에 peekAlloc, 그 밖 평일에 npeekAlloc을 고른다. 토요일은 satNpeekAlloc, 일요일은 sunNpeekAlloc을 고른다.주의 — 계획값이지 실제 헤드웨이가 아니다. 현재 코드의 피크 조건에 평일 검사가 들어가 토·일 *PeekAlloc 분기는 닿지 않는다. we*도 고르지 않는다.파생route.peekAlloc, route.npeekAlloc, route.satPeekAlloc, route.satNpeekAlloc, route.sunPeekAlloc, route.sunNpeekAlloc, route.wePeekAlloc, route.weNpeekAlloc; timing.response_received_at.kst, timing.response_received_at.utc; S1 master_dispatch_interval_minGBIS route 마스터 + 우리 수집기 응답 수신시각 + S1 특징 빌더
응답 내 노선 차량 수 (route_vehicle_count)make_observation 정규화에 성공한 차량 행 수를 센다.주의 — 실제 운행 대수 보장이 아니다. 차량키·순번·상태가 잘못된 원행은 먼저 빠진다. 정상 0대와 실패도 학습 스냅샷 행이 아니다.파생msgBody.busLocationList[]; S1 E4 derived/observations.jsonl 행; 코퍼스 vehicles[]; S1 route_vehicle_countGBIS 버스위치정보 getBusLocationListv2
좌석값이 있는 차량 수 (route_known_seat_count)remainSeatCnt>=0인 차량 수를 센다.주의 — -1은 포함하지 않는다.파생msgBody.busLocationList[].remainSeatCnt; S1 route_known_seat_countGBIS 버스위치정보 getBusLocationListv2
응답 내 0석 차량 수 (route_full_bus_count)remainSeatCnt==0인 차량 수를 센다.주의 — 응답에 잡힌 차량만 센다.파생msgBody.busLocationList[].remainSeatCnt; S1 route_full_bus_countGBIS 버스위치정보 getBusLocationListv2
노선 응답 잔여석 평균 (route_seat_mean)응답 안의 비음수 remainSeatCnt에 산술평균을 적용한다.주의 — remainSeatCnt=-1은 제외한다. 유효 좌석값이 없으면 결측이다.파생msgBody.busLocationList[].remainSeatCnt; S1 route_seat_meanGBIS 버스위치정보 getBusLocationListv2 + S1 노선 응답 요약
노선 응답 잔여석 최솟값 (route_seat_min)응답 안의 비음수 remainSeatCnt에 최솟값을 적용한다.주의 — remainSeatCnt=-1은 제외한다. 유효 좌석값이 없으면 결측이다.파생msgBody.busLocationList[].remainSeatCnt; S1 route_seat_minGBIS 버스위치정보 getBusLocationListv2 + S1 노선 응답 요약
노선 응답 잔여석 중앙값 (route_seat_median)응답 안의 비음수 remainSeatCnt에 numpy.quantile 기본 선형 보간의 0.50 분위수를 적용한다.주의 — remainSeatCnt=-1은 제외한다. 유효 좌석값이 없으면 결측이다.파생msgBody.busLocationList[].remainSeatCnt; S1 route_seat_medianGBIS 버스위치정보 getBusLocationListv2 + S1 노선 응답 요약
스냅샷 공간 헤드웨이 (spatial_headway_axis_seq)선택된 지난 차량의 last_passed에서 선택된 상류 차량의 last_passed를 뺀다.주의 — 양쪽 차량이 모두 있어야 한다. 시간 헤드웨이가 아니라 전체 순번축의 간격이다.파생msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd, msgBody.busLocationList[].vehId; S1 spatial_headway_axis_seqGBIS 버스위치정보 getBusLocationListv2 + S1 상류·지난 차 선택
관측 헤드웨이 하한 (observed_headway_lower_sec)같은 원천·노선·정류장의 최근 통과 시작에서 그 전 통과 끝을 빼고 0 아래를 자른다.주의 — 정확 통과시각 차가 아니라 두 검열 구간이 허용하는 하한이다.파생S1 passage_events.passage_interval_start, passage_events.passage_interval_end; 특징 observed_headway_lower_secS1 passage_events의 연속 통과 구간
관측 헤드웨이 상한 (observed_headway_upper_sec)최근 통과 끝에서 그 전 통과 시작을 빼고 0 아래를 자른다.주의 — 계획 배차간격과 다른 관측 구간 상한이다.파생S1 passage_events.passage_interval_start, passage_events.passage_interval_end; 특징 observed_headway_upper_secS1 passage_events의 연속 통과 구간
요일 (query_day_of_week)KST 날짜에 Python weekday()를 적용한다. 월요일 0, 일요일 6이다.주의 — 공휴일 표시는 없다. 요일만 구분한다.파생timing.response_received_at.kst, timing.response_received_at.utc; S1 E4 response_received_kst, response_received_utc; 코퍼스 collectedAt; S1 query_day_of_week우리 수집기 응답 수신시각; 제한 코퍼스는 수집기가 붙인 collectedAt
노선 (route)직접 수집은 calls.jsonl.route_name, 코퍼스는 route.name을 모델 범주로 읽고 같은 route.routeName 마스터 행을 찾는다. 수집기 설정의 route.route_id와 원응답 routeId는 원문에 남는다.주의 — 현재 S1 구현은 실제로 routeName으로 마스터를 찾는다. msgBody.busLocationList[].routeId를 모델의 route로 복사하지 않는다. 대상 두 노선 밖으로 넓힐 때는 ID 검증이 필요하다.응답 원본msgBody.busLocationList[].routeId; 운영 수집기 route.name, route.route_id; S1 E4 calls.jsonl.route_name; 코퍼스 route.name; route.routeName, route.routeId; S1 routeGBIS 버스위치정보 getBusLocationListv2 + 우리 수집기 노선 메타데이터 + 제한 코퍼스 + GBIS route 마스터
회차 전 여부 (is_outbound)station_seq<=turn_seq면 1, 아니면 0이다.주의 — 공식 upDown을 그대로 쓴 값이 아니다. 내부 순번축을 회차점에서 둘로 나눈 표시다.파생route.turnSeq, S1 station_seq; S1 is_outboundGBIS route 마스터 + S1 통과 사건
직전 통과 라벨 존재 (previous_passage_exists)같은 원천·노선·정류장에서 질의시각 전에 구간이 끝나고 라벨까지 관측된 가장 최근 통과가 있으면 1이다.주의 — 현재 행의 미래 라벨은 후보가 될 수 없다. 원천을 넘겨 연결하지 않는다.파생S1 passage_events.source, passage_events.route, passage_events.station_seq, passage_events.passage_interval_end, passage_events.label_observed_at, passage_events.label_status; 특징 previous_passage_existsS1 passage_events
상류 버스 존재 (upstream_bus_exists)정규화 마지막 통과 순번이 목표 station_seq보다 작은 차량이 하나라도 있으면 1이다.주의 — API가 노선의 모든 차량을 포착한다는 뜻은 아니다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; S1 정규화 last_passed; S1 upstream_bus_existsGBIS 버스위치정보 getBusLocationListv2 + S1 스냅샷 특징 빌더
이미 지난 버스 존재 (passed_bus_exists)정규화 마지막 통과 순번이 목표 station_seq 이상인 차량이 하나라도 있으면 1이다.주의 — 그 차량이 사용자가 탈 다음 차량이라는 뜻은 아니다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; S1 정규화 last_passed; S1 passed_bus_existsGBIS 버스위치정보 getBusLocationListv2 + S1 스냅샷 특징 빌더
상류 버스 상태 (upstream_state_cd)선택된 상류 차량의 원 stateCd를 붙인다.주의 — 로지스틱은 0·1·2를 원핫 표시로 바꾼다. 상태 의미와 축 위치 정규화는 별개다.파생msgBody.busLocationList[].stateCd, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].vehId; S1 upstream_state_cdGBIS 버스위치정보 getBusLocationListv2 + S1 최근접 상류차 선택
지난 버스 상태 (passed_state_cd)선택된 지난 차량의 원 stateCd를 붙인다.주의 — 로지스틱은 0·1·2 원핫 표시로 바꾼다.파생msgBody.busLocationList[].stateCd, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].vehId; S1 passed_state_cdGBIS 버스위치정보 getBusLocationListv2 + S1 최근접 지난 차 선택
목표 정류장 ID (station_id)차량별 정규화 위치가 전진한 끝점의 station_seq를 만들고, 같은 노선의 staOrder와 맞춰 stationId를 붙인다.주의 — 응답의 msgBody.busLocationList[].stationId를 목표 통과 정류장 ID로 복사하지 않는다. 그 값은 응답 시점 차량 위치의 정류장이다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd; routestation.routeName, routestation.staOrder, routestation.stationId; S1 station_idGBIS 버스위치정보 getBusLocationListv2 + GBIS routestation 마스터 + S1 통과 사건 빌더
KST 30분대 (query_half_hour)응답 수신시각을 KST로 바꾸고 hour*2 + 1[minute>=30]으로 0~47을 만든다.주의 — msgHeader.queryTime과 HTTP Date는 시간 계산에 쓰지 않는다. 코퍼스 collectedAt은 본문 파싱 뒤 시각이다.파생timing.response_received_at.kst, timing.response_received_at.utc; S1 E4 response_received_kst, response_received_utc; 코퍼스 collectedAt; S1 query_half_hour우리 수집기 응답 수신시각; 제한 코퍼스는 수집기가 붙인 collectedAt
훈련 셀 사전 로그오즈 (train_only_cell_prior_logit)노선×정류장×30분 셀의 만석률을 전역 사전으로 축소해 로그오즈로 바꾼다. 훈련 행은 자기 라벨을 뺀 leave-one-out 집계를 쓴다.주의 — 예측·validation에는 훈련 전체 집계만 적용한다. 원 API 필드가 아니며 현재 행 라벨을 섞지 않는다.파생S1 route, station_id, query_half_hour, label_full; 모델 내부 train_only_cell_prior_logit로지스틱+상호작용 내부 경험적 베이즈 집계
출발 후 만석 라벨 (label_full)정류장 s 통과 뒤 같은 차량에서 (stateCd,stationSeq)=(2,s),(0,s),(1,s+1) 중 처음 잡힌 유효 좌석값을 찾는다. 0이면 1, 양수면 0이다.주의 — remainSeatCnt=-1은 결측이다. (stateCd,stationSeq)=(1,s)는 도착 상태라 라벨이 아니다. 예측 시점 뒤에 생기므로 학습 정답으로만 쓴다.파생msgBody.busLocationList[].vehId, msgBody.busLocationList[].stationSeq, msgBody.busLocationList[].stateCd, msgBody.busLocationList[].remainSeatCnt; timing.response_received_at.kst, timing.response_received_at.utc; S1 passage_events.label_full, label_remain_seatsGBIS 버스위치정보 getBusLocationListv2 + 우리 수집기 응답 수신시각 + S1 통과 사건 빌더

지금은 안 쓰는 재료 4개

Q. 보정은 실제로 적용됐나?

실제 기록 · 미적용

요청 방법 none — 이 모델의 공개 확률에는 보정층을 적용하지 않았다. 확률 보정은 별도 보정층인 숫자 다듬기 · Platt 확률 보정 페이지에서 다룬다.

해설 기준: 아래 세 절(왜 이 방법인가 · 어떻게 작동하나 · 실측 워크스루)은 M1·M2 연구 수집분과 당시 연구 변형(실시간 특징 37개 + isotonic 보정)의 기록이다. 오늘 성적과 합치지 않는다. 운영 v1의 계산은 위 "어떻게 계산하나"가 기준이다.

왜 이 방법인가

Q. 정류장·시간만으로 AUC가 .9613인데 무엇을 더 보나?

검증 범위는 20일 코퍼스 보조 원천의 평일 고정창이다. validation 10,040건 중 만석은 583건이다. 직접 수집 validation은 443건, 만석은 14건이다. 다만 수집 날짜가 하루뿐이라 날짜 간 변동은 아직 못 본다.

정류장×30분 셀은 833개다. 이 중 281개, 33.73%는 학습 표본이 10건 이하다. 719개, 86.31%는 만석을 한 번도 못 봤다. 셀 비율을 그대로 쓰면 얇은 셀을 위험 0으로 외우기 쉽다.

그렇다고 위치를 버리면 안 된다. 아무것도 안 본 기준선은 AUC .5000이다. 앞 통과 버스 한 대만 보면 .7187이다. 정류장·시간을 보면 .9613이다. 원자료에서 커 보였던 2차 만석 효과도 정류장×30분으로 나누자 사라졌다. 위치와 시간이 먼저다.

이 모델은 그 위에서 묻는다. 같은 정류장, 같은 시간이라도 직전 버스가 만석이었는지, 상류 버스에 몇 석이 남았는지, 노선 전체에 만석 버스가 몇 대인지가 위험을 더 바꾸는가. 정류장×시간대 기준선이 이미 맞힌 몫은 새 모델의 공으로 세지 않는다.

지표정류장×시간대로지스틱+상호작용 isotonic짝지은 차이 [95% 구간]
ECE ↓.0063.0065+.0002 [-.0028, +.0048]
Brier ↓.0327.0231-.0096 [-.0120, -.0073]
log loss ↓.1033.0787-.0247 [-.0315, -.0180]
AUC ↑.9613.9775+.0162 [.0093, .0222]

순위와 확률 손실은 좋아졌다. ECE는 기준선보다 좋아졌다고 말할 근거가 없다. 다만 운영 후보의 보정 변형 가운데 ECE .0065는 2위다. 실제 만석인데 p_full<.5로 본 비율도 .6003에서 .3019로 줄었다.

어떻게 작동하나 — 연구 변형

Q. 위치·시간의 시작점은 어떻게 만드나?

먼저 노선×정류장×30분의 만석률을 만든다. 셀 표본에 노선 만석률 한 건어치를 섞는다.

p_cell = (셀 만석 건수 + 1 × 노선 만석률) / (셀 표본 수 + 1)

학습 행은 자기 라벨을 뺀 LOO 값만 본다. 자기 정답을 자기 입력에 넣는 누수를 막는다. 예측 때는 학습 전체로 만든 값을 쓴다. 처음 보는 셀은 노선×정류장, 노선×30분, 노선, 전체 순서로 물러난다.

Q. 상호작용은 무엇을 더하나?

실제 코퍼스 학습에서 기초 입력은 37열이다. 결측 중앙값과 결측 표시 11열을 붙이면 48열이 된다. 이를 표준화한 뒤 원래 항 48개와 두 항씩 짝지은 항 1,128개를 만든다. 합계 1,176개다.

짝은 직전 버스 만석×상류 버스 잔여석, 셀 위험×노선 평균 잔여석, 시각×배차간격처럼 생긴다. 기본요금에 옵션 요금을 붙이는 계산과 닮았다. 위치·시간이 기본요금이고, 특정 재료가 함께 나타날 때만 붙는 조정값이 상호작용이다.

1,176개 계수는 모든 행에서 같은 고정값이다. 계수들이 공통 분포에서 서로 힘을 빌리지는 않는다. 대신 L2 규제로 전부 0 쪽으로 누른다. 날짜 순방향 교차검증이 고른 세기는 C=.003이다.

Q. 점수는 어떻게 확률이 되나?

작은 식 하나면 끝난다.

p_raw = 1 / (1 + exp(-(b + Σβx + Σγxx)))

βx는 원래 항, γxx는 두 재료의 상호작용이다. 계수 부호는 인과효과가 아니다. 같은 데이터 안에서 다른 입력을 고정했을 때 점수가 움직인 방향이다.

원점수는 시간순 OOF 10,236건, 만석 572건으로 학습한 isotonic 보정기를 지난다. validation 라벨은 보정기에 들어가지 않았다. 마지막 출력은 p_full이고, 사용자에게 보일 값은 보수적으로 매핑한 p_board=1-p_full이다.

Q. 연구 변형에 들어간 재료는 어디까지였나?

묶음쓰는 값맡는 일
위치·시간노선, 정류장 셀 위험, 순번, 분·요일의 주기값, 방향먼저 깔리는 시공간 위험
직전 통과존재 여부, 만석 여부, 출발 후 잔여석, 지난 초같은 정류장의 최근 상태
상류·통과 버스존재, stateCd, 잔여석, 축거리, 좌석 변화율, 순번 속도지금 접근하는 차량과 주변 흐름
노선 응답차량 수, 좌석값이 있는 차량 수, 만석 대수, 잔여석 평균·최소·중앙값한 스냅샷의 노선 전체 상태
간격·계획공간 헤드웨이, 관측 헤드웨이 상·하한, 계획 배차간격차량 사이 간격과 계획 운행
학습 정답목표 정류장 출발 이후 잔여석 0만석 라벨. 서빙 입력에는 없음

remainSeatCnt=-1은 0으로 바꾸지 않는다. 결측으로 둔 뒤 학습 중앙값과 결측 표시를 함께 넣는다. 좌석 변화율과 속도의 시간축은 로컬 응답 수신시각이다.

고정효과 로지스틱의 계산 경로
37개 기초 입력
중앙값+결측 표시 11열
결측 처리 뒤 48열
표준화·2차 짝지음
원항+두 항씩 1,176개
C=.003 L2 계수 합
고정 로짓
sigmoid
원 만석확률
시간순 OOF 10,236/572
isotonic 보정
p_board=1-p_full
p_full·p_board

시공간 위험과 실시간 상태를 1,176개 원항·짝항으로 펼친 뒤 보정된 만석확률을 낸다.

실측 워크스루 — 한 건은 어떻게 나왔나

Q. 2026년 8월 3일 아침 범계역에서는 어떤 숫자가 들어갔나?

질의 시각은 07:24:01 KST다. 노선은 3330, 목표는 55번 롯데백화점.범계역이다.

입력실제 값
같은 셀의 학습 기록23건 중 만석 14건
3330 축소 노선 만석률.052628
직전 통과569.270초 전, 출발 후 0석
최근접 상류 버스축 1칸 전, stateCd=1, 잔여 22석
노선 응답24대 중 만석 2대
노선 잔여석평균 32.75석, 최소 0석, 중앙값 35석
계획 배차5분

셀 시작값부터 계산한다.

p_cell = (14 + .052628) / 24 = .585526

37개 입력과 상호작용을 모두 더한 로짓은 z=-.101958이었다. 따라서 원 만석확률은 sigmoid(z)=.474533이다. isotonic 보정 뒤에는 .530631이 됐다. 화면용 탈 확률은 1-.530631=.469369다.

이 버스의 정답은 출발 후 0석, label_full=1이었다. 이 한 건에서는 .5 기준의 만석 쪽에 섰다. 셀 시작값 .585526이 원점수 .474533으로 내려간 이유를 앞차 한 항의 공으로 떼어 말하지는 않는다. 1,176개 고정계수의 합이 만든 값이다.

Q. 언제 실패하나?

연구 수집분에서 실측된 약점

해설 기준: M1·M2 연구 변형이다.

고위험 구간에 남은 과소예측
평균 예측.7268
14.33%p 과소예측
실제 만석률.8701

보정된 p_full이 .7 이상 .8 미만인 177건의 평균이다.

Q. 프로토타입과 무엇이 다른가?

Q. 예전 화면의 탑승 확률을 회귀식으로 바꾼 것뿐인가?

아니다. 목표와 계산 경계가 달라졌다.

프로토타입로지스틱+상호작용
화면 탑승률은 셀의 1-만석 관측 비율, 차량 좌석 예보는 별도 정규분포 전파였다.출발 후 만석확률 하나만 학습한다. 보수적 탈 확률은 1-p_full이다.
도착 전 좌석과 출발 후 좌석의 뜻이 계산 경로마다 섞였다.목표 정류장 도착값은 라벨에서 뺀다. 출발 이후 0석만 만석으로 센다.
셀 비율을 그대로 써 얇은 셀이 0이나 1에 붙었다.train-only 셀 prior, 자기 라벨 제외 LOO, C=.003 규제를 쓴다.
정류장당 2분, 정규 수요, 10석 여유폭, 만석 연속 1회 이상 같은 고정 규칙이 판정을 만들었다.관측 헤드웨이 범위, 절대 잔여석, 상태, 배차, 노선 스냅샷의 계수를 학습한다. 몇 석·몇 분·대기열·이동 추천은 내지 않는다.
확률 보정층이 없었고 화면 탑승률과 차량 예보의 채점 대상도 달랐다.시간순 OOF로 raw·Platt·isotonic을 따로 맞추고 같은 label_full로 비교한다.
좌석 상태를 0~80으로 잘랐고 crowded를 원본에 보존했다.정원·점유율·혼잡도를 입력에서 모두 뺀다. 절대 잔여석만 쓴다.

Q. 개인정보와 미래 정답은 어떻게 막나?

학습·평가 분할 규칙과 라벨 정의는 평가 규약에 있다.

다음 확인

참고·비교·출시 관문의 수치 기준은 평가 규약에 있다.

M3 연구 이력 — 2026-08-15 동결

아래 수치는 동결된 연구·평가 기록이다. 위 오늘 성적과 합치거나 변화율로 계산하지 않는다.

Brier0.0052ECCE-MAD0.0239log loss0.04831:1 결정비용0.00422:1 결정비용0.00844:1 결정비용0.0168
M3 권위값

직접 API 응답 582개를 고정해 train 604행·만석 28건, validation 1,901행·만석 8건·날짜 1일로 나눴다.

모델 7개를 paired bootstrap 5,000회와 Holm 21쌍으로 비교했다. 결정은 no_winner, 승자 없음이다. 최소 관문은 validation 날짜 10일·만석 100건이다.

validation 양성 20건 미만이면 만석 누락률·PR-AUC·ROC-AUC 수치를 억제한다. M1·M2 수치는 역사 기록이며 최신 결론과 섞지 않는다.

M3 직접 수집분 성적

68/32 이동 분할이 아니라 M2 마지막 응답 뒤의 고정 미래구간을 썼다. 검증 1,901행·만석 8건· 하루·정류소×날짜 129군집, paired_station_id_x_query_date_cluster_bootstrap 5,000회다.

D · 재료 다 넣기 + 숫자 다듬기 (raw fallback)

운영 후보 · M3 고정 미래구간 기술값 · 낮을수록 좋음

지표값 (95% 구간)
Brier · 얼마나 빗나갔나0.0052[0.0011, 0.0107]
ECCE-MAD · 확률 오차가 쌓이나0.0239[0.0176, 0.0287]
log loss · 확신하고 틀린 벌점0.0483[0.0289, 0.0734]
만석 누락 @ .5 · 만석을 안심으로 놓쳤나만석 20건 미만 · 수치 억제
1:1 결정비용 @ .500.0042[0.0000, 0.0099]
2:1 결정비용 @ .330.0084[0.0000, 0.0199]
4:1 결정비용 @ .200.0168[0.0000, 0.0397]
승자는 없다

동결 당시 표본은 validation 날짜 1/10일 (미달), 만석 8/100건 (미달)이다. 만석 민감 지표는 양성 20건부터 숫자를 내며 동결 시점에는 수치 억제였다. 관문은 검토 최소선이지 충분조건이 아니다.

모델별 보정 관문은 미달 — 적격 적용 0/3개 · raw fallback 5,703행이다. 비억제 모델쌍×지표 bootstrap 유효비율 최소값은 100.0%(기준 90%), 운영 후보 비용 방향 뒤집힘은 0/15쌍이다. 마지막 세 날짜 누적 Brier도 승자 전에 확인한다.

하루 조건부 기술 구간과 Holm 계산상 0을 벗어난 Brier 쌍은 10/21쌍이지만 날짜 일반화나 우열 판정이 아니다. 최종 판정은 0/21쌍이다. 만석 8건이면 누락률이 한 사건당 12.5%p 움직인다. PR-AUC·ROC-AUC도 만석 20건 미만이면 억제하며 순위에 쓰지 않는다.

1–4일은 관측 날짜 안 조건부 기술값, 5–9일은 진단 기술값이다. 검증 10일부터도 모든 관문을 통과해야 추론과 승자 선언을 검토한다. 경로·수집구간·날짜·라벨 규칙·관측간격 다섯 축은 한 축씩 기록하고 90초 초과는 검열한다. ECCE 동률은 독립 동결 nonce의 SHA-256 순서로 재현하고 전 행 누적곡선을 남긴다. 이번 재실행은 registry 후보 3,054건 중 기존 nonce 3,054건을 재사용했고 신규는 0건이다.

보정은 이름이 아니라 실제 예측 출처로 판정한다. 이 페이지 변형의 적격 적용은 0/1개, raw fallback은 1,901행이다. 모델별 순방향 fold·실제 calibrated prediction·raw fallback 0행을 모두 확인하기 전에는 보정 우위를 말하지 않는다.

정원·차종은 검증해서 버린 재료가 아니다

M3는 직접 수집분만 쓰고 공식 이력·제원으로 정원·차종 ablation을 실행했다. 직접 관측 고유차량 55/62대에 공식 이력이 연결됐다. 공유 페이지에는 차량번호와 비공개 조인 식별자 값을 싣지 않는다.

새 지표에서 명백한 개선으로 판정한 조합은 0개다. 표본 관문 미달이라 쓸모없다는 뜻은 아니다. 관측 최대 잔여석으로 정원을 추정한 행은 0건이며 계속 금지한다.

이전 공개 평가

평가규격행Brier
eval-20260815-f0f59cf25a9c3503evaluation-v22,8940.0085
eval-20260815-7e03dc730de91f34evaluation-v12,8940.0085

2026-08-15 동결 당시의 공개 평가 기록이다. 표본은 2,894행 · 만석 23건 · 관측일 1일이었다.

출처와 검증 장부
오늘 보고서daily-20260816-86afbfc70dbb876b · 2026-08-16분 · 생성 08-17 00:15 KST
오늘 규격평가 evaluation-v2 · 구간 cohort-v1 · 모델 logistic-interactions-v1+fd482d90
이력 · 공개 평가eval-20260815-f0f59cf25a9c3503 · 자료판 current-7cf2243ffe6c4cdc · 모델 logistic-interactions-v1+cca34cdb · 관측 2026-08-14 16:38 ~ 2026-08-15 11:47 KST
이력 · 해시평가 규격 43913ebf483a48a02f6a83e01181a01ccf8bc10a728a38b9e838031ac9dbeec5 · 구현 cca34cdb16f663754e630e9f41abd26b6b441a19dd5002291f18af63f9a21a9a · 평가 산출 d133e3d6c2db757c5fa780d5ffb19e6998b2dcefc049b844a8faebd64e14a817
이력 · 이전 규격eval-20260815-7e03dc730de91f34 · evaluation-v1 · 모델 logistic-interactions-v1+fbebba55