평가 규약

공개 관문, 코호트 구간, 지표, 학습/평가 분할의 정의는 이 문서에만 둔다. 다른 페이지는 정의를 다시 쓰지 않고 이 규약을 링크로 가리키며, 숫자의 원장은 일일 평가 API가 맡는다. 정의를 바꿀 때는 규격 버전을 올리고 이 문서를 먼저 고친다.

2026-08-20 — 규격을 evaluation-v6, 점수 정책을 composite-score-v2로 분리했다. 확률 맞춤 항목이 전체 평균에서 시간대별 과소·과대 예측을 상쇄하고, 라벨을 섞어도 변하지 않는 값을 재료로 쓰던 결함을 고쳤다. 이제 시(hour)마다 편향을 먼저 재고 표본 수로 평균한다. 전체 블록은 모든 시간대를 쓰며, 코호트는 각 시간대 층이 30행 이상일 때만 이 지표와 종합 점수를 낸다. calibration_bias와 ecce_mad는 진단값으로 남지만 점수에는 들어가지 않는다. v1과 v2 점수는 같은 눈금이 아니므로 서로 비교하지 않는다.

2026-08-19 — 규격이 evaluation-v4 에서 evaluation-v5 로 올라갔고, 평가 Lambda 에 실제로 올라갔다. 아래 공개 계약은 그대로다 — 지표 열 개, 가중치, 코호트 13구간, 모델 일곱, 학습·평가 분할이 v2 부터 바뀌지 않았다. v5 가 더한 것은 사설 산출물에만 들어가는 둘이다. (1) 좌석 채점 — 08번의 지평 모델이 만석 확률만이 아니라 좌석 분포 전체로 채점된다(4-1절). (2) 지평 전용 코호트 축 — 확률 17축, 좌석 26축(3절). 관측 처리도 셋 고쳤다 — 상류 관측을 창의 첫 관측으로 잡아 지평 1 의 중앙 리드타임이 0.33분에서 1.7분이 됐고(종전은 예보가 아니라 도착 순간의 실황이었다), capacity 에 관측 횟수를 함께 실어 관측이 모자라 상한에 못 닿은 차량을 드러내며, 출발 후 검증의 허용 stateCd 를 명시했다. 지평(horizonStops)은 목표 순번 − 차량 순번인 raw 노선 대장 순번 차이다. 경유(미정차) 지점도 한 칸으로 세며 승차 가능한 정류장 수가 아니다. 상류 관측을 바꿨으므로 v4 이전에 적합한 계수는 옮겨 쓸 수 없고, 지평 성적은 어제와 이어 읽으면 안 된다.

2026-08-19 — 규격이 evaluation-v3 에서 evaluation-v4 로 올라갔다. 아래 정의는 여기서도 하나도 바뀌지 않았다 — 지표 열 개, 가중치, 라벨 계약, 코호트, 학습·평가 분할이 v2 부터 그대로다. v4 가 바꾼 것은 어느 정류장을 채점하느냐 하나다 — 채점 대상을 승차 정류장으로 한정했다. 판정은 노선 판본에 매인 정류장 대장을 조회해 boarding_allowed = NOT station_id LIKE '277%' 로 한다 (순번 목록을 규약에 박아 두면 노선이 개편될 때 순번이 밀려도 오류 없이 조용히 틀린다). 뺀 건수는 말뭉치 원장의 excluded_non_boarding 과 산출물의 label_scope 양쪽에 남긴다 — 조용히 빼지 않는다. 수집기가 실어 보낸 stationId 가 대장과 어긋나면 일일 발행을 멈춘다(station_id_mismatch_policy: fail). 셀 통계·z화 모집단·이웃 폴백·구간합의 seen 이 모두 승차 정류장만으로 잡히므로 v3 에서 적합한 계수는 옮겨 쓸 수 없다. 2026-08-19 평가 Lambda 배포로 실제 반영됐다.

