단원 홈

Ⅲ. 데이터 모델링과 평가12차시

성적표가 여러 장이면
어느 것을 믿어야 할까

자와 시험지가 등수를 바꾼다

따릉이 하루 대여를 맞히는 모델 셋에 자 넷을 대고, 자료를 두 가지로 나눠 채점했습니다. 성적표 여덟 장이 한 모델을 가리키지 않는다면, 모델을 평가한다는 것은 재기 전에 무엇을 정하는 일일까요?

  • [12데과03-05]
  • 50분네 정거장
  • 새 도구sklearn.metrics
  • 자료서울 따릉이 하루 단위 · 운영한 353일
Ⅲ 단원 지도12 / 14차시
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14

학습 목표

  1. 개념에서

    MAE · RMSE · R² · 예측률이 각각 무엇을 묻는지 말하고, 목적에 맞는 자를 고를 수 있다.

  2. 손으로

    같은 모델을 두 가지로 나눠 채점하고, 성적이 달라진 까닭을 자료의 성질로 설명할 수 있다.

  3. 확인에서

    보고할 숫자 하나를 고르고 자와 나누는 법을 함께 적을 수 있다.

1
여는 장면 · 5분

같은 모델, 같은 자료 — 그런데 성적표가 두 장

따릉이 운영팀 회의에 보고서가 두 장 올라왔습니다. 두 장 모두 같은 353일 자료를 쓰고 같은 모델을 채점했습니다. 기온을 3°C 폭으로 자르고 쉬는날인지 아닌지로 갈라, 칸마다 훈련 기간의 평균 대여 수를 답으로 내놓는 모델 — 이 책은 이것을 구간 평균 모델이라고 부릅니다. 5차시에서 결정 트리가 스스로 찾던 계단을, 이번에는 우리가 자를 자리를 정해 세운 것입니다.

다른 것은 자료를 훈련과 시험으로 나눈 방법 하나뿐입니다. ㉮는 353일을 잘 섞은 뒤 80 대 20으로, ㉯는 섞지 않고 앞 75%는 훈련 · 뒤 25%는 시험으로 갈랐습니다. 그런데 결론이 정반대로 나왔습니다.

둘 중 누가 계산을 틀렸을까요? — 아무도 틀리지 않았습니다. 두 사람은 같은 함수를 같은 자료에 부르고 나온 숫자를 그대로 옮겨 적었을 뿐입니다.

운영팀 회의 · 가상 안건

안건 3. 구간 평균 모델을 내년 재배치 계획에 쓸 것인가 — 첨부 보고서 ㉮ · ㉯

이 안건지는 수업을 위해 지어낸 것입니다 · 첨부된 숫자는 실제 자료로 계산한 값입니다
표 1같은 모델의 두 성적표구간 평균 모델 · 따릉이 353일
보고서나눈 방법MAERMSER²예측률한 줄 결론
㉮무작위 80/204,4026,2370.64447.9%“흩어짐의 64%를 설명한다 — 쓸 만하다”
㉯시간 순서 75/257,2408,433−0.52232.6%“시험 기간의 평균만도 못하다 — 쓰면 안 된다”

두 줄의 차이는 모델도 자료도 아니고 나눈 방법 하나입니다. R²는 0.644에서 음수로 내려앉았습니다 — R²가 음수가 될 수 있다는 것부터 오늘 볼 일입니다. 자료: UCI Seoul Bike Sharing Demand를 하루 단위로 묶은 353일 — 3정거장 코드 ①·②가 찍는 값과 같다

먼저 예측

여러분이 이 회의에 앉아 있다면 어느 보고서를 안건에 올리겠습니까? ㉮ · ㉯ 가운데 하나를 고르고, 그렇게 고른 까닭을 한 문장으로 적어 두세요. 3정거장 미션 ②에서 두 성적표를 직접 찍어 보고, 4정거장 확인 문제 3에서 이 문장을 다시 꺼냅니다.

체크포인트 1

같은 모델·같은 자료라도 나눈 방법만으로 결론이 뒤집힐 수 있다는 것을 보았다. 아직 어느 쪽이 정직한지는 모른다.

다음 정거장 · 개념 15분 →
2
개념 · 15분

재기 전에 정하는 두 가지 — 자와 시험지

2-1자마다 묻는 것이 다르다

모델을 채점하려면 먼저 자를 골라야 합니다. 자는 그냥 숫자를 내놓는 기계가 아니라 어떤 틀림을 무겁게 칠지에 대한 약속입니다. 하루 대여를 2,000대 틀린 날이 열흘 있는 모델과 20,000대 틀린 날이 하루 있는 모델 중 어느 쪽이 더 나쁜가요? — 자가 그 답을 미리 정해 둡니다.

