Logistic Regression이란?
일반화된 선형 모델(Generalized Linear Model)의 한 종류로 독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는 확률 모델을 의미한다.
여러 변수 x의 매트릭스를 본다면 d의 사이즈를 가진 m개의 sample 데이터와 weight매트릭스와의 곱을 sigmoid함수를 통해, 0과 1로 이진 분류하는 모델을 만들어 내는것이다.
이 때에 손실함수는 아래와 같다.
라이브러리: torch, torch.nn, torch.nn.functional, torch.optim
DataSet: 기존처럼 torch.FloatTensor()
을 이용하여 데이터 값을 저장해줌. 만약 데이터가 매우 클 경우, mini-batch를 통해 데이터 셋을 분류해줄 수 있음.
signoid 함수 만들기: torch.exp()
를 활용하여 아래 signoid함수의 exponential계산을 할 수 있도록 하여 직접, 함수를 구현해주거나, 혹은 torch.Sigmoid
함수를 이용해서 식에 바로 지수의 연산값을 대입해줘도 상관없다.
nn.module: nn.module을 상속받아서, linear과 Sigmoid 함수를 클래스 내에 정의 함으로서 객체의 형태로 학습할 수 있도록 함.
손실함수: torch.nn.functional의 F.binary_cross_entropy()
함수를 활용하여 간단하게 Cost function을 계산해줄 수 있음.
prediction: 소수의 값을 1에 가까우면 1의 값으로, 0에 가까우면 0의 값으로 예측할 수 있도록 설정해둠
correct_prediction: 실제 train한 값과 같은지 확인하고, True/False값을 반환. 이 값의 평균값을 통하여, 정확도를 계산해줌.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# For reproducibility
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)
class BinaryClassifier(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(8, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
return self.sigmoid(self.linear(x))
model = BinaryClassifier()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1)
nb_epochs = 100
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()
# 20번마다 로그 출력
if epoch % 10 == 0:
prediction = hypothesis >= torch.FloatTensor([0.5])
correct_prediction = prediction.float() == y_train
accuracy = correct_prediction.sum().item() / len(correct_prediction)
print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format(
epoch, nb_epochs, cost.item(), accuracy * 100,
))