쉽게 이해하는 로지스틱 회귀분석


1. 로지스틱 회귀 분석이란?

우리가 데이터를 분석할 때 푸는 문제는 크게 두 가지로 나눌 수 있다. 하나는 ‘공부한 시간에 따라 시험 점수가 몇 점일까?’처럼 연속적인 값을 예측하는 문제이고, 다른 하나는 ‘공부한 시간에 따라 시험에 합격할까, 불합격할까?’처럼 정해진 몇 개의 답 중 하나를 맞추는 문제다.​

첫 번째 문제처럼 값을 예측하는 것은 ‘회귀(Regression)’의 영역이다. ‘선형 회귀’ 같은 알고리즘을 사용하면, 공부 시간이 늘어날수록 점수가 어떻게 변하는지 직선으로 그려 예측할 수 있다.

하지만 두 번째 문제, 즉 합격/불합격, Yes/No, A/B와 같이 카테고리를 맞추는 ‘분류(Classification)’ 문제에 선형 회귀를 그대로 적용하면 곤란한 상황이 생긴다. 시험 합격 확률을 예측했는데 120%가 나오거나, 불합격 확률이 -20%가 나오는 식이다. 확률은 0%(0)과 100%(1) 사이의 값이어야 하는데, 선형 회귀의 예측 결과는 그 범위를 훌쩍 벗어나 버린다.​

바로 이 지점에서 로지스틱 회귀분석(Logistic Regression)이 등장한다. 로지스틱 회귀는 이름과 달리 ‘분류’를 위한 핵심 알고리즘으로, 선형 회귀의 예측 결과를 0과 1 사이의 ‘확률’ 값으로 변환해준다. 즉, “이 학생이 합격할 확률은 85%다”와 같이 명확하고 상식적인 답을 제시하는 유용한 모델이다. 이 글에서는 로지스틱 회귀가 어떻게 이런 문제를 해결하는지 그 원리를 차근차근 알아볼 예정이다.​


2. 시그모이드(Sigmoid) 함수

앞서 우리는 일반적인 선형 회귀가 분류 문제에 적합하지 않다는 것을 확인했다. 예측값이 0에서 1 사이의 범위를 벗어나 ‘확률’로 해석하기 어렵기 때문이다. 그렇다면 이 문제를 어떻게 해결할 수 있을까?

문제점: 일반 회귀의 예측값을 어떻게 ‘확률’로 바꿀까?

선형 회귀가 예측한 값은 음의 무한대부터 양의 무한대까지 어떤 숫자든 될 수 있다. 우리에게 필요한 것은 이 예측 결과를 0과 1 사이의 값으로 눌러주는 방법이다.

이 역할을 하는것이 바로 시그모이드(Sigmoid) 함수다. ‘시그모이드’라는 이름은 ‘S자 모양’을 의미하며, 딱 이름처럼 그래프가 S자 곡선을 그린다.​

시그모이드 함수의 수학적 정의는 다음과 같다.

$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$

  • e는 자연상수로, 약 2.718의 값을 갖는 무리수다.

이 함수의 가장 큰 특징은 입력값 z가 아무리 크거나 작아도 출력값은 항상 0과 1 사이라는 점이다.​

  • z가 아주 큰 양수(∞)가 되면, e-z는 0에 가까워져 함수 값은 1에 수렴한다.
  • z가 아주 작은 음수(-∞)가 되면, e-z는 무한대로 커져 함수 값은 0에 수렴한다.
  • z가 0일 때는 정확히 0.5의 값을 갖는다.​

어떤 값이든 0과 1 사이로 변환 시켜주기 때문에, 로지스틱 회귀는 선형 회귀의 예측값을 바로 사용하는 대신, 그 값을 시그모이드 함수에 한 번 통과시켜 최종 확률을 계산하는 것이다.


3. 로지스틱 회귀 원리

복잡해 보이지만, 하나씩 뜯어보면 ‘선형 회귀’와 ‘시그모이드 함수’ 두 가지를 조합한 것과 같다.

Step 1: 선형 회귀에서 시작

모든 것은 선형 회귀 공식에서 시작한다. 입력 데이터(X)가 주어졌을 때, 가중치(W)와 편향(b)을 이용해 어떤 결과(z)를 계산한다.

$$ z = W^T X + b $$

여기서 계산된 z는 아직 확률이 아니다. 그냥 어떤 실수 값일 뿐이다. 예를 들어 ‘공부 시간'(X)을 넣었을 때, z는 2.5가 될 수도, -10이 될 수도 있다.

Step 2: 시그모이드에 결합

1단계에서 계산된 z 값을 앞서 배운 시그모이드 함수의 입력으로 그대로 넣어준다.​