오늘 쓰는 자는 넷입니다. 앞의 셋은 sklearn.metrics 에 함수로 들어 있어 한 줄이면 부를 수 있지만, 넷째 예측률은 도구에 없습니다. '오차가 실제의 ±20% 안에 들면 현장에서 대응할 수 있다'는 기준은 따릉이 운영팀의 사정이지 통계학의 정의가 아니기 때문입니다. 없는 자는 직접 만들어 씁니다.

표 2자 넷이 각각 묻는 것
자묻는 것크게 틀린 날을도구에이럴 때 고른다
MAE 평균 몇 대 빗나가나다른 날과 똑같이 센다mean_absolute_error한 달 운영 예산처럼 합쳐서 쓰는 숫자
RMSE 제곱해서 잰 빗나감제곱해 무겁게 벌한다mean_squared_error ** 0.5재배치 트럭처럼 한 번 크게 틀리면 큰일인 일
R² 평균만 쓰는 것보다 흩어짐을 얼마나 줄였나제곱이라 크게 틀린 날이 좌우한다r2_score설명 보고서 — 0~1로 읽히는 비율이 필요할 때
예측률 오차가 실제의 ±20% 안에 든 날의 비율안이냐 밖이냐만 센다 — 얼마나 크게 틀렸는지는 안 본다없다 — 직접 만든다현장 기준이 '±20%면 대응 가능'처럼 정해져 있을 때

네 자는 서로 바꿔 쓸 수 있는 말이 아닙니다. 다른 질문이고, 다른 답이 나오는 것이 당연합니다. 자료: 함수 이름은 scikit-learn 1.4.2(브라우저 판) · 예측률의 정의는 이 차시가 목적에 맞춰 정한 것이다

2-2목적이 자를 고른다

무작위 80/20으로 나눈 같은 71일 시험지에서, 통계적 회귀와 구간 평균의 성적을 자마다 나란히 놓아 봅니다. 자를 바꿀 때마다 앞서는 쪽이 달라지는지를 보세요.

MAE — 평균 몇 대 빗나가나
4,412통계적 회귀
vs
4,402구간 평균
4,412통계적 회귀4,402구간 평균

10대 차이 — 사실상 동점이라 여기서 등수를 가르면 안 된다.

RMSE — 크게 틀린 날을 무겁게
6,237구간 평균
vs
5,324통계적 회귀
6,237구간 평균5,324통계적 회귀

제곱하는 순간 1등이 바뀐다 — 구간 평균은 몇 날을 크게 틀린다.

예측률 — ±20% 안에 든 날
35.2%통계적 회귀
vs
47.9%구간 평균
35.2%통계적 회귀47.9%구간 평균

안팎만 세면 다시 구간 평균 — 대부분의 날을 가깝게 맞힌다.

구간 평균 · R² — 나누는 법만 바꾸면
0.644무작위 80/20
→
−0.522시간 순서 75/25
0.644−0.5220

자를 바꾼 것보다 더 크게 움직였다 — 나누는 법의 힘.

자료: 따릉이 353일 — 위 네 쌍의 숫자는 모두 3정거장 코드 ① · ②가 찍는 값이다.

평가를 정하는 나침반 — 재기 전에 네 물음

  1. 자어떤 틀림을 무겁게 칠까 — MAE · RMSE · R² · 예측률
  2. 시험지어떻게 나눌까 — 시험지가 모델이 쓰일 자리를 닮았나
  3. 쓰임이 숫자로 누가 무슨 결정을 하나
  4. 함께 적기숫자 옆에 자와 나누는 법을 적었나

이 넷은 계산하기 전에 정하는 것입니다. 계산이 끝난 뒤에 자를 고르면, 자기 모델이 이기는 자를 고르게 됩니다 — 그러면 성적표는 모델을 잰 것이 아니라 고른 사람을 잰 것이 됩니다.

2-3나누는 법이 성적을 바꾼다

시험지를 만드는 가장 흔한 한 줄은 train_test_split(df, test_size=0.2) 입니다. 이 함수의 기본값은 섞어서 나누기(shuffle=True)예요. 학생 1,000명의 키를 다루는 자료라면 섞는 것이 맞습니다 — 사람마다 사례가 따로니까요.

그런데 날씨와 대여는 다릅니다. 어제와 오늘이 이어져 있어요. 어제가 22°C에 맑았고 8,000대가 나갔다면 오늘도 그 근처일 가능성이 큽니다. 그래서 섞어 나누면 시험 날의 어제·내일이 훈련에 들어갑니다. 모델은 시험 날을 처음 보는 것이 아니라 그 바로 옆날을 이미 배운 셈이 되지요.

모델이 실제로 하게 될 일은 과거로 배워 내일을 맞히는 것입니다. 그렇다면 시험지도 그 모양이어야 합니다 — 앞은 훈련, 뒤는 시험. shuffle=False 한 마디가 그 일을 합니다. 그래서 표 1의 두 보고서 중 ㉯가 정직한 쪽이에요. ㉮가 계산을 틀린 것이 아니라, ㉮의 시험지가 모델이 쓰일 자리를 닮지 않았을 뿐입니다.

