비운영 참조 이전 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
상태 잠정 — 아래 관문을 다 채우기 전의 점추정이다.
지표 10개
| 지표 | 오늘 값 | 읽는 법 |
|---|---|---|
| Brier | 0.0097 | 확률 예측의 제곱 오차 평균 · 낮을수록 좋다 |
| 만석 누락률 | 100.0% | 실제 만석을 기준 50%에서 안심으로 놓친 비율 · 낮을수록 좋다 |
| ROC-AUC | 0.844 | 만석과 비만석을 가르는 힘 · 높을수록 좋다 |
| Log loss | 0.0467 | 확신하고 틀리면 커지는 벌점 · 낮을수록 좋다 |
| ECCE-MAD | 0.0058 | 누적 확률 오차의 흔들림 · 낮을수록 좋다 |
| PR-AUC | 0.060 | 드문 만석을 찾는 힘 · 높을수록 좋다 |
| 확률 쏠림 | 0.0058 | 예측 확률의 전체 쏠림 · 0에 가까울수록 좋다 |
| 잘못 안심 비용 1:1 | 0.0096 | 놓침과 헛경보를 같게 친 비용 · 같은 가정끼리 비교한다 |
| 잘못 안심 비용 2:1 | 0.0209 | 놓침을 2배로 친 비용 |
| 잘못 안심 비용 4:1 | 0.0436 | 놓침을 4배로 친 비용 |
점수 50 = 시간순 과거 만석률 기준 모델 · 자세한 기준은 평가 규약
구간별 동결 이력 성적
| 구간 | 행 | 만석 | Brier | 만석 누락 | ROC-AUC |
|---|---|---|---|---|---|
| 주말 | 18,055 | 173 | 0.0097 | 100.0% | 0.844 |
| 출근 | 2,702 | 0 | 0.0002 | — | — |
| 퇴근 | 4,195 | 12 | 0.0053 | 100.0% | 0.958 |
| 그 외 | 11,158 | 161 | 0.0136 | 100.0% | 0.886 |
| 노선 1650 | 7,532 | 160 | 0.0196 | 100.0% | 0.814 |
| 노선 3330 | 10,523 | 13 | 0.0026 | 100.0% | 0.874 |
| 노선 1650·출근 | 970 | 0 | 0.0001 | — | — |
| 노선 1650·퇴근 | 1,694 | 12 | 0.0067 | 100.0% | 0.969 |
| 노선 1650·그 외 | 4,868 | 148 | 0.0279 | 100.0% | 0.829 |
| 노선 3330·출근 | 1,732 | 0 | 0.0002 | — | — |
| 노선 3330·퇴근 | 2,501 | 0 | 0.0044 | — | — |
| 노선 3330·그 외 | 6,290 | 13 | 0.0025 | 100.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 사이의 원래 만석 확률로 바꾼다.
뒤 한국 표준시 날짜의 사건에 확률을 한 번씩 적용한다. 전체와 사전 정의 구간의 점추정을 같은 평가 규격으로 계산하고 상태·표본·기간·버전과 함께 표시한다.
이 방식의 강점
- 노선·시간대·정류장과 사전에 고정한 조합을 하나의 확률식에서 함께 다룬다.
- 계수 크기를 줄이는 L2 규제가 희소한 조합항을 함께 줄여 무규제 적합보다 우연한 극단값을 누른다.
- 사용한 범주와 조합이 고정되어 모델 버전별 입력 구조와 계수 변화를 추적하기 쉽다.
재료 한눈에
운영 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개
- 차량 정원·점유율 —
TBBMSVEHINFOM.SEAT_RDNG_PSN_CNT; 점유율 후보식1-msgBody.busLocationList[].remainSeatCnt/TBBMSVEHINFOM.SEAT_RDNG_PSN_CNT20일 코퍼스 차량키가plateNo우선 HMAC이라 외부 정원과 조인된 차량이 0/77이다. 기존 231,048행의capacity_exact도 모두 0이다. 관측 최대 잔여석은 정원의 하한일 뿐 고정 정원이 아니다. 라벨은 출발 후 좌석이 0인지에 정원이 필요 없다. 프로토타입의defaultSeatCapacity=80은 분포 배열 상한이며 점유율 분모가 아니다. - 혼잡도 — GBIS getBusLocationListv2
msgBody.busLocationList[].crowded공식 제공 노선유형은 13·15·23이고 대상 노선은 11이다. 직접 수집분에서 같은 잔여석 값에 다른 코드가 붙은 값이 26개 나와 잔여석만의 전역 함수라는 해석은 반증됐다. 다만 같은(vehId, remainSeatCnt)에서는 충돌이 0셀이고, 180초 이하 인접 관측 81,147쌍에서 잔여석과 독립으로crowded만 바뀐 경우도 0건이라 차량별 임계화일 가능성이 남는다. 산식은 미확정이고 아직 특징으로 써 보지 않았다. 상세 근거는 재료 대장에 있다. - API queryTime 파생 시간 — GBIS getBusLocationListv2
msgHeader.queryTime; HTTP 응답 헤더Date같은 노선 연속 38쌍 중 7쌍에서queryTime이 뒤로 갔다. 직접 수집 92/92건에서는 응답 수신시각보다 미래였고 중앙 +17.265초였다. HTTPDate는queryTime의 초 절삭과 92/92 일치해 독립 시계가 아니다. 감사 원문만 보존하고 나이·속도·헤드웨이·분할에 쓰지 않는다. - 목표 차량 ID와 미래 출발 후 좌석·라벨 —
msgBody.busLocationList[].remainSeatCnt; S1label_remain_seats,label_full,target_vehicle_hashtarget_vehicle_hash는 차량 암기를 막기 위해 감사키로만 둔다. 출발 후 좌석과label_full은 목표 통과 뒤 생기는 미래 정답이라 학습의 y로만 쓰고 예측 행렬에는 넣지 않는다.
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분의 만석률을 만든다. 셀 표본에 노선 만석률 한 건어치를 섞는다.
학습 행은 자기 라벨을 뺀 LOO 값만 본다. 자기 정답을 자기 입력에 넣는 누수를 막는다. 예측 때는 학습 전체로 만든 값을 쓴다. 처음 보는 셀은 노선×정류장, 노선×30분, 노선, 전체 순서로 물러난다.
Q. 상호작용은 무엇을 더하나?
실제 코퍼스 학습에서 기초 입력은 37열이다. 결측 중앙값과 결측 표시 11열을 붙이면 48열이 된다. 이를 표준화한 뒤 원래 항 48개와 두 항씩 짝지은 항 1,128개를 만든다. 합계 1,176개다.
짝은 직전 버스 만석×상류 버스 잔여석, 셀 위험×노선 평균 잔여석, 시각×배차간격처럼 생긴다. 기본요금에 옵션 요금을 붙이는 계산과 닮았다. 위치·시간이 기본요금이고, 특정 재료가 함께 나타날 때만 붙는 조정값이 상호작용이다.
1,176개 계수는 모든 행에서 같은 고정값이다. 계수들이 공통 분포에서 서로 힘을 빌리지는 않는다. 대신 L2 규제로 전부 0 쪽으로 누른다. 날짜 순방향 교차검증이 고른 세기는 C=.003이다.
Q. 점수는 어떻게 확률이 되나?
작은 식 하나면 끝난다.
βx는 원래 항, γxx는 두 재료의 상호작용이다. 계수 부호는 인과효과가 아니다. 같은 데이터 안에서 다른 입력을 고정했을 때 점수가 움직인 방향이다.
원점수는 시간순 OOF 10,236건, 만석 572건으로 학습한 isotonic 보정기를 지난다. validation 라벨은 보정기에 들어가지 않았다. 마지막 출력은 p_full이고, 사용자에게 보일 값은 보수적으로 매핑한 p_board=1-p_full이다.
Q. 연구 변형에 들어간 재료는 어디까지였나?
| 묶음 | 쓰는 값 | 맡는 일 |
|---|---|---|
| 위치·시간 | 노선, 정류장 셀 위험, 순번, 분·요일의 주기값, 방향 | 먼저 깔리는 시공간 위험 |
| 직전 통과 | 존재 여부, 만석 여부, 출발 후 잔여석, 지난 초 | 같은 정류장의 최근 상태 |
| 상류·통과 버스 | 존재, stateCd, 잔여석, 축거리, 좌석 변화율, 순번 속도 | 지금 접근하는 차량과 주변 흐름 |
| 노선 응답 | 차량 수, 좌석값이 있는 차량 수, 만석 대수, 잔여석 평균·최소·중앙값 | 한 스냅샷의 노선 전체 상태 |
| 간격·계획 | 공간 헤드웨이, 관측 헤드웨이 상·하한, 계획 배차간격 | 차량 사이 간격과 계획 운행 |
| 학습 정답 | 목표 정류장 출발 이후 잔여석 0 | 만석 라벨. 서빙 입력에는 없음 |
remainSeatCnt=-1은 0으로 바꾸지 않는다. 결측으로 둔 뒤 학습 중앙값과 결측 표시를 함께 넣는다. 좌석 변화율과 속도의 시간축은 로컬 응답 수신시각이다.
시공간 위험과 실시간 상태를 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분 |
셀 시작값부터 계산한다.
37개 입력과 상호작용을 모두 더한 로짓은 z=-.101958이었다. 따라서 원 만석확률은 sigmoid(z)=.474533이다. isotonic 보정 뒤에는 .530631이 됐다. 화면용 탈 확률은 1-.530631=.469369다.
이 버스의 정답은 출발 후 0석, label_full=1이었다. 이 한 건에서는 .5 기준의 만석 쪽에 섰다. 셀 시작값 .585526이 원점수 .474533으로 내려간 이유를 앞차 한 항의 공으로 떼어 말하지는 않는다. 1,176개 고정계수의 합이 만든 값이다.
Q. 언제 실패하나?
- 희소한 노선·정류장·시간대 조합에 항이 많으면 우연한 패턴을 배울 수 있다.
- 학습에 없던 정류장·시간대 조합이나 운행 정책 변경은 알려진 기본항만 남겨 국소 급등을 놓칠 수 있다.
- 같은 시간대 안의 연속적인 흐름과 경계 바로 전후의 완만한 변화를 표현하지 못한다.
- 실시간 좌석과 위치를 입력하지 않아 같은 범주 안에서 갑자기 바뀐 운행 상황을 놓칠 수 있다.
- 좌석 미제공이 만석 여부와 관련되면 남은 라벨 사건만으로 전체 운행을 대표하지 못할 수 있다.
- 행사·날씨·사고·정류장 순서 개편처럼 입력에 없는 변화가 생기면 학습한 관계가 유지되지 않을 수 있다.
- 만석이 드문 구간에서는 만석 누락률과 AUC가 작은 사건 수에 크게 움직인다. 만석과 비만석 중 한쪽이 없으면 PR-AUC와 ROC-AUC는 계산하지 않는다.
- 상호작용 계수는 다른 항을 함께 둔 조건부 관계다. 한 범주가 만석을 일으킨다는 인과 설명으로 쓰면 안 된다.
- 평일·주말·출근·퇴근·노선별 점추정은 각 구간의 표본만 설명한다. 만석률과 수집 품질이 다른 구간을 직접 견줘 강한 상황을 고르지 않는다.
연구 수집분에서 실측된 약점
해설 기준: M1·M2 연구 변형이다.
- 정답 자체가 개인 승차 성공은 아니다. 하차한 만큼 승차한 뒤 0석으로 출발해도 실제 승차자는 있다. 모델은 개인이 못 탄 사건이 아니라 좌석이 소진된 사건을 배운다.
p_board도 그 라벨을 뒤집은 보수적 값이다. - 얇은 셀에 맞춘 적응형 부분 풀링이 없다. 셀 prior는 노선 평균 한 건어치만 섞고, 1,176개 계수에는 같은 L2 규제를 건다. 표본 10건 이하 셀이 33.73%다. 새 셀 validation은 2건, 만석 0건뿐이라 외삽 성능은 아직 모른다.
- 고위험 구간이 낙관적이다.
p_full∈[.7,.8)177건의 평균 예측은 .7268, 실제 만석률은 .8701이다. 14.33%p 낮게 잡았다. - isotonic의 ECE는 raw .0098에서 .0065로 내려갔지만 짝지은 개선 구간
[-.0059, +.0009]가 0을 지난다. 단조 계단이 원점수 여러 개를 같은 값으로 묶어 AUC도 .9792에서 .9775로 내려갔다. - 직접 수집분 표본이 아직 얇다. 1회차 재대결의 train은 1,081건·만석 40건, validation은 443건·만석 14건이고 수집 날짜가 하루뿐이다. 이 모형의 직접분 AUC는 0.9650이지만 AUC 비교 21쌍 중 16쌍을 못 가려 승자를 정하지 않았다.
- 학습 범위는 두 노선의 평일 07:00~08:30·18:00~19:30이다. 주말, 새 노선, 새 정류장 조합, 마스터 개편 뒤 성능은 아직 없다.
- 상류 버스가 실제 바로 다음 버스라는 보장이 없다. 90초 이하 관측에서도 숨은 제3차량 하한은 3330 17.24%, 1650 12.01%였다. 잘못 고른 앞차의 잔여석과 상태가 상호작용 전체를 흔든다.
보정된 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 동결
아래 수치는 동결된 연구·평가 기록이다. 위 오늘 성적과 합치거나 변화율로 계산하지 않는다.
직접 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 결정비용 @ .50 | 0.0042[0.0000, 0.0099] |
| 2:1 결정비용 @ .33 | 0.0084[0.0000, 0.0199] |
| 4:1 결정비용 @ .20 | 0.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-f0f59cf25a9c3503 | evaluation-v2 | 2,894 | 0.0085 |
| eval-20260815-7e03dc730de91f34 | evaluation-v1 | 2,894 | 0.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 |