세 가지 회귀 예측구간과 서로 다른 위치의 수요 관측값을 비교해 표현한 일러스트

Quantile Regression vs Random Forest 예측구간: 자전거 수요의 과소예측 비용 비교

Quantile Regression vs Random Forest 예측구간을 같은 자전거 수요에 적용하자 가장 낮은 점예측 오차와 가장 믿을 만한 80% 구간이 서로 다른 모델에서 나왔다. Random Forest 트리 백분위의 중앙값 MAE는 83.69로 가장 낮았지만, q10~q90 구간에 실제값이 들어온 비율은 59.40%뿐이었다.

2026년 8월 7일 UCI Bike Sharing 시간별 데이터를 scikit-learn 1.9.0으로 통제 비교한 결과다. 이 글은 한 번의 70:30 시간 분할에서 pinball loss, 경험적 커버리지, 구간 폭과 비대칭 비용을 함께 읽는 방법을 다룬다. 특정 알고리즘의 일반적인 우열이나 현재 도시의 수요 성능을 주장하지 않는다.

20초 핵심 요약

  • 무엇: 선형 분위수 회귀, Gradient Boosting 분위수 모델, Random Forest 트리 백분위를 같은 자전거 수요 holdout에서 비교했다.
  • 왜: 과소예측은 자전거·도킹 용량 부족으로 이어질 수 있는데, MAE가 가장 낮은 RF 구간은 명목 80%보다 20.60%p 적게 실제값을 덮었다.
  • 어떻게: q10·q50·q90 pinball loss와 구간 커버리지·폭을 확인한 뒤, 과소예측 비용비에 따른 q50·q90 결정 비용을 비교한다.

평균 오차만 보면 RF, 80% 커버리지를 보면 GBR이었다

비교 결과는 하나의 우승 모델로 정리되지 않았다. Random Forest 트리 백분위는 median MAE와 세 분위수의 pinball loss가 모두 가장 낮았다. 그러나 q10~q90 구간의 경험적 커버리지는 59.40%로, 명목값 80%에 크게 못 미쳤다.

모델 median MAE pinball q10 / q50 / q90 10~90 커버리지 평균 폭 교차율
Linear QuantileRegressor 105.98 19.03 / 52.99 / 29.24 59.86% 255.07 0%
GradientBoosting quantile 113.27 22.77 / 56.64 / 27.29 79.25% 376.67 0%
RandomForest tree-percentile 83.69 15.34 / 41.84 / 21.37 59.40% 173.24 0%

Gradient Boosting 분위수 모델은 반대의 선택지를 보여준다. 커버리지는 79.25%로 명목 80%와 0.75%p 차이였지만, 평균 폭은 376.67로 RF의 173.24보다 약 2.17배 넓었다. 중앙값 MAE도 113.27로 더 컸다. 좁은 구간을 만들었다는 사실만으로 좋은 예측구간이라고 말할 수 없는 이유가 여기에 있다. 실제값을 충분히 덮지 못한 채 좁아졌다면 모델이 불확실성을 과소평가했을 수 있다.

세 모델의 median MAE, 10~90 커버리지와 평균 구간 폭 비교

이 결과에서 선택 기준은 업무 요구사항이어야 한다. 별도 구간 SLA 없이 중앙값 점예측 오차가 우선이면 RF가 출발점이다. 반대로 실제값 포함률 80%가 요구되면 RF 트리 백분위와 선형 QuantileRegressor를 그대로 80% 구간으로 제공할 수 없다. GBR도 다른 시간 구간에서 79.25%가 유지되는지, 폭 376.67을 의사결정에 사용할 수 있는지 확인한 뒤에야 후보가 된다.

q10·q50·q90은 평균 예측 세 개가 아니다

이번 실험의 q10, q50, q90은 입력 조건에서 자전거 대여 수 cnt의 조건부 10·50·90 분위수 추정치다. q50은 조건부 평균이 아니라 중앙값이다. 선형 QuantileRegressor는 각 q에 대해 pinball loss와 L1 패널티를 최소화하고, GradientBoostingRegressor(loss='quantile', alpha=q)는 같은 비대칭 손실을 비선형 트리에 적용한다.

Pinball loss는 다음과 같이 계산한다.

alpha * max(y - yhat, 0) + (1 - alpha) * max(yhat - y, 0)

q90에서는 실제값이 예측보다 큰 과소예측에 0.9, 반대 방향에 0.1의 기울기를 준다. q50 pinball loss는 MAE의 절반이다. 다만 q가 달라지면 오차 방향에 붙는 가중치도 달라지므로 q10의 손실과 q90의 손실 절대값을 직접 비교해 더 나은 분위수를 고르면 안 된다. 같은 q에서 모델끼리 비교해야 한다.