규칙성적을 적을 때는 숫자 옆에 무엇으로 쟀는지(자)와 어떻게 나눴는지(시험지)를 함께 적는다.

그림 1같은 353일, 두 가지 시험지주황이 시험 날 · 아래 숫자는 구간 평균 모델의 R²
2017-12-01 → 2018-11-30 · 운영한 353일무작위 80/20R² 0.644train_test_split(…, random_state=42)시험 71일이 한 해에 흩어진다 — 시험 날의 어제·내일이 훈련에 들어간다 2017-12-01 → 2018-11-30 · 운영한 353일시간 순서 75/25R² −0.522train_test_split(…, shuffle=False)2018-08-24 에서 자른다 ↓뒤 89일이 통째로 시험 — 경계의 하루만 이웃이 훈련에 있다 2017-12-01 → 2018-11-30 · 운영한 353일무작위 80/20R² 0.644train_test_split(…, random_state=42)시험 71일이 한 해에 흩어진다시험 날의 어제·내일이 훈련에 들어간다 2017-12-01 → 2018-11-30 · 운영한 353일시간 순서 75/25R² −0.522train_test_split(…, shuffle=False)2018-08-24 에서 자른다 ↓뒤 89일이 통째로 시험경계의 하루만 이웃이 훈련에 있다

청록이 훈련, 주황이 시험입니다. 왼쪽 띠에서 주황 칸은 한 해 전체에 골고루 흩어져 있습니다 — 시험 날 하나하나가 훈련 날 사이에 끼어 있다는 뜻이에요. 오른쪽 띠는 경계가 하나뿐이고, 그 오른쪽은 모델이 한 번도 본 적 없는 계절입니다. 자료: 따릉이 353일 · R²는 3정거장 코드 ① · ②의 출력값

Ⅲ-5 에서 가져옴훈련으로 배우고 시험으로 채점한다는 틀은 5차시에서 세웠습니다. 오늘은 그 틀을 그대로 두고 나누는 손과 채점하는 자를 들여다봅니다.

2-4실험실 — 벌점 철사와 봉인된 가을

두 가지를 손으로 겪어 봅니다. 1막에서는 철사 팔을 들어 올려 '어떤 틀림을 무겁게 칠지'를 조금씩 바꾸고, 왕관이 어느 모델에게 가는지를 봅니다. 2막에서는 과거 264일에서 시험 구슬을 골라 시험지를 짓고, 그 시험지가 예보한 성적을 잠근 뒤에 자물쇠 걸린 가을 89일을 엽니다.

시뮬레이터

봉인된 가을

어떤 틀림을 무겁게 칠까 — 그리고 내 시험지는 가을을 예보할 수 있나

  1. 11막 — 철사 팔을 들어 벌점의 모양을 바꾼다
  2. 22막 — 과거 264일에서 시험 구슬 66개를 골라 시험지를 짓는다
  3. 3예보를 잠근 뒤에만 자물쇠 걸린 가을 89일이 열린다
막
도장 — 어떤 자로 잴까
철사 팔
벌점 = |오차| 의 1.00 제곱
벽돌 고르기
1막 · 벌점 철사무작위 80/20 시험 71일

왕관—
평균 모델—
통계적 회귀—
구간 평균—
철사 팔—
비 10mm 넘는 날—
도전 1

V 도장에서는 구간 평균이 10대 차이로 이긴다. 철사 팔을 조금씩 들어 왕관이 통계적 회귀로 넘어가는 자리를 찾고, [비 10mm 넘는 날] 을 켜 그 까닭을 보아라.

도전 2

기본값 시험지(섞어서 고른 66개) 그대로 예보 카드를 골라 잠그고 가을을 열어라. 시험지가 약속한 R²와 가을의 R²는 얼마나 다른가?

도전 3

자석으로 시험 구슬을 모아 별 둘 이상(가을과 순위가 같은 예보)을 받는 시험지를 지어라. 별 셋(크기까지)은 받을 수 있는가?

자료: 따릉이 353일(운영한 날) — 쪽 안에 실은 날짜별 기온 · 강수 · 쉬는날 · 대여 수와 train_test_split 이 씨앗마다 고른 시험 날 목록이다. 판은 그 자료로 모델 셋을 그 자리에서 다시 학습해 채점한다 — 그래서 판의 숫자가 3정거장 코드 ① · ② · ④의 출력과 한 자리까지 같다.

체크포인트 2

자가 바뀌면 등수가, 시험지가 바뀌면 성적의 크기가 바뀐다는 것을 손으로 확인했다. 이제 같은 일을 코드로 재현한다.

다음 정거장 · 손으로 20분 →
3
손으로 · 20분

성적표 여덟 장을 직접 찍는다