2026-08-19 — 그 전에 규격이 evaluation-v2 에서 evaluation-v3 로 올라갔다. 아래 정의는 하나도 바뀌지 않았다 — 지표 열 개, 가중치, 라벨 계약, 코호트, 학습·평가 분할이 전부 v2 그대로다. v3 가 바꾼 것은 무엇을 채점하느냐 셋이다. (1) 08번의 지평을 2·4·8·12 넷에서 1~12 전부로 넓혔다 — 서빙 계약의 운영 범위와 맞췄다. (2) 나머지 일곱의 일일 채점을 2026-08-19 평가일까지로 끊었다. 멈추는 것과 지우는 것은 다르다 — 일곱은 이 규약에 그대로 남고 지난 점수도 이력에 그대로 이어진다. 멈춘 뒤 산출물은 지표 자리를 비우고 그 자리에 멈춘 사실과 시점을 적는다. 규약의 상태값을 되돌리면 다시 채점된다. (3) 일곱의 역할을 운영 후보에서 비운영 참조로 내렸다 — 서빙 후보도 아니고 매일 겨루는 대조군도 아니게 됐으므로 옛 라벨이 참이 아니다. 2026-08-19 평가 Lambda 배포로 실제 반영됐다.

1. 라벨 — 만석이라는 사건

모든 모델의 정답은 하나다. 목표 정류장을 출발한 직후의 잔여석이다.

만석목표 정류장 출발 뒤 처음 확인한 유효 잔여석이 0이면 만석이다.
비만석같은 시점의 유효 잔여석이 1 이상이면 비만석이다.
결측잔여석 -1과 값 없음은 만석으로도 비만석으로도 바꾸지 않는다. 0으로 바꾸면 가짜 만석이 생긴다.
출발 전 상태잔여석이 보여도 라벨로 쓰지 않는다. 내 정류장 도착값도 금지한다.
중복과 경계같은 통과 사건은 한 번만 세고, 분할 경계 뒤에 확인된 라벨은 학습·평가에서 뺀다.
뜻의 범위만석은 좌석 소진이라는 보수적 사건이다. 하차로 생긴 자리에 일부 승객이 탄 경우까지 만석으로 세며, 개인의 승차 성공과 같지 않다.
입석대상 두 노선에 입석은 없다. 형식승인 입석 정원이 연결된 49/49 차종에서 0이다. 그래서 잔여석 0은 곧 승차 불가이고, 좌석 감소량은 곧 순 승차 인원이다.

2026-08-19 — 라벨이 이진에서 분포로 넓어졌다. 위 정의는 그대로 유효하다. 다만 좌석 분포를 내는 후보(08번)가 생기면서 정답을 출발 뒤 잔여석 그 자체로도 읽는다 — 만석은 그 분포의 0 지점이다. 이진 라벨 잔여석 == 0은 분포 라벨에서 파생되므로 두 정의는 어긋나지 않는다. 공개 일일 평가가 채점하는 대상은 지금도 만석 확률 하나이고, 좌석 그 자체를 채점하는 것은 사설 지평 산출물뿐이다(evaluation-v5부터, v6 유지). 분포를 쓰는 이유는 표본에 있다 — 만석은 전체의 1.04%뿐이라 그것만으로는 배울 표본이 모자라지만, 분포로 배우면 나머지 98.96%도 학습에 들어온다.

채점 대상은 승차 정류장뿐이다(evaluation-v4부터, v6 유지). boarding_allowed = NOT station_id LIKE '277%' 가 거짓인 지점은 승객이 탈 수 없으므로 예보 행도 채점 행도 만들지 않는다. 라벨 정의(위 표)는 여기에 영향받지 않는다 — 이것이 정하는 것은 어느 정류장을 채점하느냐뿐이다.

2. 학습/평가 분할

한국 표준시 날짜의 순방향 분할이다. 미래 정답이 과거로 새는 길을 막는다.

3. 코호트 13구간

