Logistic Regression · 학습
이번에 배울 내용
확률을 계산하는 모델과 최종 경보를 내리는 기준을 구분해야, 놓침과 오경보의 비용을 조절할 수 있습니다.
전체 흐름
Logit → Sigmoid 확률 → Threshold → 놓침·오경보
점수·확률·판정
Logit z를 Sigmoid에 넣으면 p=1/(1+exp(−z))입니다. 확률과 최종 판정은 다릅니다. Threshold를 낮추면 더 많은 양성 예측을 얻지만 오경보도 늘 수 있습니다.
Loss Function에 넣는 값
BCEWithLogitsLoss에는 Sigmoid를 거치기 전의 Logit을 넣습니다. 학습에서 사용하는 Loss와 현장에서 사용하는 놓침·오경보 비용을 구분해 평가합니다.
Positive는 Class 1입니다. TP는 실제 1·예측 1, FN은 실제 1·예측 0, FP는 실제 0·예측 1, TN은 실제 0·예측 0인 표본 수입니다.
- : 전체 표본 중 맞힌 비율.
- : 1로 예측한 표본 중 실제 1의 비율.
- : 실제 1인 표본 중 1로 찾은 비율.
분모가 0인 경우에는 사용한 표시 규칙을 결과와 함께 적습니다.
풀이 예제
입력은 제공한 12×2 합성 특징이며, 두 특징 합이 1을 넘는 표본이 Class 1입니다.
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn
X=torch.tensor([[-2.,-1.],[-1.,-2.],[-1.,0.],[0.,-1.],[1.,1.],[1.,2.],[2.,1.],[2.,2.],[-2.,1.],[1.,-2.],[0.,2.],[2.,0.]])
y=(X.sum(dim=1)>1).float().reshape(-1,1)
def fit_binary(weights=None):
torch.manual_seed(7);m=nn.Linear(2,1);opt=torch.optim.SGD(m.parameters(),lr=.1);history=[]
for _ in range(200):
losses=nn.functional.binary_cross_entropy_with_logits(m(X),y,reduction='none')
loss=(losses if weights is None else losses*weights).mean()
opt.zero_grad();loss.backward();opt.step();history.append(loss.item())
return m,history
model,history=fit_binary();prob=torch.sigmoid(model(X)).detach().reshape(-1).numpy();truth=y.numpy().reshape(-1).astype(int)
print(prob)
[0.00286324 0.00291552 0.09087328 0.09238355 0.95395184 0.9918115 0.99195766 0.99861526 0.08938526 0.09391632 0.95314825 0.9547425 ]