Python(Colab) 파이토치(Pytorch) + 논리 회귀

2023. 6. 20. 22:12파이썬/머신러닝 및 딥러닝

✔️논리 회귀

- 주로 분류할 때 사용한다.
- 선형 회귀 공식으로부터 나와서 논리회귀라는 이름을 사용한다.

출처: https://i.imgur.com/nE29yVL.png
출처:https://i.imgur.com/6NsfKMa.png

✔️ 1번 그림을 보게 되면 직선으로 한 선형 회귀이다. 
✔️ 2번 그림은 곡선으로 회귀를 진행한다.

>> Sigmoid함수를 사용하여 곡선화시켜 정확도를 높인다.

✔️ Sigmoid함수란?

- 예측값이 0 ~ 1사이의 값이 되도록 만들어준다.
- 0 ~ 1 사이의 연속된 값을 출력함으로 보통 0.5로 구분한다.

- 계단함수(퍼셉트론)은 무조건 0 or 1을 반환하지만 시그모이드는 0~1이기떄문에 
>> 퍼셉트론: A는 1이고, B는 0이야 이렇게 확답을한다면, 시그모이드는 A가 아마도 1일거야 라는 느낌

단점)
vanishing gradient: 입력값이 아무리 커도, 미분 값의 범위로 제한되어 있어, 층이 쌓일수록 gradient값이 0에 수렴

 

1번 사진 따라해보기

 

1. 데이터 셋 설정 및 시각화

import torch
import torch.nn as nn
import torch.optim as optim

torch.manual_seed(10)


import matplotlib.pyplot as plt
 
x_train = torch.FloatTensor([[0],[1],[3],[5],[9],[11],[15],[20]]) #시간
y_train = torch.FloatTensor([[0],[0],[0],[0],[0],[1],[1],[1]]) #11시간 공부하면 시험에 붙었다라는
 
plt.figure(figsize=(4,3))
plt.scatter(x_train,y_train)

 

2. 시그모이드 함수를 사용한 모델 만들기

# 위에 가설을 검증

model=nn.Sequential(
    nn.Linear(1,1),
    nn.Sigmoid() 
)
 
print(model)
 
torch.nn.Sequential(): 모듈들을 인수로 받아 하나의 모델처럼 돌아가게 하는 것
✔️논리 회귀에서는 nn.BCELoss()를 사용하여 Loss를 계산한다. (Binary Cross Entropy) 

✔️Binary Cross Entropy : 모델 구조상 마지막 Layer가 Sigmoid 혹은 Softmax로 되어 있는 경우 사용 
y_pred = model(x_train)
y_pred
loss = nn.BCELoss()(y_pred,y_train)
loss

 

 

4. 확률적 경사하강법 셋팅 후 학습

optimizer = optim.SGD(model.parameters(),lr=0.01)
 
epochs =1000

for epoch in range(epochs+1):
    y_pred = model(x_train)
    loss = nn.MSELoss()(y_pred,y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0:
        print(f'Epoch{epoch}/{epochs} // Loss{loss:.6f}')
해석

1. 1000번 반복할 예정
2. loss = nn.MSELoss()(y_pred,y_train)으로 예측값과 결과값의 차이의 제곱을 구한다.
3. 역전파 단계
4. optimizer.zero_grad()으로 매번 기울기를 0으로 초기화 (만약 하지 않으면 다른 방향을 가르킬수 있다.)
5. loss.backward()로 모델의 기울기를 계산한다. 
6. optimizer.step()로 파라미터를 업데이트 한다.

7. 반복이 100회 돌때마다 손실율을 출력한다.

 

 

5. 테스트데이터 입력 후 결과값 확인

 

x_test = torch.FloatTensor([[2.5],[15.5]])

y_pred = model(x_test)
y_pred
 

1일 확률이 더 높다

728x90