오늘의 장비

sklearn.metrics — 자가 함수로 들어 있다

5차시까지는 모델을 만드는 도구만 썼습니다. 오늘은 채점하는 도구를 꺼냅니다. 처음 실행은 몇 초 멈춰요 — 고장이 아니라 scikit-learn을 처음 받는 중입니다(쪽마다 한 번).

부르는 모양

from sklearn.metrics import r2_score
from sklearn.model_selection import (
    train_test_split)

훈, 시 = train_test_split(df,
    test_size=0.25, shuffle=False)
print(r2_score(실제, 예측))

오늘 쓰는 함수 넷

mean_absolute_error
MAE — 오차의 절댓값 평균
mean_squared_error
제곱 평균. ** 0.5 를 붙이면 RMSE
r2_score
R² — 3차시에서 손으로 쓴 식과 같은 값
train_test_split
random_state(씨앗) · shuffle(섞을까) 두 손잡이

앞 차시와 다른 셋

  1. 자가 한 줄식을 손으로 쓰지 않고 함수로 부른다
  2. 없는 자는 내가예측률은 도구에 없다 — np.mean 한 줄로 만든다
  3. 기본값이 곧 가정shuffle 의 기본값은 True — 안 적으면 섞인다

대가 — 한 줄로 부를 수 있다는 것은 그 자가 무엇을 묻는지 화면에 안 보인다는 뜻입니다. 이름만 보고 고르면 목적과 어긋납니다.

1

도구에 없는 자를 만들고, 성적표 넉 장을 읽는다

9분

코드 ①은 353일을 무작위로 섞어 80 대 20으로 나누고, 모델 셋을 자 넷으로 채점합니다. 네 자가 모두 같은 모델을 1등으로 뽑을까요? 실행하기 전에 머릿속으로 한 번 정해 두세요.

기본 자() 함수 안 빈칸 ①에 예측률 한 줄을 채우고 ▶ 실행합니다. 위의 MAE · RMSE · R² 세 줄은 scikit-learn 함수를 그대로 부른 것이고, 예측률만 도구에 없어 직접 만들어야 해요 — 실제와 예측의 차이가 허용 * 실제 이하인 날의 비율을 np.mean 으로 셉니다. (막히면 🔑 정답 코드 단추를 누르고, 그 한 줄이 무엇을 세는지 읽어 보세요.)

도전 마지막 줄 주석대로 자(실제, 모델(훈, 시)) 를 자(실제, 모델(훈, 시), 허용=0.10) 으로 바꿔 보세요. 잣대를 ±20%에서 ±10%로 좁히면 세 모델의 예측률이 모두 내려가는데, 1등은 그대로일까요? 확인 문제 6이 이 잣대의 약점을 묻습니다.

구간 평균 모델은 로 재면 1등이고 로 재면 2등이다. 이런 일이 생기는 것은 이 모델의 오차가 모양이기 때문이다.

확인 문제 1에 적어 제출 →
2

같은 모델, 다른 시험지 — 시간 순서로 나눈다

4분

여는 장면에서 ㉮ · ㉯ 가운데 하나를 골랐습니다. 그 한 문장이 아래에 있습니다. 같은 모델의 R²가 무작위 때보다 얼마나 떨어질지 숫자로 한 번 짐작해 보고 실행하세요.

기본 코드 ②는 채워져 있습니다. 달라진 곳은 딱 한 마디 — shuffle=False 입니다. 그대로 ▶ 실행해 코드 ①의 표와 줄마다 맞대어 보세요. 맨 아랫줄에서는 3차시에 손으로 쓴 R² 식과 r2_score 가 같은 값을 내는지도 확인합니다.

탐구 시간 순서 시험은 성적표가 한 장뿐입니다 — 하필 그 가을이 이상한 철이었다면요? 창을 앞에서부터 다섯 번 굴려 보는 방법(TimeSeriesSplit(5))을 쓰면 평균 MAE가 회귀 6,020 · 구간 평균 7,452 · 평균 모델 10,077 로, 한 장짜리 가을 성적(5,622 · 7,240 · 7,451)과 순위는 같은데 크기가 달라집니다. 성적표를 몇 장 받아야 믿을 만할까요? 그리고 굴리는 창에서는 왜 '섞기'를 쓰면 안 될까요?

탐구한 것을 확인 문제 4에 적어 제출 →

무작위 나누기가 후했던 까닭은 때문이다. 그래서 이 자료에서 정직한 시험지는 쪽이고, 보고할 숫자는 이다.

확인 문제 2에 적어 제출 →
3

달마다 어느 쪽으로 틀렸나

3분

시간 순서 시험의 89일을 달로 묶어 평균 오차(실제 − 예측)를 봅니다. 가을 오차는 +(모자라게 예측)일까요, −(넘치게 예측)일까요? 부호 하나를 먼저 정해 두세요.

