<matplotlib.legend.Legend at 0x1f25fe4e730>
로지스틱회귀에 대해서 정리한 글입니다.
Logistic Regression
로지스틱회귀는 이진분류문제를 풀기위한 모형이며 종속변수 Y는 범주형 변수로 2가지 값 0또는 1만을 가질 수 있습니다. 파라미터를 사용하여 종속변수 y값을 설명한다는 점에서 선형회귀와 비슷하지만 y가 범주형변수라는 점과 분류문제에 사용되는 모델이라는 차이점이 있습니다.
가정
로지스틱회귀의 기본 가정은 다음과 같습니다.
-
각각의 데이터요소(샘플)는 여러개의 독립변수와 0또는1만 가질수 있는 종속변수로 이루어져 있습니다.
-
임의의 m개의 독립변수와 이진 종속변수를 가지는 i번째 샘플을 나타나면 다음과 같습니다.
-
-
확률변수
-
기댓값은 실험 또는 시행을 무한히 반복했을때 확률변수가 취하는 값의 평균으로 기대되는(expected) 값(value)입니다. 베르누이분포를 따르는 확률변수
기댓값에 대한 고찰
기댓값은 실험 또는 시행을 무한히 반복했을때 확률변수가 취하는 값의 평균으로(또는 샘플링된 값의 평균) 기대되는 값입니다. 확률변수가 베르누이 분포를 따르는 경우 확률변수에 대한 기댓값(
-
e.g.
=> 무한히 실행했을때 0인 경우가 더 많을 것임 => 관측치를 0으로 예측 =>무한히 실행했을때 1인 경우가 더 많을 것임 => 관측치를 1로 예측
로지스틱회귀 수식 유도
concept
선형회귀에서 추정하고자하는 변수
선형회귀의 아이디어(linear combination)
+ 모수에 대한 표현
이라는 조건을 만족하기 위해서 최종적인 식은 다음과 조건을 만족해야 것입니다.
-
-
linearcombination = 모수(추정하고자하는값)여야 함.
why linear combination?
본격적인 유도
모수를 로지스틱함수로 바꾸기
의 linear combination이 식에 존재해야 합니다. 그러므로 선형방정식을 하나 만듭니다.
- 좌변은 예측하고자 하는 값인 모수여야 합니다. 좌변을 바꿔봅니다.
- 좌변의 베르누이 분포의 모수
는 확률변수 인 사건이 일어날 확률입니다. 그러므로 이라는 범위를 가지는 반면 우변의 값 은 에 범위를 가집니다. 여기서 Odss Ratio를 써서 모수 를 포함하며 더 넓은 range를 갖도록 좌변을 수정합니다. - 좌변을 Odds Ratio로 수정했지만 여전히 좌변의 범위는
으로 우변에 비해 좁습니다. 따라서 Odds Ratio에 로짓변환을 취하여 좌변의 범위를 로 넓혀줍니다.
위 식을 해석하기 위해
- 이제 양변의 범위는 맞춰졌으므로 추정하고자 하는 변수
가 좌변에 오도록 정리해봅시다. (전개)
최종적으로, 앞서 목적이었던 X와 W의 선형조합이 수식내부에 존재하도록 새롭게 표현한 모수는 다음과 같습니다.
베르누이 분포의 pmf 정리
베르누이분포의 모수
MLE
베르누이 분포의 모수
주어진 상황은 다음과 같습니다.
- 주어진 데이터
- 로지스틱 회귀의 가정
MLE를 통해 모수를 추정합니다.(참고:MLE)
가능도는 다음과 같습니다.
목적함수가 최솟값을 가지려면
즉,
위와 같이 m개의 변수에 대해서 미분하면 m개의 방정식이 존재합니다. 그러나 정리하여 풀어낼 수 없는형태이므로 닫힌형태(closed-form)로 해가 존재하지 않습니다.
Gradient descent
위에서 해석적으로 logstic regression의 해를 구할 수 없기때문에 다른 방법들을 써야합니다. 여기서는 경사하강법으로 해를 구합니다. 경사하강법을 사용하기 위해서 NLL을 베르누이분포의 2번식을 활용하여 전개하면 다음과 같습니다. 이번에는 베르누이 분포의 모수를
우리의 목적은 다음과 같습니다.이번에는 모수가
위식에 대해서 직접 계산은 해보지 않았지만, 해석적으로 해를 구할 수 없음을 알았습니다. 그러므로 경사하강법을 이용해서 해를 구합니다. 최솟값을 찾고자 하는 Loss function은 다음과 같이 쓸 수 있습니다.Binary Cross Entropy와 같은 수식입니다.
약간의 notation 변경이 있습니다.로지스틱회귀의 likelyhood를 최대화(또는 최소화)하여 나온 estimated value(추정치)는
구현
로지스틱회귀의 적합을 pytorch를 사용하여 구현. Gradient Descent 활용
setting
data
torch.manual_seed(2022)
n=400
#1 모수 W가정
W = torch.tensor(
[[-0.8467],
[0.041]]).float()
#2 각각의 관측치(데이터요소)에서의 모수 p_i시각화(시그모이드 함수 시각화)
_x = torch.linspace(-150,150,n).reshape(-1,1)
_one = torch.ones((n,1))
X = torch.concat((_one,_x),axis=1)
p_i = sig(X@W)
y = torch.bernoulli(p_i)
plt.xlim([-150,150])
plt.plot(X[:,1],y,"bo",alpha=0.5)
plt.plot(X[:,1],p_i,"r--")
plt.xlabel("x")
plt.ylabel("y,$p_i$")
plt.title("realizations $y_1,\dots,y_{300}$ from $Bern(p_1),\dots,Bern(p_{300})$")
plt.legend(["y","p"])
<matplotlib.legend.Legend at 0x1f2684bfe20>
Gradient Descent
import torch
import matplotlib.pyplot as plt
plt.style.use('ggplot')
torch.manual_seed(2022)
n=400
#2 임의의 W에 대한 estimated value(추정치) What 초기화
What = torch.tensor(
[[0.],
[-0.03]],requires_grad=True)
_x = torch.linspace(-150,150,n).reshape(-1,1)
_one = torch.ones((n,1))
X = torch.concat((_one,_x),axis=1)
yhat = sig(X@What)
plt.plot(X[:,1].data,y,"bo",alpha=0.3)
plt.plot(X[:,1].data,p_i,"r")
plt.plot(X[:,1].data,yhat.data,"g")
plt.xlabel("x")
plt.ylabel("y")
plt.title("realizations $y_1,\dots,y_{60}$ from $Bern(p_1),\dots,Bern(p_{60})$")
plt.legend(["y","$p_i$","$\hat{y}(\hat{p_i})$"])
<matplotlib.legend.Legend at 0x1f268e11e50>
loss_fn = torch.nn.BCELoss()
"""
def BCE_Loss(yhat,y):
return torch.mean(y * torch.log(yhat) + (1-y) * torch.log(1-yhat))
"""
'\ndef BCE_Loss(yhat,y):\n return torch.mean(y * torch.log(yhat) + (1-y) * torch.log(1-yhat))\n'
#custom sigmoid + torch.BCELoss 쓰면 오류 발생. 0과 1사이의 범위 아님
#torch.nn.Sigmoid + custom BCE Loss 써도 오류발생 => nan
plt.subplots(2,5,figsize=(20,8))
plt.subplots_adjust(hspace=0.3)
i=1
for epoch in range(200):
#1 yhat
yhat = sig(X@What)
#2 loss
loss = loss_fn(yhat,y)
if epoch % 20 == 0:
plt.subplot(2,5,i)
#plt.plot(X[:,1].data,y,"bo",alpha=0.3)
plt.plot(X[:,1].data,p_i,"r")
plt.plot(X[:,1].data,yhat.data,"g")
plt.xlabel("x")
plt.ylabel("y")
#plt.title("realizations $y_1,\dots,y_{60}$ from $Bern(p_1),\dots,Bern(p_{60})$")
plt.legend(["p","yhat"])
title = "loss : {}".format(round(loss.tolist(),5))
plt.title(title)
i+=1
#3 derivative
loss.backward()
#4 update & clean
What.data = What.data - 0.00005 * What.grad
What.grad = None
정리
- 로지스틱회귀는 종속변수 Y가 1과0을 가지는 이진분류 문제일때 사용하는 모형입니다.
- 각각의 관측치에서 y의 값은
가 조건이며 모수가 인 베르누이분포를 따르는 확률변수 의 realization이라고 가정합니다. - 가정에 의해서 베르누이 분포의 모수
더 전개하여 또다른 모수 만 적절하게 추정하면 임의의 데이터가 어떤 클래스에 속하는지 분류할 수 있습니다. 로지스틱회귀는 모수 를 적절하게 추정치 을 출력하는 것을 목적으로 합니다. - MLE로 모수 W를 추정할 수 있습니다. 이때 가능도(또는 로그가능도) 함수의 최댓값에 대한 닫힌형태의 해가 존재하지 않습니다.따라서 경사하강법을 통하여 해를 구합니다.
- 경사하강법의 Loss function은 NLL이며 이진분류의 CrossEntropy와 같습니다.
Appendix
1.베르누이 분포 전개
2.NLL전개(with parameter )
3.NLL전개(Cross Entropy 유도하기)
임의의 i번째 항에서의 확률변수참고링크
1. 로지스틱 회귀 전개
2. 위키피디아 - 로지스틱 회귀
3. ratsgo’s blog