Random Forest 쪽 이름도 구분할 필요가 있다. 이 실험은 RandomForestRegressor의 300개 개별 트리 예측을 쌓아 표본별 10·50·90 백분위를 취했다. 테스트 입력이 도달한 leaf의 학습 응답값에 가중치를 부여해 조건부 분포를 추정하는 Meinshausen의 Quantile Regression Forests와는 다른 휴리스틱이다. 따라서 여기서 얻은 값은 Random Forest 트리 백분위 구간이며 정식 QRF 결과가 아니다.

시간 경계를 지킨 한 번의 holdout으로 조건을 맞췄다

UCI Bike Sharing의 hour.csv를 원래 시간 순서대로 두고 앞 70%인 12,165행을 학습, 뒤 30%인 5,214행을 테스트에 사용했다. 학습의 마지막과 테스트의 시작은 모두 2012년 5월 27일이고, 테스트는 2012년 12월 31일까지다. 같은 날짜 중간에서 경계가 갈렸다는 점은 하루 경계 분할로 다시 확인해야 할 한계다.

UCI 페이지는 데이터셋을 17,389 instances로 요약하지만, 실제 배포된 hour.csv는 이번 실행에서 17,379행이었다. 이 글의 행 수는 직접 읽은 파일을 기준으로 한다. 레이블은 총 대여 횟수 cnt이며, 합이 cnt가 되는 casualregistered는 레이블 누수를 막기 위해 제외했다. 시간 대리 ID인 instant도 입력에서 뺐다.

입력에는 날짜 ordinal, 계절, 연도, 월, 시각, 공휴일, 요일, 근무일, 날씨 상태, 기온, 체감기온, 습도, 풍속을 사용했다. 범주형 변수는 one-hot encoding, 연속형 변수는 표준화했다. 주요 환경과 파라미터는 다음과 같다.

항목 설정
실행 환경 Python 3.12.3, scikit-learn 1.9.0, NumPy 2.5.1, pandas 3.0.5, Linux 컨테이너
Linear QR alpha=.001, solver='highs'
GBR quantile n_estimators=180, learning_rate=.05, max_depth=3, min_samples_leaf=20, random_state=42
RF n_estimators=300, min_samples_leaf=5, max_features=.8, random_state=42

프로젝트 기본 환경에는 scikit-learn이 없어 첫 import가 ModuleNotFoundError로 끝났다. 이는 모델 학습 실패가 아니라 연구 의존성이 없다는 환경 실패였다. 패키지를 주제 디렉터리에 임시 설치해 같은 Python으로 실행한 뒤 제거했으며, 세 모델의 비교 실행은 종료 상태 0으로 끝났다.

PYTHONPATH=output/runs/20260806T221645Z-7a1c4d9e20/topic-eb05e689387dd58d/.deps \
python3 output/runs/20260806T221645Z-7a1c4d9e20/topic-eb05e689387dd58d/experiment.py

이 실험의 커버리지는 테스트 실제값이 [q10, q90] 안에 든 비율이다. 학습할 때 q10과 q90의 pinball loss를 최소화했다고 해서 새 데이터에서 80%가 자동으로 보장되지는 않는다. 평균 폭 역시 커버리지와 함께 읽어야 한다. 예측구간 선택은 테스트 커버리지를 유지하면서 폭을 줄이는 trade-off이기 때문이다.

과소예측 비용이 2배가 되자 상위 분위수가 q50을 앞섰다

운영 결정에는 예측 오차의 방향이 중요할 수 있다. 이번 비교에서는 과소예측 비용 c_under와 과대예측 비용 c_over를 두고 다음 손실을 별도로 계산했다.

c_under * max(y - yhat, 0) + c_over * max(yhat - y, 0)

1:1에서는 세 모델 모두 q50 결정이 q90보다 쌌다. 과소예측 비용을 과대예측의 2배로 올리자 세 모델 모두 q90의 비용이 더 낮아졌다. RF는 1:1에서 q50 83.69, q90 105.26이었지만, 2:1에서는 q50 129.45, q90 118.82로 순서가 바뀌었다.

모델 1:1 q50 / q90 2:1 q50 / q90 4:1 q50 / q90 9:1 q50 / q90
Linear QR 105.98 / 139.96 175.94 / 159.01 315.84 / 197.11 665.61 / 292.37
GBR quantile 113.27 / 175.07 204.64 / 187.30 387.36 / 211.75 844.18 / 272.88
RF tree-percentile 83.69 / 105.26 129.45 / 118.82 220.96 / 145.93 449.75 / 213.71

이 표가 q90을 항상 채택하라는 뜻은 아니다. 선형 비대칭 비용을 최소화하는 조건부 분위수는 c_under / (c_under + c_over)다. 비용비 2:1에는 약 q67, 4:1에는 q80, 9:1에는 q90이 대응한다. 이번 실험은 q50과 q90 두 후보만 평가했으므로 “2:1부터 두 후보 중 q90이 싸졌다”고만 말할 수 있다. 실제 선택 전에는 비용비에 맞춰 q67이나 q80을 직접 학습하고 같은 시간 경계에서 다시 평가해야 한다.

