사전 예측
개념

예측

gabury1고친 사람 github-actions[bot]

예측은 이미 아는 값으로 아직 모르는 값을 맞히는 일입니다. 머신러닝에서는 지난 기록에서 찾아 둔 계산식에 처음 보는 입력을 넣어 답을 받는 단계를 가리킵니다. 이 계산식이 모델입니다. 시계열 분석에서는 지난 기록을 보고 앞으로 올 값을 내다보는 일을 가리킵니다. 어느 쪽이든 답이 틀릴 수 있어서 얼마나 틀리는지를 함께 따집니다.

쉽고 빠른 이해

무슨 일을 하나 — 아는 값을 넣으면 모르는 값을 돌려받습니다. 배달 앱이 주문 순간에 「도착까지 32분」을 띄우는 것이 예측입니다.

왜 이렇게 하나 — 답을 알게 되는 때는 늘 너무 늦습니다. 도착 시간은 배달이 끝나야 압니다. 내일 주문량은 내일이 지나야 압니다. 그 전에 움직이려면 미리 짐작한 값이 필요합니다.

어떻게 도나

  1. 답이 이미 나온 지난 기록에서 규칙을 찾아 계산식으로 담아 둡니다. 이 계산식이 모델입니다
  2. 새 주문이 오면 거리와 시간대 같은 값을 모델에 넣습니다
  3. 모델이 계산한 값을 화면이나 다른 시스템에 넘깁니다

대가 — 예측은 틀립니다. 지난 기록에 없던 상황이 오면 더 많이 틀립니다. 그래서 틀리는 정도를 미리 재 둡니다. 운영 중에도 계속 지켜봅니다.

상세

오래 장사한 과일 가게 주인은 수박을 두드려 보고 잘 익었는지 맞힙니다. 수천 통을 쪼개 본 경험이 쌓여서입니다. 처음 보는 수박이어도 소리만 듣고 답을 냅니다.

머신러닝의 예측도 같은 짜임입니다. 답이 붙은 지난 기록으로 모델을 먼저 만듭니다. 그다음 답이 안 붙은 새 입력을 그 모델에 넣어 답을 받습니다. 이 마지막 단계도, 그때 받은 답도 예측이라고 부릅니다.

이 절은 배달 서비스 하나를 끝까지 예로 씁니다. 도착 시간, 주문 취소, 내일 주문량을 맞히는 세 가지 일로 예측이 어디서 오는지, 어떤 모양의 답을 내는지, 얼마나 믿을 수 있는지, 서비스에 어떻게 붙는지를 차례로 봅니다. 마지막 소절은 같은 낱말을 다른 뜻으로 쓰는 경우를 가릅니다.

훈련 다음에 오는 단계

모델을 쓰는 일은 두 단계로 나뉩니다. 앞 단계는 훈련입니다. 지난 배달 기록에서 거리, 시간대, 걸린 시간을 모아 그 사이의 규칙을 찾습니다.

뒤 단계가 예측입니다. 방금 들어온 주문은 아직 배달이 안 끝나서 걸린 시간을 모릅니다. 거리와 시간대만 모델에 넣습니다. 그러면 모델이 계산한 시간이 돌아옵니다.

모델에 넣는 값 하나하나를 특성이라고 부릅니다. 이 예에서는 거리와 시간대가 특성입니다. 예측할 때 모델 손에 있는 것은 특성뿐입니다.

flowchart TD
    subgraph 훈련
        A["지난 배달 기록 · 거리 · 시간대 · 걸린 시간"] --> B["규칙을 찾는다"]
    end
    subgraph 예측
        C["새 주문 · 거리 · 시간대"] --> D["모델"]
        D --> E["예상 도착 시간"]
    end
    B --> D

그림의 두 덩어리가 두 단계입니다. 훈련에는 걸린 시간이 들어갑니다. 예측에는 들어가지 않습니다. 예측은 그 빈 값을 채우는 일입니다.

훈련이 끝나면 모델은 숫자 몇 개로 굳습니다. 이 숫자를 파라미터라고 부릅니다. 예측은 굳은 숫자로 계산만 하는 일이라 훈련보다 훨씬 가볍습니다.

아래는 아주 단순한 모델로 도착 시간을 예측하는 코드입니다. 훈련이 「1km 에 3분, 기본 10분」이라는 숫자를 찾았다고 칩니다. 오른쪽 주석이 그 줄이 내는 값입니다.

Python
per_km, base = 3.0, 10.0  # 훈련이 찾은 값

def predict(km):
    return per_km * km + base

predict(2.0)   # 16.0
predict(7.5)   # 32.5

