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(4, 1) |
# 시그모이드 함수를 적용해서 두 클래스의 분류를 위한 크로스 엔트로피를 계산 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으로 한다. 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) |
![]() |
'인공지능 > 파이토치' 카테고리의 다른 글
파이토치 - Dataset과 DataLoader (0) | 2020.07.20 |
---|---|
파이토치 - MLP 구축과 학습 (0) | 2020.07.20 |
파이토치 - 선형 회귀 모델 (0) | 2020.07.20 |
파이토치 - 텐서 / 자동 미분 (0) | 2020.07.18 |
파이토치 무작정 시작하기 6 - 모델 변수 프리징 (0) | 2020.07.17 |