포아송 회귀(Poisson Regression)란? AI에서 사건의 건수와 발생률을 예측하는 방법
TL;DR
포아송 회귀는 입력 조건에 따라 사건이 평균적으로 몇 건 발생할지 예측하는 회귀 방법입니다. 로그 링크를 쓰면 선형 점수를 지수 함수로 바꿔 양수의 평균을 구합니다. 관측 시간이 다르면 건수를 단순 비교하지 말고 노출량을 반영합니다. 예측값이 소수라고 잘못된 결과는 아니며 평균 예측이 개별 사건의 확정 건수나 예측 구간을 뜻하지는 않습니다.
핵심 3줄 요약
- 핵심 1
예측 대상은 건수의 평균입니다. 관측 건수는 정수여도 예상 평균이나 단위 시간당 발생률은 소수일 수 있습니다. - 핵심 2
로그 링크가 양수 예측을 만듭니다. 입력 특징의 선형 점수를 지수 함수로 바꾸며 분류 확률과는 다릅니다. - 핵심 3
관측 기회와 오차를 함께 봅니다. 노출량·과산포·포아송 편차를 확인해야 예측값을 업무에 맞게 해석합니다.
이 글에서 다룰 내용
- 포아송 회귀의 한 문장 정의
- 관측 시간이 다른 두 장비의 쉬운 예시
- 로그 링크와 조건부 평균의 작동 방식
- 노출량·L2 규제·평가 지표의 역할
- 일반 회귀·로지스틱 회귀·음이항 회귀와의 차이
- 실전 사용처와 데이터 점검 순서
- 과산포와 예측값을 읽을 때의 주의점
포아송 회귀를 한 문장으로 정의하면 무엇인가요?
포아송 회귀(Poisson Regression)는 입력 특징에 따른 사건의 조건부 평균을 포아송 분포와 연결 함수로 모델링하는 일반화 선형 모델입니다.
여기서 조건부 평균은 장비의 종류나 사용 환경처럼 입력 조건을 고정했을 때 기대하는 발생 건수입니다. 이 글은 scikit-learn의
PoissonRegressor
처럼 로그 링크를 쓰는 형태를 설명합니다. 실제로 몇 건이 생기는지는 그 평균 주변에서 달라집니다.
포아송 분포의 관측값은 0 이상의 정수입니다. 회귀가 반환하는 평균까지 정수일 필요는 없습니다. scikit-learn은 건수뿐 아니라 건수를 관측 시간이나 규모로 나눈 음이 아닌 발생률을 대상으로 학습하는 방법도 안내합니다. 사건의 개수와 예상 평균, 발생률을 먼저 구분하세요.
한 줄 정리: 포아송 회귀는 어떤 사건이 발생했는지 분류하기보다, 주어진 조건에서 평균적으로 얼마나 자주 발생하는지 추정합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 장비의 일시 중단 건수를 분석한다고 가정해 보겠습니다. 같은 종류의 장비 A는 하루 동안 2건, 장비 B는 이틀 동안 4건을 기록했습니다. 이 숫자는 개념 설명을 위한 가상 자료이며 실제 장비를 학습한 결과가 아닙니다.
- 장비 A: 관측 건수 2건, 노출량 1일, 발생률 하루당 2건입니다.
- 장비 B: 관측 건수 4건, 노출량 2일, 발생률 하루당 2건입니다.
- 관측 기간을 무시하면 B가 더 자주 중단되는 장비처럼 보입니다. 같은 시간 단위로 나누면 이 두 기록의 발생률은 같습니다.
다른 장비 조건을 넣은 모델이 하루당 예상 발생률을 2.4건으로 내놓았다고 가정해 보겠습니다. 이틀 동안 같은 조건과 발생률이 유지된다고 보면 기대 건수는 4.8건입니다. 반쪽 사건이 일어났다는 뜻이 아니라 여러 번 관측했을 때의 평균을 나타냅니다.
예상 건수 4.8을 바로 5건으로 반올림하면 모델의 원래 평균 정보가 사라집니다. 인력이나 부품을 준비하는 과정에서 정수 결정을 내릴 수는 있지만 그 결정 규칙은 회귀 모델의 출력과 분리해 기록하는 편이 좋습니다. 예상 평균만으로 특정 이틀의 실제 건수를 보장하지 않습니다.
쉬운 예시: 하루에 2건과 이틀에 4건을 비교하려면 사건 수와 관측 기회를 같이 봐야 합니다.
왜 AI에서 포아송 회귀가 중요한가요?
음수가 될 수 없는 예측 대상을 다룹니다
중단 횟수나 문의 접수 건수는 음수가 될 수 없습니다. 일반적인 선형 회귀의 출력은 이런 범위를 강제하지 않아 입력에 따라 음수가 나올 수 있습니다. 로그 링크를 쓰는 포아송 회귀는 지수 함수로 평균을 구하므로 수학적으로 양수의 예측을 만듭니다.
음수 예측을 나중에 0으로 잘라 내는 처리와는 학습 목표도 다릅니다. 포아송 회귀는 포아송 편차를 고려해 가중치를 맞춥니다. 양수가 나왔다는 사실만으로 정확한 모델이 되지는 않지만 예측 대상의 범위와 손실을 처음부터 함께 설계합니다.
건수와 발생률을 분리해 비교합니다
오래 관측한 장비는 중단을 기록할 기회도 더 많습니다. 방문 건수라면 관측 시간이나 대상 규모가 달라질 수 있습니다. 같은 숫자 열을 예측하더라도 총건수를 원하는지 단위 시간당 발생률을 원하는지에 따라 정답과 가중치의 구성이 달라집니다.
scikit-learn 공식 예제는 관측 기간으로 사건 수를 나눈 발생률을 정답으로 쓰고 관측 기간을 표본 가중치로 반영합니다. 이 방법은 노출량이 양수이고 그 단위가 일관될 때 적용합니다. 단순히 사건 수가 큰 표본에 임의로 높은 가중치를 주라는 안내는 아닙니다.
핵심 인사이트: 숫자 열이라는 이유로 같은 회귀를 적용하기보다, 사건의 단위와 관측 기회에 맞는 모델을 고르는 것이 출발점입니다.
포아송 회귀는 어떻게 작동하나요?
선형 점수를 로그 링크로 평균에 연결합니다
모델은 입력 특징에 계수를 곱하고 절편을 더해 선형 점수를 만듭니다. 로그 링크에서는 평균의 로그가 이 점수와 같도록 두므로, 예측 평균은 선형 점수에 지수 함수를 적용한 값입니다. 선형 점수 자체는 음수일 수 있어도 지수 함수의 결과는 양수입니다.
다른 조건을 고정한 채 입력 한 단위의 변화를 해석할 때는 계수 자체가 아니라 그 계수에 지수 함수를 적용한 배율을 봅니다. 입력을 표준화했다면 한 단위의 뜻도 원래 수치 단위와 달라집니다. 계수를 건수의 직접 증가분으로 읽거나 원인 효과로 확정하지 않습니다.
편차와 L2 규제로 계수를 학습합니다
PoissonRegressor
는 포아송 편차와 L2 규제를 반영한 목적함수를 최적화합니다.
alpha
는 L2 벌점의 강도를 정합니다. 값을 0으로 두면 이 벌점이 없으며 공식 API는 이때 입력 행렬의 열들이 선형적으로 독립이어야 한다고 안내합니다.
규제는 계수의 크기를 제한하는 장치이지 과산포를 자동으로 해소하는 설정이 아닙니다. 수치 특징의 척도가 크게 다르면 벌점의 영향도 달라지므로 훈련 자료에서 전처리를 맞춥니다. 반복 횟수나 수렴 조건을 조정한 뒤에도 별도 평가 자료에서 성능을 확인합니다.
노출량을 반영하는 구현을 구분합니다
scikit-learn의 발생률 학습에서는
y = counts / exposure
를 정답으로 쓰고
sample_weight
에 노출량을 전달합니다. 예측 결과도 그 노출 단위당 발생률로 해석합니다. 필요한 총 기대 건수는 예측 발생률에 앞으로의 노출량을 곱해 구합니다.
statsmodels의 GLM은 총건수를 반응값으로 두고 로그 링크에서
exposure
를 전달하는 경로를 제공합니다. 이때 노출량의 로그를 계수 1의 항으로 더합니다. 이미 로그를 취한 값을 이 인자에 넣거나 발생률 학습과 총건수 학습을 뒤섞으면 관측 기회를 잘못 반영합니다.
포아송 회귀와 헷갈리는 용어는 무엇이 다른가요?
일반 회귀·분위수 회귀와의 차이
기존 회귀 글은 숫자 값을 예측하는 작업 전체를 설명합니다. 포아송 회귀는 그 안에서 건수나 발생률을 다루는 구체적인 모델입니다. 일반 선형 회귀의 제곱 오차와 달리 포아송 편차를 사용하고 이 글에서 설명하는 로그 링크는 평균을 양수 범위로 연결합니다.
분위수 회귀는 평균 대신 중앙값이나 높은·낮은 분위수를 학습합니다. 포아송 회귀의 평균 하나를 예측 범위의 위끝이나 아래끝으로 읽으면 안 됩니다. 후버 회귀가 큰 잔차의 영향을 줄이는 질문에 답한다면 여기서는 사건 수의 평균과 관측 기회의 관계가 핵심입니다.
로지스틱 회귀·로그 변환과의 차이
로지스틱 회귀는 예를 들어 중단이 있었는지 없었는지의 클래스를 구분하고 확률을 추정합니다. 포아송 회귀는 같은 기간에 중단이 몇 건 발생하는지의 평균을 다룹니다. 예상 발생률은 1보다 커질 수 있으므로 발생 확률과 같은 숫자로 해석할 수 없습니다.
정답 건수에 로그를 취해 일반 선형 회귀를 맞춘 뒤 다시 지수 함수를 적용하는 절차도 같지 않습니다. 로그 링크는 평균과 입력 점수의 연결을 정의하며 원래 반응값에 대한 손실도 포아송 방식으로 정합니다. 정답이 0인 자료의 처리와 학습 목표부터 달라집니다.
음이항 회귀·포아송 손실과의 차이
기본 포아송 분포는 같은 입력 조건에서 분산과 평균이 같다고 가정합니다. 조건을 고려한 뒤에도 실제 변동이 더 크면 과산포를 의심합니다. 음이항 모델은 별도의 분산 구조를 갖는 후보입니다. statsmodels의 NB2 가족은 평균에 평균 제곱 항을 더한 분산을 사용합니다.
음이항 가족의
alpha
는 분산을 정하는 모수입니다. 같은 이름이라도
PoissonRegressor
의 L2 규제 강도와 의미가 다릅니다. 포아송 손실을 쓰는 부스팅 모델 역시 같은 손실 계열을 사용하지만 입력을 선형 점수로 연결하는 이 포아송 회귀와 모델 구조는 다릅니다.
비교 정리: 일반 회귀는 숫자 예측 작업, 포아송 회귀는 사건 평균 모델, 로지스틱 회귀는 분류 확률 모델, 음이항 모델은 다른 분산 구조의 건수 모델입니다.
실전에서는 어디에 쓰이나요?
장비 중단·문의 발생의 평균을 살핍니다
장비 유형과 사용 조건으로 일정 기간의 중단 건수나 가동 시간당 발생률을 예측하는 후보로 비교합니다. 문의 자료라면 기록의 단위를 접수 한 건으로 정하고 같은 문의가 여러 번 집계됐는지 확인합니다. 하루 단위와 주 단위 기록을 그대로 섞지 않습니다.
이 활용 예시는 적용 맥락을 설명하기 위한 것이며 성능을 확인한 운영 결과가 아닙니다. 실제 도입에서는 입력 조건이 다른 그룹의 오차와 예측 시점에 얻을 수 있는 특징을 검사합니다. 앞으로의 중단 결과로 만든 특징이 입력에 들어가면 평가가 왜곡됩니다.
같은 사건 예측에서 기준 모델로 비교합니다
포아송 회귀와 더 복잡한 모델을 같은 평가 자료에서 비교하면 추가 구조가 도움이 되는지 살필 수 있습니다. scikit-learn 공식 예제도 일반 선형 모델, 포아송 회귀, 포아송 손실을 쓰는 부스팅 모델을 대조합니다. 특정 예제의 우열은 자신의 자료의 결과로 대신 쓸 수 없습니다.
예측값의 평균만 비교하지 말고 어떤 그룹에서 건수를 자주 과소 추정하는지 펼쳐 봅니다. 한 모델의 전체 오차가 낮아도 운영상 중요한 중단 사례에서 오차가 클 수 있습니다. 평가 대상과 기간을 고정한 뒤 구간별 결과를 함께 보관합니다.
포아송 회귀를 적용할 때 어떤 순서로 확인하나요?
1. 사건 단위와 노출량을 정합니다
중복을 제거한 사건 한 건이 무엇인지, 관측 기간의 단위는 일인지 시간인지 먼저 적습니다. 총건수와 발생률 중 원하는 출력을 선택하고 노출량이 0이거나 누락된 행은 데이터 수집 경위를 확인합니다. 나눗셈을 위해 작은 숫자로 임의 교체하지 않습니다.
사건이 없어서 0건인 행과 관측 자체가 없었던 행은 다릅니다. 정상적으로 관측한 0건은 중요한 정답 자료입니다. 관측 여부를 점검하지 않고 빈칸을 모두 0으로 바꾸면 모델이 배우는 발생률이 달라집니다.
2. 자료를 나누고 전처리·가중치를 맞춥니다
새 기간을 예측한다면 시간 순서에 맞춰 훈련과 평가를 나눕니다. 반복 기록이 있는 장비나 대상은 평가 목적에 맞게 그룹 분리도 고려합니다. 수치 특징의 표준화와 범주형 인코딩은 훈련 자료에서만 학습하고 모델과 함께 저장합니다.
발생률 학습이라면 정답 계산, 표본 가중치, 평가 가중치의 노출 단위를 맞춥니다. 총건수 학습이라면 노출량을 넣는 구현의 계약을 따릅니다. 정답의 단위가 하루당 건수인지 기간 전체의 건수인지 저장된 결과에도 남겨 둡니다.
3. 포아송 편차와 기준 점수를 대조합니다
mean_poisson_deviance
는 실제값이 0 이상이고 예측값은 0보다 커야 합니다. 낮을수록 좋고 최선은 0입니다. MAE 같은 해석하기 쉬운 오차도 함께 보되, 포아송 편차를 계산하려고 잘못된 음수 예측 사례만 숨겨서 제외하지 않습니다.
PoissonRegressor.score
는 일반 제곱 오차의 R²가 아니라 편차 설명 비율 D²를 반환합니다. 최선은 1이고 평균을 예측하는 기준보다 나쁘면 음수가 나올 수 있습니다.
d2_tweedie_score
를 따로 호출할 때는 포아송 평가에
power=1
을 지정합니다. 기본값은 0이므로 지표 이름만 보고 같은 점수라고 가정하지 마세요.
실전 팁: 사건의 정의, 노출 단위, 자료 분리, 정답·가중치 구성, 편차와 실제 사례의 오차를 한 기록으로 묶어 비교하세요.
사용할 때 무엇을 주의해야 하나요?
첫째, 평균과 실제 건수를 구분합니다. 소수 예측은 평균이나 발생률입니다. 그 값 자체가 특정 대상의 확정 건수, 신뢰구간, 예측 구간은 아닙니다. 범위가 필요하면 분포 가정과 별도의 구간 산출·검증 절차를 확인합니다.
둘째, 전체 자료의 분산만으로 가정을 판정하지 않습니다. 포아송의 평균·분산 관계는 입력 조건을 고려한 분포의 가정입니다. 서로 다른 평균의 대상을 모두 합친 자료는 전체 분산이 커질 수 있으므로, 모델이 반영한 조건과 남은 오차 구조를 같이 살핍니다.
셋째, 0이 많다는 이유만으로 실패를 단정하지 않습니다. 평균이 작으면 포아송 분포에서도 0이 자주 나옵니다. 모델이 예상하는 빈도보다 0이 과도한지, 관측 누락이나 서로 다른 생성 과정이 섞였는지 먼저 검사합니다.
넷째, 노출량 인자를 중복 적용하지 않습니다. 총건수 모델의 노출량과 발생률 모델의 가중치는 각 경로의 규칙대로 사용합니다. 같은 관측 시간을 임의로 두 번 반영하거나 하루와 시간 단위를 혼용하면 출력의 의미가 달라집니다.
다섯째, 점수와 계수에 다른 의미를 붙이지 않습니다. D²는 분류 정확도나 정답 확률이 아닙니다. 계수의 배율도 자료와 가정에 따른 연관성의 해석입니다. 중요한 운영 결정을 내릴 때는 독립 평가와 실제 오류 사례를 함께 확인합니다.
주의: 양수 출력과 낮은 학습 손실만으로 포아송 가정, 미래 성능, 개별 대상의 실제 건수가 보장되지는 않습니다.
자주 묻는 질문
Q1. 예측한 사건 수가 소수여도 되나요?
됩니다. 관측된 사건 수는 정수여도 모델이 예측하는 조건부 평균이나 발생률은 소수일 수 있습니다. 정수 의사결정이 필요하면 반올림 같은 규칙을 별도로 정하고 원래 예측값도 보관합니다.
Q2. 정답에 0건이 있으면 제거해야 하나요?
아닙니다. 정상적으로 관측한 0건은 포아송 회귀의 대상에 포함됩니다. 관측이 없었던 행을 0건으로 오인하지 않도록 구분하세요. 포아송 편차에서는 실제값 0은 허용하지만 예측값은 양수여야 합니다.
Q3. 관측 기간이 모두 같아도 노출량을 따져야 하나요?
같은 관측 기간과 같은 사건 단위라면 기간 전체의 건수를 그대로 예측하는 구성을 검토할 수 있습니다. 기간이 달라지거나 발생률로 해석하려면 노출량 단위와 모델의 입력 방식을 명확히 맞춥니다.
Q4. alpha를 키우면 과산포가 해결되나요?
그렇게 해석하면 안 됩니다. PoissonRegressor의 alpha는 L2 규제 강도입니다. 음이항 가족의 분산 모수와 같은 이름이지만 기능은 다릅니다. 변동이 큰 원인과 모델의 분산 가정을 별도로 점검합니다.
Q5. score가 음수면 계산 오류인가요?
반드시 그렇지는 않습니다. PoissonRegressor의 score는 D²이며 평균을 예측하는 기준보다 편차가 크면 음수가 될 수 있습니다. 정답과 노출량의 단위, 평가 자료, 비교 기준을 먼저 확인합니다.
출처
- scikit-learn, PoissonRegressor API
- scikit-learn, Generalized Linear Models
- scikit-learn, Poisson regression and non-normal loss
- scikit-learn, mean_poisson_deviance API
- scikit-learn, d2_tweedie_score API
- statsmodels, Generalized Linear Models
- statsmodels, GLM API
- statsmodels, NegativeBinomial family API
마무리
포아송 회귀는 입력 조건에 따른 사건의 예상 건수나 발생률을 다루는 모델입니다. 로그 링크는 선형 점수를 양수 평균으로 연결하고 노출량은 대상이 사건을 기록할 기회를 반영합니다. 평균이 소수로 나온다는 이유로 오류로 판단하지 않습니다.
먼저 사건의 단위와 관측 시간을 정한 뒤 총건수 또는 발생률 중 무엇을 학습할지 선택하세요. 이후 노출량 구성, 포아송 편차와 D², 조건을 고려한 변동과 실제 오류 사례를 확인하면 모델이 주는 숫자의 범위와 한계를 분명하게 읽을 수 있습니다.
