Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

덕배의 블로그

로지스틱 회귀, 시그모이드와 비용함수(크로스 엔트로피)에 대해 알고 파이토치로 실습해보자 본문

인공지능

로지스틱 회귀, 시그모이드와 비용함수(크로스 엔트로피)에 대해 알고 파이토치로 실습해보자

김덕배_KDB 2023. 8. 18. 20:50
반응형

로지스틱 회귀

이번 글은 로지스틱 회귀와 시그모이드 함수, 교차 엔트로피(크로스 엔트로피)에 대해서 알아보고 파이토치로 간단하게 실습까지 해보려 한다.

 

예를 들면 어떤 메일을 받았을 때 이게 정상 메일인지 스팸 메일인지 분류하고 싶을 때 둘 중 하나를 결정하는 문제를 이진 분류라고 한다. 

이진 분류를 해결하기 위한 알고리즘이 로지스틱 회귀이다.

 

 

시그모이드 함수

출력 값이 0 아니면 1 그래프는 S자 형태의 그래프가 나오는데 S자 형태로 그래프를 그려주는 시그모이드 함수

- 입력값이 커지면 1에 수렴, 작아지면 0에 수렴

 

시그모이드 방정식
sigmoid 방정식

 

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()

 

시그모이드 함수
sigmoid

 

 

비용함수 ( 크로스 엔트로피)

모델을 훈련하려면 모델이 얼마나 잘 작동하는지 측정할 필요한데 교차 엔트로피가 비용 함수로 사용

크로스 엔트로피 함수는 두 확률 분포 간의 거리를 측정하는 함수

 

  • 실제 클래스 분포와 예측 클래스 분포가 일치할수록 크로스 엔트로피 함수의 값이 작아진다.
  • 실제 클래스 분포와 예측 클래스 분포가 일치하지 않을수록 크로스 엔트로피 함수의 값이 커진다.
  • 크로스 엔트로피 함수를 최소화하는 파라미터를 찾는 것은 실제 클래스 분포와 예측 클래스 분포를 최대한 일치시키는 것

 

 

파이토치 실습

 

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,
        ))

 

이렇게 로지스틱 회귀에 대해서 알아보았다. 다음에는 더 유익한 글로 오도록 하겠다