일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- bitmask
- db
- 카카오엔터프라이즈
- 구름
- jsonwebtoken
- 완전탐색
- dockercompose
- BFS
- DP
- 동전 퍼즐
- objectstorage
- 백엔드 개발
- bfs
- 카카오클라우드
- s3
- 알고리즘
- 정렬
- DFS
- CODETREE
- 인가인증
- java
- 코드트리
- es_java_home
- softeer
- On-Premise
- sonarqube
- MESSAGEBROKER
- 자바
- 소프티어
- 함수 종속성
- Today
- Total
wooing
로지스틱 회귀(Logistic Regression) 본문
로지스틱 회귀란?
두가지 선택지 중 정답을 고르는 문제를 이진 분류(Binray Classification)이라고 한다. 이진 분류 문제를 풀기 위한 대표적인 알고리즘이 로지스틱 회귀(Logistic Regression)이다.
이진 분류(Binary Classification)
왼쪽의 표와 같은 데이터셋이 있을때 오른쪽과 같이 그래프로 나타낼 수 있다. 로지스틱 회귀는 오른쪽의 그래프와 가장 유사한 S자 모양의 그래프를 만드는 모델이다.
S자 모양을 그리는 함수를 찾는 이유로는 함수의 특징을 보면 알 수 있다.
- 성공과 실패를 구분하는 부분만 경사가 급하고 나머지는 경사가 완만하기 때문이다.
S자 모양의 그래프를 그리는것 중 가장 널리 알려져 있는 시그모이드 함수(Sigmoid function)를 사용한다.
시그모이드 함수(Sigmoid function)
시그모이드 함수는 S자 모양의 시그모이드 곡선을 갖는 함수를 말한다. 시그모이드의 함수의 예시로는 로지스틱 함수가 있다.
임의의 W와 b에 대한 로지스틱 함수를 아래와 같이 표현할 수 있다.
Wx + b는 선형회귀 가설에서 가져온 식임.
시그모이드 함수는 입력값이 커지면 1에 수렴하고 입력값이 작아지면 0에 수렴한다. 이 특성을 분류하여 임계값을 정해 이보다 클 경우 True, 작을경우 False로 판단할 수 있다.
위의 그래프 각각 빨간선은 값이 감소했을때 파란선은 증가했을때를 보여준다.
비용 함수(Cost function)
로지스틱 함수를 통해 H(x) = sigmoid(Wx + b)인것을 알아 냈다. 최적의 W와 b를 찾기 위한 비용 함수를 정의해야한다. 앞서 포스팅한 선형 회귀에서 사용되었던 평균 제곱오차를 그대로 사용하면 끝난다고 생각할 수 있을것이다. 하지만 평균 제곱 오차수식을 그대로 사용하면 아래의 왼쪽 그림과 같이 나오는것이 아닌 오른쪽과 같은 형태의 그래프가 나온다.
위와 같은 그래프에서 경사 하강법을 사용할 경우 기울기가 0이 되는 지점이 글로벌 미니멈 지점이 아니라 로컬 미니멈 지점이 될 수 있다. 그렇기때문에 다른 비용 함수를 사용해야 한다.
시그모이드 함수의 특징은 함수의 출력값이 0과 1 사이라는것 이다. 실제값이 1일때 예측값이 0에 가까워지면 오차가 커져야 하고 반대로 실제값이 0일떄 예측값이 1에 가까워지면 오차가 커져야 한다. 이를 그래프로 나타내면 아래와 같이 나타낼 수 있고 이를 충족하는 함수로 로그 함수를 사용할 수 있다.
실제값이 1일때는 주황색선, 0일때는 녹색선으로 표현하였다. 이 두 그래프를 식으로 나타내면 아래와 같이 표현할 수 있다.
이 두 식을 통합하면 다음과 같게 되는데, y가 0일때는 덧셈을 기준으로 좌항이 사라지고 1일때는 덧셈을 기준으로 우항이 사라지기 때문이다.
위의 통합한 식을 평균을 구하면 아래와 같이 표현할 수 있다.
위에서 구한 비용 함수에 대해 경사 하강법을 수행하면 최적의 가중치인 W를 찾을 수 있다. 이를 로지스틱 회귀라고 한다.
다중 로지스틱 회귀 코드
#다중 로지스틱 회귀
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
#2개의 x값에 대한 결과값 y
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0], [0], [0], [1], [1], [1]]
x_train = torch.FloatTensor(x_data)
y_train = torch.FloatTensor(y_data)
#훈련데이터셋 크기 출력
print(x_train.shape)
print(y_train.shape)
W = torch.zeros((2, 1), requires_grad=True) # 크기는 2 x 1
b = torch.zeros(1, requires_grad=True)
optimizer = optim.SGD([W, b], lr=1)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
#가설 선언
hypothesis = 1 / (1 + torch.exp(-(x_train.matmul(W) + b)))
#cost 계산
cost = -(y_train * torch.log(hypothesis) +
(1 - y_train) * torch.log(1 - hypothesis)).mean()
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
#학습 결과 출력
hypothesis = torch.sigmoid(x_train.matmul(W) + b)
predictions = hypothesis >= torch.FloatTensor([0.5])
print(predictions)
References:
https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B7%B8%EB%AA%A8%EC%9D%B4%EB%93%9C_%ED%95%A8%EC%88%98
'인공지능 > 머신러닝' 카테고리의 다른 글
과적합, 기울기 소실, 기울기 폭주 (1) | 2023.01.30 |
---|---|
퍼셉트론(Perceptron) (0) | 2023.01.29 |
소프트맥스 회귀(Softmax Regression) (0) | 2023.01.20 |
정수 인코딩, 원-핫 인코딩(Integer Encoding, One-hot Encoding) (0) | 2023.01.19 |
선형 회귀(Linear Regression) (0) | 2022.10.25 |