요일 2 + 시간대 3 + 노선 2 + 노선×시간대 6 = 13구간. 구간 규격은 cohort-v2다.

축구간정의
요일 (2)평일공휴일이 아닌 월~금. KST 날짜 기준이다.
주말토~일, 그리고 공휴일.
시간대 (3)출근KST 07:00 이상 09:00 미만.
퇴근KST 17:00 이상 20:00 미만.
그 외출근·퇴근에 들지 않는 모든 시각.
노선 (2)노선 1650노선 1650의 전체 평가 행.
노선 3330노선 3330의 전체 평가 행.
노선×시간대 (6)1650·출근 / 1650·퇴근 / 1650·그 외 / 3330·출근 / 3330·퇴근 / 3330·그 외위 노선과 시간대 정의를 그대로 교차한다.

3-1. 지평 모델 전용 축 (horizon-cohort-v1)

2026-08-19 추가. 위 13구간은 공개 계약이라 그대로다. 지평 모델은 사설 산출물이라 그 계약에 매이지 않아 축을 더 뒀다. 표본이 되는 축만 넣었다.

축구간만석 확률좌석근거
공개 13구간 + 전체17채점채점위 3절 그대로 상속한다.
직전 만석 연속0 / 1~2 / 3+신설신설세 버킷 모두 12지평 전부에서 만석 20건을 넘는다. 새로 넣은 축 가운데 유일하다. 대기가 쌓인 국면은 서비스가 가장 답해야 하는 자리인데 13구간 어디에도 잡히지 않았다.
정류장 구간앞머리 1~12 / 중간 / 회차±4 / 후미 12넣지 않음신설앞머리·회차±4·후미는 12지평 전부에서 만석 0건이라(합쳐 14.7만 행) 확률 지표가 영구히 정의되지 않는다. 좌석 오차는 만석이 0건이어도 정의된다.
예측 시점 좌석0석 / 1~25 / 26~50 / 51~75 / 76~100%넣지 않음신설만석이 지평을 따라 버킷 사이를 통째로 옮겨 다녀(지평 1은 68%가 '이미 만석', 지평 12는 63%가 '76~100%') 60칸 중 만석 20건 이상이 17칸뿐이다.
차량 정원 · 시간대 세분—넣지 않음정원은 49·68석이 관문 밖이고 capacity 자체가 관측 파생값이다. 시간대 세분은 만석이 가장 많은 06·07시의 만석 관측일이 하루뿐이라 하루가 칸을 지배한다.

4. 지표 11개

확률 오차를 첫 지표로 보되, 한 가지 지표만으로 모델을 판단하지 않는다.

이름공개 이름뜻좋은 방향
brier확률 오차 (Brier)예측한 만석확률과 실제 결과의 차이를 제곱해 평가 건 전체에서 평균한다.낮을수록
log_loss로그 손실 (Log loss)틀린 답을 강하게 확신할수록 더 큰 벌점을 주고 평균한다.낮을수록
calibration_bias평균 확률 편향 (Calibration bias)평균 예측확률이 실제 만석 비율보다 전체적으로 높거나 낮은 정도다.0에 가까울수록
calibration_stratified층별 확률 편향 (Stratified calibration error)시(hour)마다 따로 잰 평균 확률 편향의 절댓값을 그 시의 평가 건수로 가중해 평균한다. 2026-08-20 추가 — 아래 5절.낮을수록
ecce_mad누적 보정 오차 (ECCE-MAD)예측확률이 낮은 순으로 정렬해 실제값과 예측확률의 차이를 누적하고, 누적 절댓값의 최댓값을 평가 건수로 나눈다.낮을수록
miss_rate만석 누락률 (Miss rate)실제 만석 가운데 확률을 경고 기준 .50보다 낮게 말해 놓친 비율이다.낮을수록
pr_auc만석 탐지 성능 (PR-AUC)경고 기준을 바꿔 가며 만석을 놓치지 않는 정도와 경고가 맞는 정도의 균형을 요약한다.높을수록
roc_auc만석 구분 성능 (ROC-AUC)무작위로 고른 만석·비만석 한 쌍에서 만석에 더 높은 확률을 주는 정도다.높을수록
cost_1가중 오분류 비용 1:1만석을 놓친 손해와 잘못 경고한 손해를 같게 두고 임계값 .50에서 오판 비용을 평균한다.낮을수록
cost_2가중 오분류 비용 2:1만석을 놓친 손해를 두 배로 두고 임계값 .33에서 평균한다.낮을수록
cost_4가중 오분류 비용 4:1만석을 놓친 손해를 네 배로 두고 임계값 .20에서 평균한다.낮을수록

