덕배의 블로그
로지스틱 회귀, 시그모이드와 비용함수(크로스 엔트로피)에 대해 알고 파이토치로 실습해보자 본문
반응형
로지스틱 회귀
이번 글은 로지스틱 회귀와 시그모이드 함수, 교차 엔트로피(크로스 엔트로피)에 대해서 알아보고 파이토치로 간단하게 실습까지 해보려 한다.
예를 들면 어떤 메일을 받았을 때 이게 정상 메일인지 스팸 메일인지 분류하고 싶을 때 둘 중 하나를 결정하는 문제를 이진 분류라고 한다.
이진 분류를 해결하기 위한 알고리즘이 로지스틱 회귀이다.
시그모이드 함수
출력 값이 0 아니면 1 그래프는 S자 형태의 그래프가 나오는데 S자 형태로 그래프를 그려주는 시그모이드 함수
- 입력값이 커지면 1에 수렴, 작아지면 0에 수렴
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x): # 시그모이드 함수 정의
return 1/(1+np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(0.5*x)
y2 = sigmoid(x)
y3 = sigmoid(2*x)
plt.plot(x, y1, 'r', linestyle='--') # W의 값이 0.5일때, r = 빨간색
plt.plot(x, y2, 'g') # W의 값이 1일때 , g = 초록색
plt.plot(x, y3, 'b', linestyle='--') # W의 값이 2일때, b = 파란색
plt.plot([0,0],[1.0,0.0], ':') # 가운데 점선 추가
plt.title('Sigmoid')
plt.show()
비용함수 ( 크로스 엔트로피)
모델을 훈련하려면 모델이 얼마나 잘 작동하는지 측정할 필요한데 교차 엔트로피가 비용 함수로 사용
크로스 엔트로피 함수는 두 확률 분포 간의 거리를 측정하는 함수
- 실제 클래스 분포와 예측 클래스 분포가 일치할수록 크로스 엔트로피 함수의 값이 작아진다.
- 실제 클래스 분포와 예측 클래스 분포가 일치하지 않을수록 크로스 엔트로피 함수의 값이 커진다.
- 크로스 엔트로피 함수를 최소화하는 파라미터를 찾는 것은 실제 클래스 분포와 예측 클래스 분포를 최대한 일치시키는 것
파이토치 실습
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
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)
model = nn.Sequential(
nn.Linear(2, 1), # input_dim = 2, output_dim = 1
nn.Sigmoid() # 출력은 시그모이드 함수를 거친다
)
model(x_train)
optimizer = optim.SGD(model.parameters(), lr=1)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = model(x_train)
# cost 계산
cost = F.binary_cross_entropy(hypothesis, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 10 == 0:
prediction = hypothesis >= torch.FloatTensor([0.5]) # 예측값이 0.5를 넘으면 True
correct_prediction = prediction.float() == y_train # 실제값과 일치하는 경우만 True
accuracy = correct_prediction.sum().item() / len(correct_prediction)
print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format(
epoch, nb_epochs, cost.item(), accuracy * 100,
))
이렇게 로지스틱 회귀에 대해서 알아보았다. 다음에는 더 유익한 글로 오도록 하겠다
'인공지능' 카테고리의 다른 글
원-핫 인코딩(One-Hot Encoding)에 대해 알아보자 (0) | 2023.08.20 |
---|---|
OAK-D PoE 카메라에서 yolov8 커스텀 해보기 (0) | 2023.08.19 |
Gstreamer가 무엇인지 알아보자 (0) | 2023.08.17 |
NVIDIA Jetson Xavier Nx board에 대해서 알아보자 (0) | 2023.08.16 |
파이토치 nn.Module 라이브러리를 이용한 선형 회귀 (0) | 2023.08.13 |