인공지능/파이토치

파이토치 - 로지스틱 회귀

해피밀세트 2020. 7. 20. 02:56
반응형

 

 

 

 

1. 파이토치를 사용한 로지스틱 회귀분석

 

1) iris 데이터 준비

 

# 라이브러리와 iris 데이터 불러오기

import torch

from torch import nn, optim

from sklearn.datasets import load_iris

iris = load_iris()

# iris는 (0,1,2)의 세 가지 종류를 분류하는 문제이므로 (0,1)의 두 개의 데이터만 사용한다.
# 원래는 학습용과 테스트용으로 나누어야 하지만 여기선 생략한다.

X = iris.data[:100]

y = iris.target[:100]

# Numpy의 ndarray를 PyTorch의 Tensor로 변환

X = torch.tensor(X, dtype=torch.float32)

y = torch.tensor(y, dtype=torch.float32)

 

 

 

2) 모델 작성

 

# iris 데이터는 4차원

net = nn.Linear(41)

# 시그모이드 함수를 적용해서 두 클래스의 분류를 위한 크로스 엔트로피를 계산

loss_fn = nn.BCEWithLogitsLoss()

# SGD(약간 큰 학습률)

optimizer = optim.SGD(net.parameters(), lr=0.25)

 

 

 

3) 파라미터 최적화를 위한 반복 루프

 

# 손실 함수 로그

losses = []

 

# 100회 반복

for epoc in range(100):

  # 전회의 backward 메서드로 계산된 경사값을 초기화

  optimizer.zero_grad()

 

  # 선형 모델으로 y 예측값을 계산

  y_pred = net(X)

 

  # MSE loss를 사용한 미분 계산

  loss = loss_fn(y_pred.view_as(y), y)

  loss.backward()

 

  # 경사를 갱신한다

  optimizer.step()

 

  # 수렴 확인을 위한 loss를 기록해 둔다

  losses.append(loss.item())

  print(loss.item())

# 로지스틱 회귀가 수렴하는 모습 그래프로 출력

%matplotlib inline

from matplotlib import pyplot as plt

plt.plot(losses)

 

 

 

 

4) 모델 작성

 

# 선형 결합의 결과

h = net(X)

 

# 시그모이드 함수를 적용한 결과는 y=1의 확률을 보여 준다.

prob = nn.functional.sigmoid(h)

# 확률이 0.5이상인 것을 클래스1로 예측하고 그외는 0으로 한다.
# PyTorch에는 Bool형이 없으므로 ByteTensor가 출력된다.

y_pred = prob > 0.5

 

# 예측 결과 확인 (y는 FloatTensor이므로 ByteTensor로 변환한 후에 비교)

(y.byte() == y_pred.view_as(y)).sum().item()

 


 

2. 다중 분류를 위한 로지스틱 회귀 분석

 

1) 손으로 쓴 10개의 숫자 데이터를 분류하는 문제

 

# 라이브러리 및 데이터 불러오기

import torch

from torch import nn, optim

from sklearn.datasets import load_digits

digits = load_digits()

# 독립변수, 종속변수 분리

X = digits.data

y = digits.target

# X, y를 텐서로 변환

X = torch.tensor(X, dtype=torch.float32)

# CrossEntropyLoss 함수는 y로 int64형의 텐서를 받으니 주의하자

y = torch.tensor(y, dtype=torch.int64)

# 출력은 10(분류 수) 차원

net = nn.Linear(X.size()[1], 10)

# 소프트맥스 크로스 엔트로피

loss_fn = nn.CrossEntropyLoss()

# SGD

optimizer = optim.SGD(net.parameters(), lr=0.01)

 

 

 

2) 학습용 반복 처리

 

# 손실 함수 로그

losses = []

 

# 100회 반복

for epoc in range(100):

  # 전회의 backward 메서드로 계산된 경사값을 초기화

  optimizer.zero_grad()

 

  # 선형 모델으로 y 예측값을 계산

  y_pred = net(X)

 

  # MSE loss 미분 계산

  loss = loss_fn(y_pred, y)

  loss.backward()

 

  # 경사를 갱신한다.

  optimizer.step()

 

  # 수렴 확인을 위한 loss를 기록해 둔다.

  losses.append(loss.item())

  print(loss.item())

 

 

 

3) 정답률

 

# torch.max는 집계축을 지정하면 최댓값뿐만 아니라 그 위치도 변환한다.

_, y_pred = torch.max(net(X), 1)

 

# 정답률을 계산한다.

(y_pred == y).sum().item() / len(y)

반응형