표기 — 지표는 소수 4자리(0.0107), PR-AUC·ROC-AUC는 3자리(0.834), 누락률은 백분율(100.0%), 종합 점수는 1자리(45.6).

4-1. 좌석 분포를 내는 후보의 추가 축

2026-08-19 추가. 위 11개는 일일 평가 원장의 지표다. 분포를 내는 후보는 설계 검증에서 아래 네 축을 함께 본다.

축재는 것좋은 방향
CRPS분포 정확도. 예측한 좌석 분포 전체가 실제 좌석에서 얼마나 벗어났는지를 좌석 단위로 잰다.낮을수록
p0 brier만석 확률 오차. 분포의 0 지점만 떼어 낸 확률 오차다. 위 brier와 같은 계산이다.낮을수록
calib ratio보정비. 평균 만석확률을 실제 만석률로 나눈 값의 로그 절댓값. 1.5배 과대예측과 1.5배 과소예측에 같은 벌점을 준다.0에 가까울수록
pr_auc만석 탐지. 위 pr_auc와 같다.높을수록

4-2. 좌석 점추정 축 (evaluation-v5)

2026-08-19 추가. 4-1절 네 축은 그대로 두고, 좌석 단위 점추정 축을 덧붙였다. 사설 지평 산출물에만 들어가며 종합 점수에는 넣지 않는다.

축재는 것좋은 방향
mae평균 |예측−실제|.낮을수록
rmse제곱오차의 뿌리. 큰 실수를 드러낸다.낮을수록
within3±3석 이내 비율.높을수록
bias평균(예측−실제). 양수면 자리를 실제보다 많게 봤다.0에 가까울수록
head_to_head그 행에서 모델이 기준선보다 가까웠던 비율. 동점은 반 건.높을수록

5. 종합 점수

서로 다른 지표를 0~100으로 바꿔 가중 합산한 연구용 보조값이다(composite-score-v2).

구성 요소이름가중치
확률 오차probability_error35
과신 벌점overconfidence15
확률 맞춤calibration20
만석 구분full_ranking15
놓침 비용service_cost15

확률 맞춤 항목을 고쳤다

종전 항목은 예측과 실제의 짝을 제대로 보지 못했다. |calibration_bias|는 평균 예측확률과 전체 만석률만 쓰므로 라벨을 무작위로 섞어도 소수 9자리까지 같았다. ecce_mad ≥ |calibration_bias|는 누적 경로의 끝점 때문에 정확 산술에서 항상 성립한다. 서로 다른 두 증거가 아니라 같은 정보를 겹쳐 센 셈이다.

지평 12편향뜻
06시−56.09‰만석을 크게 낮춰 봄
07시−30.02‰만석을 낮춰 봄
18시−9.53‰낮춰 봄
19시+9.69‰높여 봄
전체 평균 편향 절댓값0.838‰반대 방향이 서로 지워짐
시간대별 편향 가중평균7.944‰상쇄를 막은 값

v2는 시(hour)마다 |평균 예측확률 − 실제 만석률|을 먼저 재고 그 시의 평가 건수로 평균한다. 코호트는 모든 시간대 층이 30행 이상일 때만 이 항목과 종합 점수를 낸다. 작은 층을 점수로 만들지 않고 계산 불가 사유를 남긴다.

