로지스틱 회귀(Logistic Regression)
요약
로지스틱 회귀는 이진 분류 문제에 사용되는 알고리즘으로, 선형 회귀가 예측할 수 없는 범주(0 또는 1)의 확률을 S자 모양의 Sigmoid 곡선으로 압축하여 출력합니다. 이는 합격/불합격과 같은 확률적 판단을 내리는 데 적합하며, 학습 과정은 가중치 초기화, BCE Loss 계산, 경사 하강법을 통해 이루어집니다.
핵심 포인트
- 로지스틱 회귀는 이진 분류에 사용되며, 출력을 0과 1 사이의 확률로 변환합니다.
- Sigmoid 함수를 사용하여 선형 점수를 확률(p)로 압축하는 것이 핵심입니다.
- 학습 과정은 Binary Cross-Entropy Loss와 경사 하강법을 통해 가중치를 업데이트합니다.
머신러닝 여정을 시작할 때 가장 먼저 배우는 알고리즘은 보통 선형 회귀(Linear Regression)입니다. 선형 회귀는 다음 방정식을 사용하여 직선을 그립니다:
y=mx+c
이 직선은 주택 가격이나 학생 점수처럼 연속적인 숫자를 예측하는 데 놀랍습니다. 하지만 만약 범주를 예측하고 싶다면 어떻게 될까요? 예를 들어, 시험 점수를 기반으로 한 학생이 합격(1)했는지 불합격(0)했는지를 예측하는 경우입니다.
만약 이진 데이터(0과 1)에 직선을 맞추려고 하면, 그 선은 계속해서 무한히 이어집니다. 결국 1.5나 -0.4와 같이 불가능한 값을 예측하게 됩니다. 직선이 이산적인 선택지를 분류하는 데 실패하기 때문에 로지스틱 회귀(Logistic Regression)가 도입되었습니다.
역사적 참고: 로지스틱 회귀의 수학적 기초는 통계학자 David Cox가 1958년에 이진 데이터셋을 분석하기 위해 대중화시켰으며, 이는 원래 Pierre François Verhulst가 1838년에 공식화한 '로지스틱 곡선'을 개체군 성장을 모델링하는 데 적용한 것입니다.
직선을 그리는 대신, 로지스틱 회귀는 출력을 S자 모양의 곡선으로 압축하여 0과 1 사이를 엄격하게 유지합니다. 이를 통해 알고리즘은 깨끗한 확률(예: 합격할 확률 85%)을 출력할 수 있습니다.
로지스틱 회귀 단계 (학습 루프)
컴퓨터가 어떻게 학습하는지 알아보기 위해, 두 개의 입력값(CGPA와 IQ)으로 이진 출력(합격: 1, 불합격: 0)을 예측하는 작은 데이터셋을 추적해 보겠습니다.
| 학생 | CGPA (X₁ ) | IQ ( X₂ ) | 실제 합격 여부 ( Y ) |
|---|---|---|---|
| 학생 1 | 8.0 | 110 | 1 |
| 학생 2 | 5.0 | 90 | 0 |
단계 1: 가중치와 편향 초기화
만약 우리가 n개의 특성(feature)을 가지고 있다면, 우리는 n개의 가중치에 더해 1개의 추가 절편 항(bias 또는 β₀라고 불림)이 필요합니다. 우리의 2개 특성의 경우, 2+1=3개의 가중치가 필요합니다. 컴퓨터는 이들을 모두 0으로 설정하며 시작합니다:
import numpy as np
# n = 특성(feature)의 개수 (CGPA, IQ)
...
단계 2: 예측 수행 및 손실 계산
모델은 현재 가중치(weights)를 사용하여 각 학생에 대한 원시 선형 점수($z$)를 계산합니다:
$z$=bias + ($w_1 imes CGPA$) + ($w_2 imes IQ$)
모든 가중치가 현재 0이므로, 학생 1의 점수는 $z=0$입니다. 이 $z$ 값을 Sigmoid 함수에 넣어 확률($p$)로 변환합니다:
$p$=$rac{1}{1+e^{-z}}$=$rac{1}{2}$ (50%)
이제 Binary Cross-Entropy (BCE) Loss를 사용하여 우리의 추측이 얼마나 나빴는지 확인합니다. 단일 행에 대한 공식은 다음과 같습니다:
$Loss$=−[Y imes log(p) + (1−Y) imes log(1−p)]$$
For Student 1 (
Y=1, p=0.5
...
3단계: 경사 하강법(Gradient Descent)을 사용하여 가중치 업데이트하기
이 오류를 낮추기 위해, 우리는 각 매개변수에 대한 손실의 미분값(gradient)을 계산합니다. 수학은 아름답게 다음으로 단순화됩니다:
$Gradient$=예측 확률 - 실제 결과
학생 1을 살펴보겠습니다 (예측 $p=0.5$, 실제 Y=1):
$Error$=0.5 - 1 = -0.5$
우리는 이 오류에 학생의 특성 값과 학습률(Learning Rate, $ ext{lr}=0.1$)을 곱하여 가중치 업데이트를 계산합니다. 손실을 감소시키고 싶기 때문에, 우리는 그래디언트를 빼줍니다:
$New ext{ Parameter} = Old ext{ Parameter} - ( ext{lr} imes ext{Gradient})$$
4단계: 학습 루프 실행하기
컴퓨터는 2단계와 3단계를 수천 번 반복합니다. 시간이 지남에 따라 손실은 0.693에서 0을 향해 떨어집니다. 훈련 후 최적화된 매개변수가 다음과 같다고 가정해 봅시다:
bias=-15
...
학생 1 (CGPA=8.0, IQ=110)에 대한 계산을 확인해 보겠습니다:
Find
z
...
쉽게 설명하는 중요한 개념들
1. Sigmoid 함수
Sigmoid 함수는 임의의 실수(음의 무한대부터 양의 무한대까지)를 0과 1 사이의 깔끔한 범위로 압축하는 수학적 마법사입니다.
수학 공식:
$ ext{σ}(z)=rac{1}{1+e^{-z}}$
곡선 그래프 읽는 법:
If
z
...
2. Logit 함수 (Odds의 로그)
사람들이
- Binary Cross-Entropy (BCE) 대 Categorical Cross-Entropy (CCE)
이들은 오류를 측정하는 데 사용되는 공식입니다.
BCE (Binary): 선택지가 오직 두 가지(0 또는 1)일 때 사용합니다. 단 하나의 정답 클래스 확률만을 확인합니다.
CCE (Categorical): 여러 선택지(예: 이미지가 고양이인지, 개인지, 새인지 예측하는 경우)가 있을 때 사용합니다. 여러 카테고리 클래스의 분포 전반에 걸쳐 오류를 측정합니다.
- Softmax 함수
Sigmoid가 이진 항목을 처리하는 반면, Softmax는 Sigmoid의 다중 클래스 버전입니다. 만약 고양이, 개, 새 중에서 선택한다면, Softmax는 모든 출력 채널을 동시에 처리하며 그들의 독립적인 확률들이 정확히 1.0(100%)을 더하도록 보장합니다.
Softmax($z_i$)=\frac{e^{z_{ij}}}{\sum e^{z_{ej}}}$
완벽하게 작동하는 코드 (From Scratch)
이 전체 수학적 루프를 numpy를 사용하여 순수 Python으로 작성하는 방법은 다음과 같습니다:
import numpy as np
class CleanLogisticRegression:
...
Scikit-Learn에서 사용하기
산업 환경에서는 코드를 처음부터 작성할 필요가 없습니다. Python의 내장 scikit-learn 프레임워크를 사용할 수 있습니다:
from sklearn.linear_model import LogisticRegression
# 1. 선택한 하이퍼파라미터로 모델 초기화
...
핵심 하이퍼파라미터 설명:
penalty: 'l1' 또는 'l2'로 설정할 수 있습니다. 손실 함수에 수학적 페널티 점수를 추가하여 개별 가중치가 너무 커지는 것을 방지함으로써 모델을 안정적으로 유지하고 과적합(overfitting)을 예방합니다.
C: 정규화 강도의 역수입니다. C를 매우 작은 숫자(예: 0.01)로 설정하면, 모델에게
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기