로지스틱 회귀(Logistic Regression)
로지스틱 회귀은 왜 선형 모형인가?
인터넷을 검색하다 보면 잘못된 정보가 그대로 유통되는 경우를 심심치 않게 발견되곤 한다. (사실 대중적으로 유명한 발표자나 학계에서 유명한 학자의 강의에서도 잘못된 정보를 발견하는 경우가 많다. 개인적인 경험으로 평균 3개 정도의 오류가 발견된다. 물론 제 글에는 그보다 많은 수의 오류가 존재할 수 있습니다. ㅠ) 인터넷의 한 블로그에서는 로지스틱이 회귀가 선형인 것은 결정경계면이 선형이기 때문이라고 말한다.
물론 용어의 의미는 바뀔 수도 있고, 출처는 불명확한 경우가 대부분이긴 하지만, GLM(Generalized Linear Model; 일반화 선형 모형)은 Linear Model에 링크 함수(연결함수; Link function)을 적용한 것이기에, 선형 모형 1: 선형의 의미에서 설명한 바와 같이, 선형은 계수의 선형 함수임을 의미합니다. (GLM은 로지스틱 회귀, 포와송 회귀 등을 모두 포함하는 개념입니다.)
실제로 피처 엔지니어링 등을 통해 경계면이 선형이 아닌 모형을 만든 것이 얼마든지 가능합니다.
예를 들어 설명변수가 \(x_1, x_2\) 이고 로지스틱 회귀모형이 \(\textrm{logit}^{-1}\left[\mathbb{E}(y)\right] = 1 + 0.5\cdot x_1 -2 \cdot x_2 + 1 \cdot (x_1 \cdot x_2)\) 일 때 결정경계면은 다음과 같이 직선이 아닙니다.
library(ggplot2)
library(dplyr)
x1 = seq(-4,4,0.1)
x2 = seq(-4,4,0.1)
dat <- expand.grid(x1 = x1, x2 = x2)
dat <- dat %>%
mutate(y = factor(1 + 0.5*x1 - 2*x2 + x1*x2 > 0,
levels=c(TRUE,FALSE)))
ggplot(data = dat) +
geom_tile(aes(x=x1, y=x2, fill=y)) +
coord_fixed(ratio=1)
그렇다면 이제부터 본격적으로 로지스틱 회귀에 대해서 알아봅시다.
결과가 ‘0 또는 1’과 같이 이산 분포일 때 선형 회귀 모형의 문제점
만약 결과 변수가 참/거짓, 그렇다/아니다 와 같이 두 범주로 나타낼 수 있다면, 숫자 0/1로도 나타낼 수 있습니다.
결과 변수가 0 또는 1이라면 선형 회귀 모형을 사용하여 데이터를 분석할 수 있지만 다음의 문제가 발생하게 됩니다.
- \(\beta_1 \neq 0\) 인 경우 예측변수에 커지거나 작아지면 예측값이 0보다 작거나, 1보다 커진다. 설명변수가 값이 주어졌을 때 결과변수의 평균이 1보다 크다는 것은 무엇을 말할까요? 결과변수의 최댓값이 1이므로 결과변수의 평균은 1보다 클 수 없습니다!
- \(Y|x\) 의 분포는 정규분포가 아니다. OLS 선형 회귀의 가정 중의 하나는 결과변수의 조건부(설명변수가 주어졌을 때) 분포가 정규분포라는 것입니다. 하지만 실제 결과변수의 분포는 정규분포와 같은 연속분포가 아니라 이산분포입니다.
비교 : 선형 회귀 모형과 로지스틱 회귀 모형
수식으로 써보면 선형회귀모형(LM)과 GLM의 하나인 로지스틱 회귀 모형은 다음과 같이 다릅니다.
- 선형 회귀 모형 : \(y_i = \beta_0+ \beta_1 x + e_i,\ \ e_i \sim \mathcal{N}(0, \sigma^2)\)
- \(\mathbb{E}[Y | x]\) 는 \(\beta_0+\beta_1 x\) 이다.
- 따라서, \(Y|x \sim \mathcal{N}(\beta_0+\beta_1 x, \sigma^2)\) .
- 로지스틱 회귀 모형
- \(p_i = \mathbb{E}[y_i | x_i]\) 일 때, \(\log \frac{p_i}{1-p_i} = \beta_0 + \beta_1 x_i\) .
- \(y_i | x_i \sim \text{bern}(p_i)\) . ( \(\text{bern}\) : 베르누이 분포)
- 로그 우도 \(\log \frac{p}{1-p}\) 는 계수의 선형 함수이다.
- \(i\) -번째 관찰값 \(y_i\) 가 1일 확률 \(p_i\) 는 \(\mathbb{E}[Y|x]\) 와 같다.
로지스틱의 가정
로지스틱 회귀 모형의 가정이 선형 모형과 어떻게 다른지 살펴봅시다. 선형 모형의 가정은 흔히 LINE으로 표현할 수 있습니다.
- Linearity : \(g(\mathbb{E}[Y|x])\) 는 계수의 선형함수이다.
- Independence : \(x\) 가 주어졌을 때, \(Y\) 의 분포는 서로 독립이다. 다시 말해 \(Y_i|X_i\) 와 \(Y_j|X_j(i \neq j)\) 는 독립이라는 의미입니다.
Normality: 오차의 분포는 이항분포이다. 일반화 선형모형(GLM; Generalized Linear Model)에서는 \(Y|x\) 의 분포가 이항분포, 다항분포, 푸와송 분포 등으로 확장된다.Equal Variance: 오차의 분산은 예측 변수 값에 따라 달라질 수 있다.
몇 가지 용어
여기서는 로지스틱 회귀를 이해하기 위해 필요한 몇 가지 용어를 살펴봅니다.
승산(odds)
어떤 사건의 확률이 \(p\) 일 때, 승산은 \(\frac{p}{1-p}\) 입니다. 확률의 범위가 0에서 1까지라면 승산은 0에서 무한대까지의 값을 가질 수 있습니다. 참일 확률은 거짓일 확률의 몇 배인가?란 질문에 대한 답으로 생각할 수 있습니다. 도박하는 사람들이 많이 쓴다고 하네요. 도박하는 사람들은 이길 확률보다는 한 번 잃을 때마다 평균적으로 몇 번을 딸 것인가?를 생각하겠죠? 물론 도박사의 오류가 있다곤 하지만 평균적으로 이기는 횟수는 지는 횟수의 승산(odds)배가 됩니다.
curve(x/(1-x), xlim=c(0,1), main='odds')
위의 그래프에서 보듯이 참일 확률이 늘어날 수록 승산은 기하급수적으로 늘어납니다.
로짓
로짓(logit)은 승산에 로그를 씌운 것입니다. 승산이 4인 경우를 봅시다. 확률이 0.8인 경우이죠. 이때 이길 확률이 아니라 질 확률을 생각해보면 질 승산은 0.25가 됩니다. 이길 승산과 질 승산이 4와 0.25로 서로의 관계를 알아채기 힘듭니다.
하지만 로짓을 계산하면 1.386과 -1.386으로 서로의 관계를 바로 알 수 있다는 장점이 있습니다. 로짓 0은 확률 0.5를 의미하고, 양수는 이길 확률이 질 확률보다 크다는 것을 의미합니다.
로짓은 마이너스 무한대에서 플러스 무한대까지 모든 실수가 가능합니다.
curve(log(x/(1-x)), xlim=c(0,1), main='logit = log(odds)')
승산비(odds ratio)
두 사건의 확률을 비교할 때, 단순히 확률의 차이는 확률을 특성을 제대로 반영하지 못합니다.
확률의 특성이 무엇일까요? 0에서 1까지로 범위가 한정되어 있습니다.
확률이 0.9인 경우에 0.01를 증가시키는 것은, 확률이 0.5인 경우에 0.01을 증가시키는 것에 비해 몇 배가 더 큰 노력이 들어갈 것이 분명합니다.
승산비는 두 승산의 비를 나타냅니다.
위의 예에서 승산비를 구해봅시다. 확률이 0.91과 0.9의 승산비는
(0.91/(1-0.91))/(0.9/(1-0.9))
## [1] 1.123457
(0.51/(1-0.51))/(0.5/(1-0.5))
## [1] 1.040816
0.9와 0.91의 차이는 승산으로 얘기해보자면, 한 번 질 때 0.91의 확률은 0.9의 확률보다 1.12배 더 많이 이깁니다.
반면 승률 0.51은 승률 0.5보다 1.04배 더 많이 이깁니다(한 번 질 때마다).
다음 그래프는 확률 차와 승산비를 보여줍니다.
p1 = seq(0.05,0.95, 0.1)
p2 = seq(0.05,0.95, 0.1)
dat <- expand.grid(p1 = p1, p2 = p2)
dat <- dat %>%
mutate(diffp = round(p2 - p1, 2)) %>%
mutate(oddsratio = p2/(1-p2)/(p1/(1-p1))) %>%
mutate(logor = log(oddsratio))
ggplot(data = dat) +
geom_tile(aes(x=p1, y=p2, fill=diffp)) +
labs(title = 'probability difference') +
coord_fixed(ratio=1)
dat %>% filter(oddsratio > 0.01 & oddsratio < 99) %>%
ggplot() +
geom_tile(aes(x=p1, y=p2, fill=oddsratio)) +
labs(title = 'odds ratio') +
coord_fixed(ratio=1)
dat %>%
#filter(p2>p1) %>%
ggplot() +
geom_tile(aes(x=p1, y=p2, fill=logor)) +
labs(title = 'log(odds ratio)') +
coord_fixed(ratio=1)
승산이 지는 횟수와 이기는 횟수의 비를 나타낸다면, 승산비는 두 승산의 비를 나타냅니다.
쉽게 얘기해서 승산이 어떤 도박에서 한 번 잃을 때 몇 번 따는가를 묻는다면, 승산비는 서로 다른 두 도박에서 승산의 비를 나타낸다고 할 수 있겠죠.
예를 들어 블랙잭은 승산이 3이고, 짤짤이는 승산이 2라면, 이 둘의 비 3/2=1.5가 승산비가 됩니다.
직관적으로 빈도로 생각해보자면,
- 확률 : 1번 해서 몇 번 이기는가?
- 승산 : 1번 질 때 몇 번 이기는가?
- 확률차 : 1번 할 때, 몇 번 더 이기는가?
- 확률비 : 1번 할 때, 몇 배 더 이기는가?
- 승산비 : 1번 질 때, 몇 배 더 이기는가?
로지스틱(logistic) 함수(로짓의 역함수) : \(\frac{1}{1+\exp(-x)}\)
library(arm)
curve(invlogit(x), xlim=c(-5,5), main='invlogit or logistic')
그런데 왜 로지스틱인가?
로지스틱 함수는 로지스틱 미분 방정식의 해입니다.
만약 입력 변수를 시간 \(t\) 로 생각한다면, 인구의 증가는 현재 인구에 비례하지만, 인구는 무한정 증가할 수 없고 시스템이 수용가능한 최대값에 의해 제한되는 경우로 생각할 수 있습니다.
Leave a comment