$$ P = \sigma(z) = \frac{1}{1 + e^{-z}} $$

z 자리에 WT X + b를 대입하면 최종 공식은 다음과 같다.

$$ P = \sigma(W^T X + b) = \frac{1}{1 + e^{-(W^T X + b)}} $$

이제 최종 결과 P는 무슨 일이 있어도 0과 1 사이의 값을 갖게 된다. 이것이 우리가 원하던 ‘확률’이다.

Step 3: 확률 해석하기

0과 1 사이의 값을 얻었으니, 이것을 확률로 해석할 수 있다. 일반적으로 이 값은 긍정 클래스(Y=1)일 확률을 의미한다.​

  • 결과가 1(긍정)일 확률: $$ P(Y=1|X) = \sigma(W^T X + b) $$ 이 수식은 “입력 데이터 X가 주어졌을 때, 결과가 1일 조건부 확률”이라고 읽는다.
  • 결과가 0(부정)일 확률: 당연하게도, 결과가 0일 확률은 전체 확률 1에서 결과가 1일 확률을 뺀 값이다. $$ P(Y=0|X) = 1 – P(Y=1|X) $$

혹시 몰라 적어 주는거지만 | (세로 막대) 기호는 “조건부 확률(conditional probability)”을 나타내는 조건 기호다.

수학적으로 P(Y=1 | X) 는 이렇게 읽는다

“X가 주어졌을 때 Y=1일 확률” 또는 “X를 알고 있을 때, Y가 1일 조건부 확률”

이처럼 로지스틱 회귀는 (1) 일단 선형 회귀처럼 계산하고, (2) 그 결과를 시그모이드 함수에 통과시켜, (3) 최종적으로 나온 값을 확률로 해석하는 간단한 원리로 동작한다.


4. 왜 ‘회귀’라고 불릴까?

지금까지의 설명을 보면 한 가지 근본적인 의문이 생기는 사람이 있을지도 모른다. 로지스틱 회귀는 합격/불합격, Yes/No 등을 맞추는 ‘분류(Classification)’ 문제를 푸는 알고리즘인데, 왜 이름은 ‘회귀(Regression)’일까? 이를 위해서는 오즈비(Odds Ratio)로짓 변환(Logit Transformation)이라는 두 가지 개념을 알아야 한다.​

오즈비(Odds Ratio)란 (실패 확률 대비 성공 확률)

오즈(Odds)는 일상에서도 종종 사용되는 개념이다. “성공 확률이 80%”라고 말하는 대신 “실패할 확률보다 성공할 확률이 4배 높아”라고 표현하는 방식이다. 즉, 실패 확률에 대한 성공 확률의 비율을 의미한다.

$$ \text{Odds} = \frac{\text{성공 확률}}{\text{실패 확률}} $$

우리는 3장에서 성공 확률과 실패 확률을 이미 구했다.

  • 성공 확률: $$ P(Y=1|X) = \frac{e^{W^T X + b}}{1 + e^{W^T X + b}} $$
  • 실패 확률: $$ P(Y=0|X) = \frac{1}{1 + e^{W^T X + b}} $$

이 두 식을 오즈 공식에 대입하면?

$$ \text{Odds} = \frac{P(Y=1|X)}{P(Y=0|X)} = \frac{\frac{e^{W^T X + b}}{1 + e^{W^T X + b}}}{\frac{1}{1 + e^{W^T X + b}}} $$

분모의 $ (1 + e^{W^T X + b}) $ 항이 서로 약분되면서, 믿을 수 없을 만큼 간단한 형태로 정리된다.

$$ \text{Odds} = e^{W^T X + b} $$

로짓 변환(Logit Transformation)

이제 우리는 오즈가 $ e $의 지수 함수 형태라는 것을 알게 되었다. 아직 선형 회귀의 최종 목표인 $ W^T X + b $ 형태는 아니다. 여기서 추가적인게 필요하다. 바로 지수 함수를 없애기 위해 양변에 자연로그(ln)를 취하는 것이다. 이를 로짓 변환이라고 한다.

$$ \ln(\text{Odds}) = \ln(e^{W^T X + b}) $$

자연로그 $ \ln $과 자연상수 $ e $는 서로 역함수 관계이므로, 함께 사라지면서 지수만 남게 된다.

$$ \ln(\text{Odds}) = W^T X + b $$

드디어 우리가 맨 처음 봤던 일반적인 선형 회귀 모델의 형태가 나타났다. 이것이 바로 로지스틱 회귀의 정체다.

결론적으로 로지스틱 회귀는, 어떤 사건의 로그-오즈(Log-Odds)가 입력 변수 X선형적인 관계를 맺고 있다고 가정하는 모델이다. 여기서 ‘로그-오즈’를 다른 말로 ‘로짓(Logit)’이라고 부른다.​