predict 함수가 예측입니다. 거리 하나를 받아 곱하고 더하기만 합니다. 실무 모델은 특성도 파라미터도 훨씬 많지만 「굳은 숫자로 계산만 한다」는 점은 같습니다.

이 단계를 추론이라고도 부릅니다. 추론은 모델을 돌리는 행위에, 예측은 그 결과로 받은 값에 무게가 실린 말입니다. 실무에서는 둘을 섞어 씁니다.

예측이 내는 답의 모양

무엇을 맞히느냐에 따라 답의 모양이 갈립니다. 도착 시간처럼 숫자 하나를 맞히는 일을 회귀라고 부릅니다. 앞의 predict 가 회귀입니다.

주문이 취소될지처럼 정해진 보기 가운데 하나를 고르는 일은 분류라고 부릅니다. 이 예에서 보기는 「취소함」과 「안 함」 둘입니다.

분류 모델은 대개 보기 하나만 내놓지 않습니다. 「취소될 확률 0.83」처럼 보기마다 확률을 냅니다. 이 확률을 보기 하나로 바꾸려면 기준선이 하나 더 필요합니다.

그 기준선을 임계값이라고 부릅니다. 임계값을 0.5로 두면 0.83은 「취소함」이 됩니다. 0.9로 올리면 같은 0.83이 「안 함」이 됩니다. 확률은 모델이 냅니다. 임계값은 서비스가 정합니다.

임계값은 틀렸을 때의 손해를 보고 정합니다. 취소될 주문을 놓치는 손해가 크면 임계값을 낮춥니다. 대신 멀쩡한 주문까지 의심하게 됩니다.

예측은 틀린다

예측은 맞힌다고 약속하지 않습니다. 모델은 지난 기록에서 찾은 규칙으로 계산할 뿐이라 기록에 없던 사정은 모릅니다. 맑은 날 기록만 배운 모델은 비 오는 날의 도착 시간을 짧게 잡습니다.

그래서 모델을 쓰기 전에 얼마나 틀리는지 잽니다. 답을 아는 기록 일부를 훈련에서 빼 두었다가, 다 만든 모델에 넣어 예측값과 진짜 답을 견줍니다. 이렇게 빼 둔 기록을 테스트 데이터라고 부릅니다.

빼 두는 까닭은 훈련에 쓴 기록으로 재면 점수가 부풀기 때문입니다. 모델이 규칙 대신 기록 자체를 외웠을 수 있습니다. 이렇게 외우기만 하고 처음 보는 입력에서 틀리는 현상을 과적합이라고 부릅니다.

반대로 처음 보는 입력에서도 잘 맞히는 성질을 일반화라고 합니다. 테스트 데이터로 재는 것이 곧 일반화를 재는 일입니다.

틀린 정도는 숫자 하나로 적습니다. 회귀라면 예측값과 진짜 값의 차이를 평균 냅니다. 「도착 시간이 평균 4분쯤 어긋난다」는 식입니다. 차이의 크기를 평균 낸 이 값을 평균 절대 오차라고 부릅니다.

분류라면 맞힌 비율을 셉니다. 이런 숫자를 통틀어 평가 지표라고 부릅니다. 지표가 있어야 두 모델 가운데 어느 쪽이 나은지 견줄 수 있습니다.

운영에 올린 뒤에도 틀리는 정도는 바뀝니다. 배달 지역이 새 동네로 넓어지면 들어오는 입력이 훈련 때와 달라집니다. 이 현상을 분포 이동이라고 부릅니다. 그래서 운영 중에도 예측값을 나중에 나온 진짜 답과 견주어 계속 지켜봅니다.

앞날을 내다보는 예측

지금까지는 입력 하나를 넣으면 답 하나를 받는 예측이었습니다. 시계열에서 말하는 예측은 결이 조금 다릅니다. 시간 순서대로 쌓인 기록을 보고 앞으로 올 값을 내다보는 일입니다. 영어로는 prediction 대신 forecast 라고 따로 부르기도 합니다.

배달 서비스라면 내일 시간대별 주문량을 맞히는 일이 이쪽입니다. 지난 몇 주를 보면 주문량은 점심과 저녁에 솟고 주말에 더 많습니다. 이렇게 일정한 주기로 되풀이되는 무늬를 계절성이라고 부릅니다.

길게 보아 오르거나 내리는 흐름도 있습니다. 서비스가 커지면서 주문량이 달마다 조금씩 늘어나는 흐름입니다. 이 흐름이 추세입니다.

거리나 시간대 같은 별도의 특성 없이, 맞히려는 값 자신의 지난 기록이 입력이 됩니다. 어제의 주문량과 지난주 같은 요일의 주문량이 내일 주문량을 맞히는 단서입니다. 지난주 같은 요일을 보는 것은 계절성을 쓰는 일입니다. 달마다 늘어나는 폭을 더하는 것은 추세를 쓰는 일입니다.