기본 코드 ③은 채워져 있습니다. 그대로 ▶ 실행해 표와 막대를 함께 읽으세요. 막대 아래에 그 달의 날 수가 적혀 있는 것에 눈여겨보세요 — 날이 적은 달의 평균은 흔들립니다. (이 칸은 matplotlib을 처음 받으므로 몇 초 더 걸립니다.)

도전 ax.margins(y=0.12) 줄을 지우고 다시 실행해 보세요. 가장 큰 10월 막대가 위 테두리에 닿습니다 — 값이 적혀 있지 않은 막대 그림은 여백을 그리는 사람이 챙겨야 합니다. 그 한 줄이 8000 눈금을 만들어 막대가 어디까지 올라갔는지 읽히게 합니다.

가을 오차가 한쪽으로 쏠렸다는 것은 모델이 를 놓치고 있다는 뜻이다. 고치려면 를 해 볼 수 있다.

확인 문제 5에 적어 제출 →
4

의뢰 셋에 자와 나누는 법을 배정한다

4분

“한 번 재서 못 미더우면 여러 번 재면 되지 않나?” — 그럴듯한 말입니다. 과거 264일 안에서 섞어서 스무 번 재면 가을 성적을 맞힐 수 있을까요? 2-4 실험실에서 자석을 당기기 전에 본 그 장면을 코드로 확인합니다.

도전 코드 ④는 채워져 있습니다. 그대로 ▶ 실행해 스무 장이 예보한 범위와 가을의 실제를 맞대어 보세요. 아래 두 줄은 그 까닭입니다 — 씨앗 42의 시험지에서 시험 날의 어제나 내일이 훈련에 들어 있는 날이 몇 일인지 셉니다.

본 과제 아래 세 의뢰가 같은 날 들어왔습니다. 의뢰마다 자와 나누는 법을 정하고, 그 조합에서 이긴 모델을 근거와 함께 확인 문제 3의 표에 적으세요. 코드 ①과 ②의 출력이 근거 자료입니다.

표 3의뢰서 세 장같은 자료 · 다른 결정
의뢰이 숫자로 하는 일틀리면 생기는 일
재배치 트럭내일 아침 어느 대여소에 몇 대를 옮길지 정한다한 번 크게 빗나간 날 대여소가 통째로 빈다
한 달 운영 예산정비 인력과 소모품 비용을 한 달 단위로 잡는다날마다의 빗나감이 합쳐져서 예산이 어긋난다
시의회 보고서“날씨로 대여량을 얼마나 설명할 수 있는가”를 한 줄로 쓴다숫자가 혼자 걸어 나가 다른 결정의 근거가 된다

세 의뢰는 같은 353일에서 나오지만, 다른 자와 다른 시험지를 부릅니다. 이 의뢰서는 수업을 위해 지어낸 것입니다 — 고를 때 쓰는 숫자는 코드 ① · ②의 출력값이다

여러 번 재도 믿을 수 없었던 까닭은 스무 장이 모두 이기 때문이다. 흔들림이 작다는 것과 는 다른 말이다.

확인 문제 3의 표에 의뢰 셋을 적어 제출 →
체크포인트 3

성적표 여덟 장을 직접 찍었고, 달마다 오차가 한쪽으로 쏠리는 것을 보았고, 여러 번 재는 것으로는 이 문제가 풀리지 않는다는 것을 확인했다.

다음 정거장 · 정리·확인 10분 →
4
정리·확인 · 10분

오늘의 탐험 일지

  1. 찾은 것

    같은 시험지에서도 자를 바꾸면 1등이 바뀐다 — MAE·예측률은 구간 평균, RMSE·R²는 통계적 회귀.

  2. 도구의 한계

    train_test_split 의 기본값은 섞기다. 시간으로 이어진 자료에서는 그 한 마디가 미래를 훈련에 넣는다.

  3. 보고의 규칙

    숫자 하나만 적지 않는다 — 자와 나누는 법을 옆에 함께 적는다. 그래야 다음 사람이 같은 성적표를 다시 만들 수 있다.

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. 어느 모델이 RMSE로는 2등, MAE로는 1등이었다. 모델의 오차가 어떤 모양일 때 이런 일이 생기는지 쓰시오.
📖 모범 답안

대부분의 날은 작게 틀리지만 몇 날은 아주 크게 틀리는 모델이다.

MAE는 오차를 그대로 평균 내므로 '대부분 가깝다'가 그대로 점수가 되어 유리하다. RMSE는 오차를 제곱해서 평균 내므로, 크게 틀린 몇 날이 제곱되며 무겁게 벌해져 불리하다. 우리 자료에서는 구간 평균 모델이 그랬다 — MAE 4,402대로 1등(통계적 회귀 4,412대)인데 RMSE는 6,237대로 2등(통계적 회귀 5,324대)이었다. 예측률 47.9%(회귀 35.2%)도 '대부분 가깝다'를 확인해 준다.

