[딥러닝 기초] Logistic Regression

[딥러닝 기초] Logistic Regression

다음의 책을 공부하며 정리한 내용입니다

로지스틱 회귀란

: 로지스틱 회귀는 이진분류(Binary Classification) 문제의 해결에 사용되는 대표적인 알고리즘.

이름은 ‘회귀‘이지만 ‘분류‘에 쓰인다

이진분류의 모델

점수(x) 결과(y)
45 불합격
50 불합격
55 불합격
60 합격
65 합격
70 합격

위와 같은 데이터가 있다고 하자.

조건은 아래와 같다.

  • 합격 커트라인은 알려져있지 않다
  • 임의의 점수 x의 합격여부를 예측하고 싶다.

이 경우 주어진 데이터에 대해 합격(1), 불합격(0)으로 그래프를 그리면 아래와 같이 표현할 수 있다.

대체 텍스트

위의 간단한 예시를 통해 이진분류의 문제를 풀기위한 x, y의 관계S 형태의 그래프로 나타내야 함을 알 수 있다.

따라서 다음과 같은 결론을 얻을 수 있다.

  1. 로지스틱 회귀의 가설은 선형 회귀 때의 H(x)=Wx+b가 아니다.
  2. 위처럼 S자 모양의 그래프를 만들 수 있는 어떤 특정 함수 f를 추가적으로 사용하여 H(x)=f(Wx+b)의 가설을 사용한다.
  3. 어떤 함수 f는 이미 널리 알려져있다. => 시그모이드 함수

즉, 로지스틱 회귀의 가설이자 이진분류 문제를 풀기위한 함수 f는 Sigmoid function이다

Sigmoid

  • 수식

H(x)=sigmoid(Wx+b)=1+e−(Wx+b)=σ(Wx+b)

  • 가중치(w)의 변화에 따른 Sigmoid 함수

red: w값이 0.5 ~ blue: w값이 2

대체 텍스트

  • 편향(b)의 변화에 따른 Sigmoid 함수

red: b값이 0.5 ~ blue: b값이 2

대체 텍스트

Sigmoid 함수의 특성

  • 시그모이드 함수는 입력값이 한없이 커지면 1에 수렴하고, 입력값이 한없이 작아지면 0에 수렴한다.
  • 시그모이드 함수의 출력은 0~1
  • 위의 특성을 이용하여 분류 작업에 사용.
  • 임계값 x(0 =< x =< 1)를 넘으면 1, 넘지 못하면 0으로 분류

결론

로지스틱 회귀의 가설/모델은 H(x)=sigmoid(Wx+b) 이다.


로지스틱 회귀 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 최종코드
import torch
import torch.nn.functional as F
torch.manual_seed(1)

x_train = torch.FloatTensor([[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]])
y_train = torch.FloatTensor([[0], [0], [0], [1], [1], [1]])

w = torch.zeros([2, 1], requires_grad=True)
b = torch.zeros([1], requires_grad=True)

# hypothesis = 1 / (1 + torch.exp(-(x_train.matmul(w) + b)))
hypothesis = torch.sigmoid(x_train.matmul(w) + b)

optimizer = torch.optim.SGD([w, b], lr=1)

tot_epoch = 1000
for cur_epoch in range(tot_epoch + 1):

y_hat = torch.sigmoid(x_train.matmul(w) + b)

cost = F.binary_cross_entropy(y_hat, y_train)

optimizer.zero_grad()
cost.backward()
optimizer.step()

# 100번마다 로그 출력
if cur_epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(cur_epoch, tot_epoch, cost.item()))

# 제대로 학습됐는지 확인
print(w)
print(b)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[결과]
Epoch 0/1000 Cost: 0.693147
Epoch 100/1000 Cost: 0.134722
Epoch 200/1000 Cost: 0.080643
Epoch 300/1000 Cost: 0.057900
Epoch 400/1000 Cost: 0.045300
Epoch 500/1000 Cost: 0.037261
Epoch 600/1000 Cost: 0.031672
Epoch 700/1000 Cost: 0.027556
Epoch 800/1000 Cost: 0.024394
Epoch 900/1000 Cost: 0.021888
Epoch 1000/1000 Cost: 0.019852
tensor([[3.2530],
[1.5179]], requires_grad=True)
tensor([-14.4819], requires_grad=True)

댓글