전체 MAE가 숨긴 실패는 피크 시간에 모였다

오전 7~9시와 오후 16~18시를 피크로 정해 중앙값 오류를 따로 보자 세 모델 모두 과소예측이 집중됐다. 이 시간 정의는 실험자가 정한 단순 규칙이지 교통 운영 표준은 아니다. 그럼에도 전체 지표 하나로 용량 부족 위험을 판단하기 어렵다는 점은 분명하게 드러났다.

모델 전체 과소예측률 피크 과소예측률 피크 MAE
Linear QR 49.21% 73.26% 188.44
GBR quantile 57.56% 80.69% 218.01
RF tree-percentile 57.38% 69.89% 120.17

RF는 이 오류 분석에서도 피크 MAE가 가장 낮았지만, 피크 예측의 약 69.89%가 실제 수요보다 낮았다. 자전거 또는 도킹 용량 부족의 비용이 큰 운영이라면 전체 median MAE뿐 아니라 시간대별 과소예측률과 비용 가중 손실을 함께 봐야 한다.

랜덤 분할은 세 모델을 모두 실제보다 좋아 보이게 했다

같은 데이터를 train_test_split(test_size=.3, random_state=42)로 무작위 분할한 결과는 의도적인 실패 대조군이다. 코드 실행은 성공했지만, 2011~2012년의 미래 관측이 학습에 섞여 예측 시점의 정보 경계를 위반했다.

평가 설계 Linear QR MAE / 커버리지 GBR quantile MAE / 커버리지 RF tree-percentile MAE / 커버리지
시간 순서 70:30 105.98 / 59.86% 113.27 / 79.25% 83.69 / 59.40%
랜덤 70:30 실패 대조 71.18 / 80.53% 68.19 / 80.28% 31.45 / 75.12%

특히 RF의 MAE는 83.69에서 31.45로 62.4% 낮아졌다. 모델이 개선된 결과가 아니다. 시간 순서 데이터에서 일반 교차검증은 미래로 학습하고 과거를 평가할 수 있다는 scikit-learn의 경고와 같은 방향의 실패다. 랜덤 분할 수치를 미래 수요 성능으로 채택하면 모델뿐 아니라 예측구간의 보정 상태까지 낙관적으로 읽게 된다.

분위수 교차가 0%여도 보정을 보장하지 않는다

시간 분할에서는 세 모델 모두 q10 <= q50 <= q90 위반률이 0%였다. 그러나 독립적으로 학습한 선형 QR과 GBR 분위수 곡선에는 순서 제약이 없으므로 다른 데이터에서 교차할 수 있다. 실제로 랜덤 분할 실패 대조에서는 Linear QR의 1.76%, GBR의 6.10%에서 순서가 깨졌다.

RF의 동일 표본별 트리 백분위는 백분위 계산의 정의상 정렬된다. 그렇다고 구간이 보정됐다는 뜻은 아니다. 시간 분할에서 교차율 0%였던 RF의 커버리지가 59.40%였다는 결과가 둘의 차이를 보여준다. 배포 전에는 전체 교차율만 보지 말고 시간대와 수요 구간별 교차율을 확인하고, 공동 제약이나 후처리를 적용했다면 커버리지와 폭을 다시 측정해야 한다.

모델 이름보다 비용, 커버리지, 폭의 순서로 결정한다

이 holdout에서 중앙값 점예측이 목적이면 RF가 합리적인 출발점이다. 다만 트리 백분위를 보정된 80% 예측구간으로 내보내면 안 된다. 80% 포함률이 요구된다면 GBR 분위수 모델이 가장 가까웠지만, 평균 폭 376.67을 감수할 수 있는지와 여러 시간 fold에서도 커버리지가 유지되는지가 채택 조건이다.

결론을 바꿀 미검증 범위도 크다. 실험은 한 데이터셋, 한 holdout, 한 seed와 제한된 수동 파라미터만 다뤘다. rolling 또는 walk-forward 다중 fold, gap, 하이퍼파라미터 튜닝, conformal calibration, q67·q80 학습은 하지 않았다. 2011~2012년 데이터는 현재 수요를 대표하지 않으며, 예측 시점에 날씨 실측 입력을 정말 사용할 수 있는지도 검증하지 않았다.

다음 행동은 모델을 더 많이 추가하는 것이 아니라 비용표를 먼저 정하는 일이다. 과소예측과 과대예측의 실제 비용비에서 목표 분위수를 정하고, walk-forward 검증으로 시간 구간별 커버리지·폭·피크 비용을 다시 측정해야 한다.

참고 링크

비슷한 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다