2. 시간 순서로 나눈 시험에서 평균 모델의 R²가 −0.674, 구간 평균 모델의 R²가 −0.522로 나왔다. 음수 R²가 무슨 뜻인지 쓰고, 훈련 기간의 평균을 답으로 내놓는 모델이 왜 음수가 될 수 있는지 설명하시오.
📖 모범 답안

시험 기간의 실제 평균으로 맞추는 것보다도 더 흩어졌다는 뜻이다. R²는 '시험 기간의 평균만 써서 생긴 빗나감'을 1로 놓고 모델이 그 가운데 얼마를 줄였는지 보는 자이므로, 모델이 평균선보다 더 빗나가면 1을 넘어 음수가 된다. R²는 0~1로만 나오는 값이 아니다.

평균 모델이 답으로 내놓는 것은 훈련 기간(겨울·봄·여름 264일)의 평균이다. 시험 기간은 가을이어서 수준 자체가 다르다. 훈련 기간의 평균을 그대로 들고 가면 시험 기간의 평균과 어긋나 있으므로, 시험 기간의 평균선보다 더 빗나간다. 같은 까닭으로 구간 평균 모델도 무작위 나누기에서는 0.644였다가 시간 순서에서 −0.522가 되었다.

3. 같은 구간 평균 모델의 예측률이 무작위 나누기에서 71%, 시간 순서 나누기에서 53%였다고 하자(가령). 따릉이 운영팀에 보고할 숫자와 그 이유를 쓰고, 여는 장면에서 고른 ㉮ · ㉯ 와 견주어 한 줄 덧붙이시오. 그리고 미션 ④의 의뢰 셋에 대해 아래 표를 채우시오.
의뢰고른 자고른 나누는 법그 조합에서 이긴 모델
재배치 트럭
한 달 운영 예산
시의회 보고서
📖 모범 답안

시간 순서의 53%를 보고한다. 이 모델이 실제로 할 일은 과거로 배워 내일을 맞히는 것이므로, 그 상황을 흉내 낸 평가가 정직하다. 무작위 나누기는 시험 날의 어제·내일이 훈련에 들어가 성적이 부풀 수 있다. 여는 장면의 ㉮ · ㉯ 가운데 ㉯가 정직한 쪽이다 — ㉮가 계산을 틀린 것이 아니라, ㉮의 시험지가 모델이 쓰일 자리를 닮지 않았을 뿐이다. 두 숫자를 함께 적고 어느 쪽이 왜 정직한지 밝히면 더 좋다.

표 — 재배치 트럭: RMSE · 시간 순서 · 통계적 회귀(RMSE 6,323 대 구간 평균 8,433). 한 번 크게 빗나가면 대여소가 비므로 큰 오차를 무겁게 벌하는 자가 맞다.
한 달 운영 예산: MAE · 시간 순서 · 통계적 회귀(MAE 5,622 대 구간 평균 7,240). 날마다의 빗나감이 합쳐지므로 평균적인 빗나감을 그대로 재는 자가 맞다.
시의회 보고서: R² · 시간 순서 · 통계적 회귀(R² 0.145 대 구간 평균 −0.522). 다만 0.145는 '날씨로 설명되는 몫이 작다'는 뜻이므로, 그 사실까지 함께 적어야 한다.

세 의뢰의 자는 모두 다른데 나누는 법은 셋 다 시간 순서이고, 그래서 이긴 모델도 셋 다 같아졌다. 이 자료에서는 나누는 법이 자보다 등수를 더 크게 흔든다. 무작위로 나눴다면 트럭은 통계적 회귀(RMSE 5,324), 예산은 구간 평균(MAE 4,402)으로 갈렸을 것이다.

4. 친구가 따릉이 자료를 train_test_split(df, test_size=0.2) 로 기본값 그대로 나눠 '시험 R² 0.78'을 보고했다. 무엇을 먼저 물어보겠는지, 어떻게 고치겠는지 쓰시오. 그리고 미션 ②의 탐구 — 성적표를 몇 장 받아야 믿을 만한가, 굴리는 창에서는 왜 '섞기'를 쓰면 안 되는가 — 를 이어서 쓰시오.
📖 모범 답안

“섞어서 나눴니?”를 먼저 묻는다 — shuffle 의 기본값이 True 라 적지 않으면 섞인다. 섞으면 시험 날의 어제·내일이 훈련에 들어가 성적이 부풀 수 있다. 실제 쓰임(과거로 배워 내일을 맞힘)에 맞게 shuffle=False(또는 날짜로 경계를 잡아) 다시 나눠 재고, 두 성적을 함께 적는다. 도구의 기본값도 분석의 선택이다.

