Logistic Regression( 로지스틱 회귀 )

Uomnf97·2021년 5월 3일
0
post-custom-banner

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

profile
사회적 가치를 실현하는 프로그래머
post-custom-banner

0개의 댓글