얼마나 틀리는지 잴 때도 방식이 다릅니다. 기록을 아무렇게나 섞어 일부를 빼 두면 모델이 미래의 값을 보고 과거를 맞히는 꼴이 됩니다. 그래서 날짜 하나를 기준으로 정해 그 앞은 훈련에, 그 뒤는 시험에 씁니다.

멀리 내다볼수록 더 많이 틀립니다. 내일 주문량보다 석 달 뒤 주문량이 맞히기 어렵습니다. 그래서 시계열 예측은 값 하나 대신 「120건에서 160건 사이」처럼 폭을 함께 내는 일이 많습니다. 이 폭을 예측 구간이라고 부릅니다.

서비스에 예측을 붙이는 두 방식

백엔드 개발자가 예측을 만나는 곳은 대개 모델 안쪽이 아닙니다. 예측을 언제 계산해 어디에 두느냐입니다. 방식은 크게 둘입니다. 이 소절은 앞의 도착 시간과 주문량 두 예로 둘을 견줍니다.

온라인 예측은 요청이 들어온 순간에 계산합니다. 주문 버튼을 누르면 서버가 그 주문의 거리와 시간대를 모델에 넣습니다. 모델이 돌려준 도착 시간으로 바로 응답합니다. 방금 들어온 정보까지 쓸 수 있습니다. 대신 모델이 계산하는 시간이 응답 시간에 더해집니다.

온라인 예측을 하려면 모델을 요청을 받는 서버로 띄워 둬야 합니다. 이 일이 모델 서빙입니다.

배치 예측은 미리 계산해 둡니다. 매일 밤 가게마다 내일 시간대별 주문량을 계산해 테이블에 넣어 둡니다. 사장님 화면은 그 테이블을 조회하기만 합니다. 응답은 빠릅니다. 대신 계산한 뒤에 생긴 변화는 모릅니다.

flowchart TD
    subgraph 온라인 예측
        A["요청"] --> B["서버"]
        B --> C["모델"]
        C --> D["응답"]
    end
    subgraph 배치 예측
        E["매일 밤 계산"] --> F["모델"]
        F --> G["테이블"]
        H["요청"] --> I["테이블 조회"]
        G --> I
    end

위 그림에서 배치 예측의 모델은 요청과 상관없이 밤에만 돕니다.

둘을 가르는 질문은 입력이 언제 정해지느냐입니다. 도착 시간은 주문이 들어와야 거리를 압니다. 이렇게 입력이 요청 순간에야 정해지면 온라인 예측밖에 없습니다. 입력이 미리 정해져 있고 조금 낡은 답이어도 괜찮으면 배치 예측이 싸고 빠릅니다.

같은 낱말의 다른 쓰임

예측이라는 낱말은 머신러닝 밖에서도 기술 용어로 쓰입니다. 뜻이 달라서 검색할 때 헷갈리기 쉽습니다.

CPU(Central Processing Unit, 중앙 처리 장치)의 분기 예측은 조건문이 어느 쪽으로 갈지 미리 짐작하는 하드웨어 기법입니다. 짐작한 쪽의 명령을 먼저 실행해 둡니다. 짐작이 틀리면 그 일을 버리고 다시 실행합니다. 모델을 훈련하지 않으니 이 편의 예측과는 다른 이야기입니다.

보안에서 말하는 예측 불가능성은 공격자가 다음 값을 맞힐 수 없어야 한다는 성질입니다. 세션 토큰이나 비밀번호 재설정 링크에 쓰는 난수가 이 성질을 갖춰야 합니다. 이쪽에서 예측은 막아야 할 일입니다.

관련 항목

예측에 앞서 거치는 준비 단계

훈련 · 훈련 데이터 · 특성 · 레이블 · 모델 · 파라미터

예측값의 모양을 정하는 과제

회귀 · 분류 · 이진 분류 · 다중 분류 · 확률 · 임계값

예측이 얼마나 틀리는지 재는 도구

테스트 데이터 · 평가 지표 · 평균 절대 오차 · 정확도 · 교차 검증

예측을 빗나가게 만드는 현상

과적합 · 과소적합 · 일반화 · 분포 이동 · 데이터 누수

시계열 예측이 쓰는 개념

시계열 · 시계열 분석 · 추세 · 계절성 · 예측 구간 · 이동 평균

예측을 서비스에 올리는 방식

온라인 예측 · 배치 예측 · 모델 서빙 · 추론 · 재학습

이름이 겹치는 다른 기술 용어

분기 예측 · 예측 불가능성 · 예측 분석 · 난수 생성기

다른 이름: prediction · forecast · 예측값