몇 장 받아야 하나 — 한 장은 모자란다. 시간 순서로 한 번 나누면 성적표가 딱 한 장이고, 하필 그 철이 이상했다면 알 길이 없다. 창을 다섯 번 굴리면(TimeSeriesSplit(5)) 평균 MAE가 회귀 6,020 · 구간 평균 7,452 · 평균 모델 10,077로, 한 장짜리 가을 성적(5,622 · 7,240 · 7,451)과 순위는 같은데 크기가 달라진다. 순위가 여러 장에서 버티면 그 순위는 믿을 만하고, 크기는 장마다 다르므로 범위로 적는 편이 정직하다.

왜 섞으면 안 되나 — 굴리는 창의 약속이 '훈련은 늘 시험보다 앞'이기 때문이다. 섞어 버리면 창 안에 미래 날이 들어와, 여러 장을 받는 수고를 하고도 한 장짜리 무작위 나누기와 같은 후한 성적이 된다.

5. 시간 순서 시험에서 9 · 10 · 11월 평균 오차(실제 − 예측)가 모두 +2,000대 안팎이었다고 하자. 무엇을 뜻하는지 쓰고, 모델을 어떻게 고치겠는지 쓰시오.
📖 모범 답안

오차가 실제 − 예측이므로 +는 실제가 더 많았다, 곧 모자라게 예측했다는 뜻이다. 세 달이 모두 같은 쪽이면 우연이 아니라 한쪽으로 쏠린 잘못이다 — 날씨로 설명되지 않는 증가(이용자 증가, 대여소 증가 같은 추세)를 모델이 모르고 있다. 우리 자료에서도 9월 +3,344 · 10월 +7,038 · 11월 +3,941대로 세 달이 모두 +였다.

고치는 길은 둘이다. ① 날짜(추세)나 최근 몇 주 평균 같은 변수를 넣어 모델이 그 증가를 배우게 한다. ② 최근 자료로 자주 다시 학습한다. 어느 쪽이든 고친 뒤에는 같은 시험지로 다시 채점해 달별 오차가 0선 양쪽에 고르게 흩어지는지 확인한다.

다만 8월은 8일뿐이다(−1,756대). 날이 적은 달의 평균은 한두 날에 끌리므로 그 달만 보고 방향을 말하지 않는다.

6. 예측률을 ±20%로 정했더니 겨울 날(대여 1,500대)과 가을 날(대여 25,000대)의 허용 폭이 크게 달라졌다. 이 자의 약점과 보완책을 쓰시오.
📖 모범 답안

허용 폭이 그날의 크기에 비례한다는 것이 약점이다. 1,500대인 날은 ±300대만 벗어나도 불합격이고, 25,000대인 날은 ±5,000대를 틀려도 합격이다 — 계절마다 기준이 달라진다. 그래서 예측률이 높다고 해서 '어느 날이든 쓸 만하다'는 뜻이 되지 않는다.

보완책은 둘이다. ① '±2,000대' 같은 절대 기준을 함께 보고한다 — 현장에서 트럭 한 대가 옮길 수 있는 양처럼 일의 단위로 폭을 정하면 계절에 흔들리지 않는다. ② 계절(또는 대여량 구간)별로 나눠 예측률을 따로 적는다. 잣대를 ±20%에서 ±10%로 좁혀 보는 것도 이 자가 얼마나 느슨했는지 재는 한 방법이다(미션 ①의 도전).

+
더 알아보기

자를 다시 만드는 이야기 셋

가로 = 예측이 빗나간 방향 · 세로 = 그래서 치르는 값가장 싼 예측이이쪽으로 옮겨 간다← 모자라게 예측대여소가 빈다 · 손님을 잃는다넘치게 예측 →트럭이 한 번 더 돈다0점선 — 평균 오차(MAE)가 재는 대칭 V. 양쪽 기울기가 같다청록 선 — 비대칭 손실. 왼쪽 팔이 오른쪽의 3배로 가파르다※ 3배는 값의 차이를 보이려고 그린 예시다
방법 더 깊이

틀리는 방향에 따라 값이 다르다면

오늘 쓴 자 넷은 모두 틀린 크기만 봅니다. 모자라게 틀렸든 넘치게 틀렸든 2,000대는 2,000대예요. 그런데 재배치 트럭에게는 두 방향의 값이 전혀 다릅니다. 모자라게 예측하면 대여소가 비어 손님을 잃고, 넘치게 예측하면 트럭이 한 번 더 도는 기름값이 듭니다. 앞쪽이 훨씬 비싸다면, 같은 크기로 틀려도 한쪽을 더 무겁게 벌하는 것이 맞습니다.