지평 12 공격 시험확률 맞춤 v1확률 맞춤 v2종합 v2
원본 A1890.067.467.8
실제 만석률 상수90.346.449.6
자기평균 상수84.747.849.8
확률 순서 섞기52.845.635.7
예측 뒤집기0.00.07.4

정보가 없는 두 상수 예보자가 기준 50 아래로 내려갔다. 순서를 섞은 예보는 시간대 평균도 어긋나지만, 예측과 결과의 짝이 무너진 더 큰 손해는 만석 구분과 확률 오차가 함께 잡는다.

눈금이 바뀐 경계

지평확률 맞춤 v1확률 맞춤 v2종합 v1종합 v2
190.493.090.791.2
477.984.879.681.0
887.577.276.274.1
1091.770.174.670.3
1190.867.072.467.6
1290.067.472.367.8

먼 지평이 갑자기 좋아 보이던 U자 모양이 사라졌다. 지평 순서의 스피어만 상관은 확률 맞춤에서 +0.462 → −0.993, 다섯 항목이 모두 같은 방향인 지평쌍은 21/66 → 64/66이 됐다.

v1과 v2의 차이를 모델 성능 변화로 읽지 않는다. 같은 자료를 다른 눈금으로 잰 값이다. A18은 사설 산출물이며 당시 12지평 모두 참고 가능 단계였다.

구성 항목과 놓침 비용의 한계

교정 뒤 확률 맞춤과 나머지 넷 평균의 상관은 +0.969다. 독립 축을 하나 더 만든 것이 아니라 반대로 움직이던 잡음 축을 없앤 것이다. 따라서 가중치 20에 새 유도 근거가 생긴 것은 아니다. 지평 12의 날짜별 종합은 56.6~75.2로 흔들렸고 평가일은 5개뿐이었다.

놓침 비용 4대1도 이름 그대로 읽으면 안 된다. 이 원장에서 시간순 기준 예보자는 임계값 0.2를 한 번도 넘지 않아 기준 cost_4 = 4π가 12지평·204코호트에서 성립했다. 이때 점수는 100 − 50·미탐률 − 50·오탐수/(4·만석수)라 비용비 4가 미탐 항에서 약분된다. 놓침을 네 배로 센 값이 아니라 오탐 벌점을 줄인 값이다.

두 대상의 우열은 같은 평가 규격·같은 표본에서 다섯 구성 항목이 모두 한쪽인 경우에만 말한다. A18 운영 선택은 이 점수로 정하지 않았고, 비운영 참조와 A18은 표본이 달라 서로 빼지 않는다.

6. 공개 관문

어느 상태에서도 계산 가능한 점추정은 공개하되, 허용하는 해석 범위가 달라진다.

공개 상태조건허용하는 해석
잠정승인된 운영 자료로 계산했지만 아래 기준을 아직 채우지 못했다.해당 평가 표본에서 나온 계산값으로만 읽는다.
참고 가능관측일 5일 · 평가 200행 · 만석 20건 · 비만석 100건 · 만석 관측일 3일 이상을 모두 채웠다.해당 구간에서 관측된 경향으로 읽는다.
모델 비교 가능관측일 10일 · 평가 500행 · 만석과 비만석 각 100건 · 만석 관측일 5일 이상을 모두 채웠다.같은 평가 규격과 같은 구간 안에서 모델을 비교할 수 있다.
최종 평가 통과학습일 14일 이상을 확보한 뒤, 사전에 기록한 미래평가 시작 시각 다음의 35일 고정 구간과 품질 관문을 통과했다.최종 모델 선택의 근거로 쓸 수 있다.

지금 어디까지 왔는지는 이 문서가 아니라 현황판의 관문 막대가 보여준다.

7. 한계

규약이 일부러 쓰지 않는 것과, 라벨이 원리상 못 보는 것.

출처와 검증 장부