즉, ‘로짓’이라는 변환된 값에 대해 ‘선형 회귀’를 수행하는 모델이기 때문에 ‘로지스틱 회귀’라는 이름이 붙은 것이다. 분류 문제를 풀지만, 그 근본 원리는 회귀에 맞닿아 있는 셈이다.


5. 예제로 이해하기

지금까지 배운 이론은 실제 문제를 풀 때 어떻게 적용될까? “하루 카페인 섭취량에 따른 오후 근무 중 졸음 여부”를 예측하는 간단한 예제를 통해 로지스틱 회귀의 작동 방식을 구체적으로 살펴보자.

문제 설정

어느 IT 회사의 직원들을 대상으로 데이터를 수집했다고 가정하자.

  • 입력 (X): 하루 동안 마신 커피의 잔 수 (0잔, 1잔, 2잔, …)
  • 출력 (Y): 오후 3시에 졸았는가? (졸았다=1, 안 졸았다=0)

우리의 목표는 새로운 직원이 들어왔을 때, 그 사람이 마신 커피 잔 수를 보고 오후에 졸지 안 졸지를 예측하는 모델을 만드는 것이다.

모델의 예측 과정 (계산)

로지스틱 회귀 모델이 학습을 통해 최적의 가중치(W)와 편향(b)을 찾았다고 가정하자. 예를 들어, 다음과 같은 값이 정해졌다고 해보자.

  • W = -1.5 (커피를 많이 마실수록 졸음 확률이 낮아지므로 음수 값)
  • b = 2.0 (커피를 안 마셔도 기본적으로 버티는 힘)

이제 한 직원이 커피를 2잔 마셨을 때, 이 사람이 졸 확률을 계산해 보자.

1. 선형 계산 (z 구하기)
먼저 선형 회귀처럼 계산한다.
$$ z = W^T X + b = (-1.5 \times 2) + 2.0 = -3.0 + 2.0 = -1.0 $$

2. 시그모이드 통과 (확률 P 구하기)
계산된 z 값 -1.0을 시그모이드 함수에 넣는다.
$$ P(\text{졸음}=1 | \text{커피}=2) = \sigma(-1.0) = \frac{1}{1 + e^{-(-1.0)}} = \frac{1}{1 + e^{1}} \approx \frac{1}{1 + 2.718} \approx 0.269 $$

3. 결과 해석
계산된 확률은 약 0.269, 즉 26.9%다.

일반적으로 분류 모델은 **결정 경계(Threshold)**를 0.5(50%)로 설정한다. 예측된 확률이 0.5보다 크면 1(긍정)로, 작으면 0(부정)으로 최종 판단을 내린다.

  • 판단: 26.9%는 50%보다 작으므로, 모델은 “이 직원은 오후에 졸지 않을 것이다(0)”라고 예측한다.

전체 파이썬 코드

위의 계산 과정을 파이썬 코드로 그대로 구현하면 다음과 같다.

import numpy as np

# 시그모이드 함수 정의
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 학습된 가중치(W)와 편향(b)
W = -1.5
b = 2.0

# 예측 함수 정의
def predict(X):
    # 1. 선형 계산
    z = W * X + b
    # 2. 시그모이드 통과하여 확률 계산
    prob = sigmoid(z)
    
    print(f"입력 (커피 {X}잔):")
    print(f"  - 선형 결과(z): {z:.4f}")
    print(f"  - 졸음 확률(P): {prob:.4f} ({prob*100:.1f}%)")
    
    # 3. 결정 경계(0.5)를 기준으로 최종 판단
    if prob > 0.5:
        print("  - 최종 예측: 졸음 (1)")
    else:
        print("  - 최종 예측: 안 졸음 (0)")
    print("-" * 20)

# --- 예제 실행 ---

# 예제 1: 커피를 2잔 마셨을 경우
predict(X=2)

# 예제 2: 커피를 한 잔도 마시지 않았을 경우
predict(X=0)
직접 돌린 결과

text입력 (커피 2잔):
- 선형 결과(z): -1.0000
- 졸음 확률(P): 0.2689 (26.9%)
- 최종 예측: 안 졸음 (0)
--------------------
입력 (커피 0잔):
- 선형 결과(z): 2.0000
- 졸음 확률(P): 0.8808 (88.1%)
- 최종 예측: 졸음 (1)
--------------------

코드의 실행 결과가 우리가 직접 계산했던 과정과 정확히 일치하는 것을 볼 수 있다. 이처럼 로지스틱 회귀는 입력 데이터에 따라 결과가 1 또는 0이 될 확률을 계산하고, 그 확률을 기준으로 명확한 분류 결과를 제공한다.

댓글 남기기