이렇게 방향마다 기울기를 다르게 준 자를 비대칭 손실이라고 부릅니다. 도해의 청록 선처럼 왼쪽 팔을 가파르게 만들면, 재미있는 일이 생깁니다 — 가장 싼 예측이 0에서 옮겨 갑니다. 대칭인 V(평균 오차)에서는 '딱 맞히는 것'이 가장 쌌지만, 왼쪽이 비싸지면 조금 넉넉하게 예측하는 쪽이 평균적으로 더 쌉니다. 모델이 일부러 조금씩 많게 답하도록 만드는 것이지요. 자를 바꾸면 성적만 바뀌는 것이 아니라 가장 좋은 예측이 무엇인가까지 바뀝니다.

도해: 가로는 예측이 빗나간 방향, 세로는 그래서 치르는 값. 점선은 대칭 V(MAE), 청록 선은 왼쪽 팔이 오른쪽의 3배로 가파른 비대칭 손실 — 3배는 값의 차이를 보이려고 그린 예시이고 실제 값의 비는 운영팀이 정한다.

과거 264일을 창 다섯으로 굴린다TimeSeriesSplit(n_splits=5)1번2번3번4번5번훈련(청록)은 늘 앞쪽 · 시험(주황)은 늘 그다음 — 미래가 훈련에 못 들어간다창 다섯의 평균 MAE 회귀 6,020 · 구간 평균 7,452 · 평균 모델 10,077우리가 쓴 한 번 나누기 shuffle=False1번성적표가 한 장뿐 — 그 한 철이 이상했다면 알 길이 없다
방법 더 깊이

미래를 엿본 평가, 그리고 앞으로 굴러가는 창

시간으로 이어진 자료를 섞어 나누면 성적이 부풀었다가 실제 운영에서 무너집니다. 이렇게 평가할 때만 쓸 수 있고 실제로는 쓸 수 없는 정보가 시험지에 새어 든 것을 누수라고 부릅니다. 오늘 본 것도 누수예요 — 시험 날의 어제와 내일이 훈련에 들어가 있었습니다. 누수는 성적표를 보기만 해서는 알 수 없고, 어떻게 나눴는지를 물어야 드러납니다.

우리는 shuffle=False 로 딱 한 번 잘랐습니다. 성적표가 한 장이라 하필 그 철이 이상했다면 알 길이 없지요. 그래서 훈련 창을 한 칸씩 앞으로 굴리며 여러 번 채점합니다 — scikit-learn의 TimeSeriesSplit이 그 창을 만들어 줍니다. 도해처럼 창마다 훈련은 늘 앞쪽, 시험은 늘 그다음이라 미래가 훈련에 들어갈 수 없어요. 과거 264일을 창 다섯으로 굴리면 평균 MAE가 회귀 6,020 · 구간 평균 7,452 · 평균 모델 10,077로, 한 장짜리 가을 성적과 순위는 같고 크기는 다릅니다. 순위가 여러 장에서 버티면 그 순위를 믿습니다.

도해: 과거 264일을 TimeSeriesSplit(n_splits=5) 로 나눈 모양. 창마다 시험은 44일이고, 아래는 우리가 쓴 한 번 나누기다. 평균 MAE 세 값은 3정거장 자료와 같은 353일에서 잰 값이다.

가을 89일 — 실제(청록 점) · 시험 기간 평균(먹 점선) · 모델(주황 선)010천20천30천시험 기간 평균8월 24일11월 30일모델이 빗나간 양평균선이 빗나간 양의 1.52배R² = 1 − 1.52 = −0.522위 옅은 막대 = 평균선 · 아래 주황 막대 = 모델
자 다시 보기

R²는 음수가 될 수 있다 — 그것이 경고등이다

R²를 '설명한 비율'이라고 배우면 0에서 1 사이의 값처럼 들립니다. 훈련 자료에서 잰 R²는 실제로 그렇습니다. 그런데 시험 자료에서 재면 음수가 나올 수 있어요. R²는 '시험 기간의 평균만 써서 생긴 빗나감'을 1로 놓고 모델이 그 가운데 얼마를 줄였는지 보는 자인데, 모델이 평균선보다 더 빗나가면 1을 넘어가 1에서 뺀 값이 음수가 되기 때문입니다.

도해의 가을 89일이 그렇습니다. 주황 선(구간 평균 모델)이 청록 점(실제)에서 떨어진 양이, 점선(시험 기간 평균)이 떨어진 양의 1.52배예요. 그래서 R² = 1 − 1.52 = −0.522입니다. 음수 R²는 계산 실패가 아니라 “그냥 평균을 쓰는 편이 낫다”는 경고등입니다. 그래서 보고할 때는 훈련 R²와 시험 R²를 함께 적습니다. 둘이 크게 벌어져 있으면, 모델이 배운 것이 실제로 쓰일 자리에서는 통하지 않는다는 뜻이니까요.

도해: 가을 89일의 실제 대여(청록 점) · 시험 기간 평균(먹 점선) · 구간 평균 모델의 예측(주황 선). 아래 두 막대는 모델이 빗나간 양과 평균선이 빗나간 양의 비다. R² −0.522는 3정거장 코드 ②의 출력값이다.