본문 바로가기
Tutorial/Big Data & ML

로지스틱 회귀: 정의, 선형 회귀와 차이점, 이론적 배경, 모델 구현 예제

by CLJ 2024. 7. 8.

이 글에서는 로지스틱 회귀가 무엇인지와 선형회귀와 차이점, 그리고 이론적인 배경과 모델 구현 예제를 통해 자세히 단계별로 알아보겠습니다. 

 

로지스틱 회귀란?

 

 

로지스틱 회귀는 이진 분류 문제에 주로 사용되는 통계적 모델입니다. 데이터 포인트가 하나의 카테고리 또는 다른 카테고리로 분류될 확률을 예측하는 데 사용됩니다. 이는 출력이 0 또는 1과 같은 이진 값을 가지도록 설계되었습니다. 로지스틱 회귀는 선형 회귀의 확장을 통해 이진 분류 문제를 해결하며, 선형 회귀와 달리 종속 변수의 값을 확률로 제한하는 시그모이드 함수를 사용합니다.

 

로지스틱 회귀는 다양한 이진 분류 문제에서 사용됩니다. 예를 들어, 의료 분야에서는 환자의 특정 증상과 검사 결과를 바탕으로 질병 유무를 예측할 수 있습니다. 금융 분야에서는 대출 신청자의 신용 점수와 재정 정보를 기반으로 대출 상환 가능성을 평가할 수 있습니다. 또한, 마케팅 분야에서는 고객의 구매 이력과 행동 데이터를 분석하여 제품 구매 가능성을 예측할 수 있습니다. 이러한 사례들은 로지스틱 회귀의 실용성과 다양성을 잘 보여줍니다.

 

선형 회귀와의 차이점

 

로지스틱 회귀와 선형 회귀는 모두 독립 변수와 종속 변수 간의 관계를 모델링하지만, 그 목적과 적용 방식에서 차이가 있습니다. 선형 회귀는 종속 변수가 연속적인 값을 가지며 독립 변수와의 선형 관계를 예측합니다. 예를 들어, 주택 가격을 예측할 때 사용됩니다. 반면, 로지스틱 회귀종속 변수가 이진 값을 가지며 독립 변수와의 관계를 통해 특정 사건이 발생할 확률을 예측합니다.

 

또한, 선형 회귀는 예측된 값을 그대로 출력하지만, 로지스틱 회귀는 시그모이드 함수를 사용하여 예측 값을 확률로 변환합니다. 이를 통해 예측 값이 항상 0과 1 사이의 값으로 제한되며, 이진 분류 문제에 적합한 결과를 제공합니다. 비용 함수에서도 차이가 있습니다. 선형 회귀는 평균 제곱 오차(MSE)를 최소화하지만, 로지스틱 회귀는 로그 손실 함수(Log Loss)를 최소화합니다. 이러한 차이점들은 각각의 회귀 모델이 다른 유형의 예측 문제를 해결하는 데 최적화되어 있음을 보여줍니다.

 

로지스틱 회귀의 이론적 배경

 

확률 개념 도입

 

로지스틱 회귀는 이진 분류 문제에서 각 관측치가 특정 클래스에 속할 확률을 예측하는 데 사용됩니다. 이 확률은 0과 1 사이의 값으로 제한되며, 모델은 주어진 독립 변수 ( X )에 대해 종속 변수 ( y )가 1이 될 확률 ( P(y=1|X) )를 예측합니다. 예를 들어, 로지스틱 회귀를 통해 특정 질병이 있을 확률이나 이메일이 스팸일 확률을 계산할 수 있습니다.

 

로짓 함수와 시그모이드 함수

 

로지스틱 회귀에서 선형 결합을 확률로 변환하기 위해 로짓 함수와 시그모이드 함수를 사용합니다. 로짓 함수는 선형 결합을 로그 오즈로 변환합니다:

$$\text{logit}(P) = \ln\left(\frac{P}{1-P}\right) = \beta_0 + \beta_1X_1 + \beta_2X_2 + \ldots + \beta_nX_n $$

 

여기서 \( \beta_0 \)는 절편이고, \( \beta_1, \beta_2, \ldots, \beta_n \)은 독립 변수 \( X_1, X_2, \ldots, X_n \)의 계수입니다.

이 로그 오즈 값을 시그모이드 함수에 입력하여 확률을 계산합니다:

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

여기서 z는 로짓 함수의 출력 값입니다. 시그모이드 함수는 입력 값을 0과 1 사이의 값으로 변환하여 예측 확률을 제공합니다.

 

비용 함수 (로그 손실 함수)

로지스틱 회귀에서 비용 함수는 예측된 확률과 실제 결과 간의 차이를 측정합니다. 로그 손실 함수(Log Loss) 또는 이진 교차 엔트로피(Binary Cross-Entropy)는 단일 훈련 예제에 대해 다음과 같이 정의됩니다:

$$ L(y, \hat{y}) = -[y \ln(\hat{y}) + (1 - y) \ln(1 - \hat{y})] $$

여기서 y는 실제 이진 결과,\( \hat{y} \)는 예측된 확률입니다. 전체 훈련 데이터에 대한 비용 함수는 다음과 같이 정의됩니다:

$$ J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} [y_i \ln(\hat{y}_i) + (1 - y_i) \ln(1 - \hat{y}_i)] $$

여기서 m은 훈련 데이터의 총 개수입니다. 이 비용 함수를 최소화함으로써 모델의 예측이 가능한 한 실제 결과에 가깝게 되도록 합니다.

 

 

모델 구현 예제

 

다음은 Python과 scikit-learn 라이브러리를 사용한 간단한 로지스틱 회귀 모델을 구현하는 예제입니다. 이 예제에서는 유방암 데이터셋을 사용하여 종양이 악성인지 양성인지를 예측합니다.

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.metrics import accuracy_score, confusion_matrix

# 데이터셋 로드
cancer = datasets.load_breast_cancer()
X = cancer.data
y = cancer.target

# 데이터셋을 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 로지스틱 회귀 모델 생성 및 훈련
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

# 테스트 세트에 대한 예측
y_pred = model.predict(X_test)

# 모델 평가
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)

 

이 예제에서는 scikit-learn의 로지스틱 회귀 모델을 사용하여 유방암 데이터셋을 훈련시키고 테스트 세트에 대한 예측을 수행합니다. 모델의 정확도와 혼동 행렬을 출력하여 모델의 성능을 평가합니다. 이 코드는 로지스틱 회귀의 실용성을 보여주며, 다양한 실제 문제에 적용될 수 있습니다. 단계별로 좀 더 자세히 살펴보면 다음과 같습니다.

 

1. 먼저 필요한 라이브러리를 불러옵니다. numpy는 수치 계산을 위해, train_test_split은 데이터를 훈련 세트와 테스트 세트로 나누기 위해, LogisticRegression은 로지스틱 회귀 모델을 생성하기 위해, datasets는 유방암 데이터셋을 로드하기 위해, accuracy_scoreconfusion_matrix는 모델의 성능을 평가하기 위해 사용됩니다.

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.metrics import accuracy_score, confusion_matrix

 

2. datasets.load_breast_cancer()를 사용하여 유방암 데이터셋을 로드합니다. 이 데이터셋은 설명 변수와 타깃 변수를 포함합니다. 설명 변수는 종양의 특성을 나타내며, 타깃 변수는 종양이 악성(1)인지 양성(0)인지를 나타냅니다.

cancer = datasets.load_breast_cancer()
X = cancer.data
y = cancer.target

 

3. 데이터를 훈련 세트와 테스트 세트로 분할합니다. train_test_split 함수를 사용하여 데이터를 80%의 훈련 세트와 20%의 테스트 세트로 나눕니다. random_state를 설정하여 결과를 재현 가능하게 합니다.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

4. LogisticRegression 클래스를 사용하여 로지스틱 회귀 모델을 생성합니다. max_iter 매개변수를 설정하여 최대 반복 횟수를 지정합니다. 그런 다음 fit 메서드를 사용하여 훈련 데이터를 모델에 맞춥니다.

 

model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

 

5. 훈련된 모델을 사용하여 테스트 세트에 대한 예측을 수행합니다. predict 메서드를 사용하여 예측된 타겟 값을 얻습니다.

y_pred = model.predict(X_test)

 

6. 모델의 성능을 평가하기 위해 정확도(accuracy)와 혼동 행렬(confusion matrix)을 계산합니다. accuracy_score 함수는 예측된 타겟타깃 값과 실제 타깃 값 간의 정확도를 계산합니다. confusion_matrix 함수는 혼동 행렬을 생성하여 모델의 예측 결과를 자세히 분석할 수 있게 합니다.

accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)

 

로지스틸 회귀 모델 성능 평가 결과

 

위의 모델 평가 결과를 보면 모델은 약 95.61%의 정확도로 결과를 예측했습니다. 이는 모델이 대부분의 경우 정확한 예측을 했음을 의미합니다. 혼동 행렬(confusion matrix)은 실제 값과 예측 값 사이의 성능을 비교하여 모델이 얼마나 잘 분류했는지를 보여줍니다. 이 행렬에서 첫 번째 클래스에 대해 39개의 참 양성(TP)과 4개의 거짓 양성(FP)이 있습니다. 두 번째 클래스에 대해서는 1개의 거짓 음성(FN)과 70개의 참 음성(TN)이 있습니다. 이는 모델이 첫 번째 클래스를 정확하게 39번 식별했으나, 4번은 실제로 해당 클래스에 속하지 않는 인스턴스를 잘못 식별했음을 나타냅니다. 두 번째 클래스에 대해서는 70번을 정확하게 식별했으나, 1번은 해당 클래스에 속하는 인스턴스를 놓쳤음을 의미합니다.