[Tensorflow] 로지스틱 회귀(Logistic Regression) 구현
본문 바로가기
프로그래밍 언어/머신러닝(Tensorflow)

[Tensorflow] 로지스틱 회귀(Logistic Regression) 구현

by 코딩 Play 2024. 2. 4.

로시스틱 회귀 소개

이 글에서는 로지스틱 회귀의 기본 개념을 소개하고, 어떻게 이 모델을 구현할 수 있는지에 대한 단계별 안내를 제공할 예정입니다. 모델의 수학적 이론부터 시작하여, Python을 사용한 실제 구현 예제를 통해 이해를 돕겠습니다. 또한, 모델 성능 평가 방법에 대해서도 다룰 것이며, 이를 통해 독자들은 로지스틱 회귀 모델을 자신의 데이터에 적용하는 방법을 배울 수 있을 것입니다.

1. 서론: 로지스틱 회귀의 정의와 주요 사용 사례 소개

로지스틱 회귀(Logistic Regression)는 통계학과 머신 러닝에서 널리 사용되는 분류 기법 중 하나로, 주로 이진 분류 문제를 해결하는 데 사용됩니다. 이 모델은 종속 변수가 범주형 데이터인 경우, 즉 결과가 '예' 또는 '아니오'와 같이 두 가지 중 하나로 분류될 때 유용하게 사용됩니다. 로지스틱 회귀는 이름에 '회귀'가 들어가 있지만, 실제로는 분류 문제를 해결하기 위한 모델입니다. 이 모델의 핵심은 주어진 입력 데이터가 특정 클래스에 속할 확률을 추정하는 것이며, 이를 통해 최종적으로 데이터 포인트가 어느 클래스에 속하는지 결정합니다.

주요 사용 사례

  1. 의료 분야: 환자의 여러 진단 지표를 기반으로 특정 질병의 유무를 예측합니다. 예를 들어, 환자의 나이, 체중, 혈압 등의 데이터를 사용하여 당뇨병이나 심장 질환의 위험성을 평가할 수 있습니다.
  2. 금융 분야: 고객의 신용 기록, 거래 이력, 소득 수준 등을 분석하여 신용카드 사기 거래를 탐지하거나 대출 승인 여부를 결정합니다.
  3. 마케팅: 고객 데이터를 분석하여 특정 상품을 구매할 가능성이 높은 고객을 예측하고, 이를 바탕으로 타겟 마케팅 전략을 수립합니다.
  4. 사회 과학: 설문 조사 데이터를 활용하여 특정 정치 후보에 대한 지지 여부나 사회적 이슈에 대한 찬반 의견을 분류합니다.

로지스틱 회귀는 이처럼 다양한 분야에서 활용될 수 있는 유연성과 강력한 예측 능력을 갖추고 있습니다. 이 모델의 가장 큰 장점 중 하나는 결과를 확률로 해석할 수 있다는 것입니다. 이는 의사 결정 과정에서 더 많은 정보를 제공하며, 단순히 '예' 또는 '아니오'를 넘어서 얼마나 '확신'을 가지고 결정을 내렸는지를 파악할 수 있게 해줍니다. 다음 섹션에서는 로지스틱 회귀의 이론적 배경과 수학적 모델에 대해 더 자세히 살펴보겠습니다.

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

로지스틱 회귀는 분류 문제, 특히 이진 분류 문제를 해결하기 위해 설계된 통계적 모델입니다. 이 모델의 기본 아이디어는 주어진 입력(독립 변수)에 대해 목표 클래스(종속 변수)의 로그 오즈(log odds)를 선형 조합으로 모델링하는 것입니다. 로지스틱 회귀의 핵심은 선형 회귀 모델을 확장하여, 출력값이 특정 범위(0과 1 사이)에 제한되도록 하는 것입니다. 이를 통해 출력값을 확률로 해석할 수 있게 됩니다.

로지스틱 회귀의 수학적 모델

로지스틱 회귀 모델의 수학적 표현은 다음과 같습니다:

[ \text{logit}(p) = \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n ]

여기서, ( p )는 주어진 입력값에 대해 특정 클래스에 속할 확률을 나타냅니다. ( \beta_0, \beta_1, ..., \beta_n )은 모델 파라미터이며, ( x_1, x_2, ..., x_n )은 독립 변수입니다. 이 식에서 로그 오즈는 선형 조합으로 표현됩니다.

 

시그모이드 함수와 확률 추정

로지스틱 회귀에서는 시그모이드 함수(또는 로지스틱 함수)를 사용하여, 선형 조합의 결과를 0과 1 사이의 값으로 변환합니다. 시그모이드 함수의 수학적 표현은 다음과 같습니다:

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

여기서, ( z )는 선형 조합 ( \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n )의 결과입니다. 시그모이드 함수를 통해, 모델은 주어진 입력값에 대해 출력 클래스가 '1'에 속할 확률을 예측하게 됩니다. 이 함수는 ( z )의 값이 양의 무한대로 갈수록 1에 가까워지고, 음의 무한대로 갈수록 0에 가까워지는 특성을 가집니다. 이로 인해, 로지스틱 회귀 모델은 확률을 출력으로 제공하며, 이는 분류 결정을 내리는 데 사용됩니다.

확률 추정치가 주어지면, 일반적으로 0.5를 임계값으로 설정하여, 추정된 확률이 0.5 이상이면 데이터 포인트를 클래스 '1'에, 그렇지 않으면 클래스 '0'에 할당합니다. 이 임계값은 특정 응용 프로그램의 요구 사항에 따라 조정될 수 있습니다.

로지스틱 회귀의 이론적 배경을 이해하면, 모델이 어떻게 입력 데이터를 기반으로 클래스 확률을 추정하는지, 그리고 이러한 확률이 어떻게 분류 결정으로 변환되는지를 더 잘 이해할 수 있습니다.

3. 모델 구현 방법

3단계인 모델 구현 방법에 대해 자세히 설명해보겠습니다. 이 단계는 로지스틱 회귀 모델을 실제로 구현하는 데 필요한 구체적인 절차와 기술을 다룹니다. 구현 과정은 크게 데이터 준비, 모델 구성, 학습 과정, 그리고 평가의 네 부분으로 나눌 수 있습니다.

데이터 준비

  • 데이터 선택: 구현하려는 문제에 적합한 데이터 세트를 선택합니다. 예를 들어, 이메일 스팸 분류 문제의 경우, 이메일 텍스트와 해당 이메일이 스팸인지 아닌지를 나타내는 레이블이 필요합니다.
  • 데이터 전처리: 데이터를 모델이 처리할 수 있는 형태로 변환합니다. 이 과정에는 결측치 처리, 이상치 제거, 피처 스케일링, 범주형 변수의 원-핫 인코딩 등이 포함될 수 있습니다.
  • 학습/테스트 데이터 분할: 데이터를 학습 세트와 테스트 세트로 분할합니다. 일반적으로 70:30 또는 80:20의 비율로 분할합니다.

모델 구성

  • 모델 정의: 로지스틱 회귀 모델은 선형 결합을 통해 입력 피처의 가중합을 계산하고, 시그모이드 함수를 통해 이 값을 0과 1 사이의 확률로 변환합니다.
  • 가중치 초기화: 모델의 가중치(파라미터)를 초기화합니다. 초기화 방법에는 여러 가지가 있으며, 가장 간단한 방법은 모든 가중치를 0 또는 작은 난수로 설정하는 것입니다.

학습 과정

  • 비용 함수 정의: 로지스틱 회귀에서는 일반적으로 로그 손실(log loss) 함수를 비용 함수로 사용합니다. 이 함수는 실제 레이블과 예측된 확률 간의 차이를 측정합니다.
  • 최적화 알고리즘 선택: 경사 하강법은 로지스틱 회귀 모델을 학습시키기 위해 널리 사용되는 최적화 알고리즘입니다. 이 알고리즘은 비용 함수의 그래디언트를 계산하고, 이를 사용하여 모델의 가중치를 업데이트합니다.
  • 학습: 주어진 데이터 세트에 대해 모델을 학습시킵니다. 이 과정에서는 반복적으로 비용 함수의 값을 최소화하는 가중치를 찾아갑니다.

평가

  • 성능 메트릭스 선택: 모델의 성능을 평가하기 위해 정확도, 정밀도, 재현율, F1 점수와 같은 메트릭스를 사용할 수 있습니다.
  • 테스트 데이터로 평가: 학습된 모델을 테스트 데이터 세트에 적용하여 모델의 성능을 평가합니다. 이를 통해 모델이 보이지 않는 데이터에 대해 얼마나 잘 일반화되는지를 확인할 수 있습니다.

4. 실제 예제

여기서는 유명한 Iris 데이터셋을 사용한 로지스틱 회귀 모델 구현 방법을 소개하겠습니다. Iris 데이터셋은 세 가지 종류의 붓꽃(iris)에 대한 150개의 샘플과 각 샘플에 대한 4개의 특성(꽃받침 길이와 너비, 꽃잎 길이와 너비)을 포함하고 있습니다. 본 예제에서는 이를 이진 분류 문제로 단순화하여 특정 종을 분류하는 로지스틱 회귀 모델을 구현해 보겠습니다.

예제 설명

  • 목표: Iris 데이터셋을 사용하여 Iris-Virginica 종이 맞는지(1) 아닌지(0)를 예측하는 로지스틱 회귀 모델을 구현합니다.
  • 데이터셋: Iris 데이터셋은 scikit-learn 라이브러리에서 직접 로드할 수 있습니다.

단계별 구현 방법

  1. 데이터 준비
    • Scikit-learn의 load_iris 함수를 사용하여 데이터셋을 로드합니다.
    • 데이터셋을 특성(X)과 타겟 변수(y)로 분할합니다. 타겟 변수를 이진 분류 문제에 맞게 변환합니다(Iris-Virginica면 1, 아니면 0).
  2. 데이터 전처리
    • 이 예제에서는 데이터셋이 이미 잘 정제되어 있으므로, 복잡한 전처리 과정은 생략합니다.
    • 데이터를 학습 세트와 테스트 세트로 분할합니다.
  3. 모델 구성 및 학습
    • Scikit-learn의 LogisticRegression 클래스를 사용하여 모델을 구성합니다.
    • 학습 세트를 사용하여 모델을 학습시킵니다.
  4. 모델 평가
    • 테스트 세트를 사용하여 모델을 평가합니다.
    • 성능 메트릭으로 정확도, 정밀도, 재현율 등을 사용할 수 있습니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 데이터 로드
iris = datasets.load_iris()
X = iris.data[:, 2:4]  # 꽃잎 길이와 너비만 사용
y = (iris.target == 2).astype(np.int)  # Iris-Virginica

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측 및 평가
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)

print(f"Test Accuracy: {accuracy}")

# 결정 경계 시각화 함수
def plot_decision_boundary(X, y, model):
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    h = 0.02  # 메쉬 그리드 포인트의 간격
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.figure(figsize=(10, 6))
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='g')
    plt.xlabel('Petal length')
    plt.ylabel('Petal width')
    plt.title('Logistic Regression Decision Boundary')

# 결정 경계 및 데이터 포인트 시각화
plot_decision_boundary(X, y, model)
plt.show()

 

결정 경계 시각화

 

이 코드는 Iris 데이터셋을 로드하고, Iris-Virginica 종을 분류하기 위한 이진 로지스틱 회귀 모델을 구성, 학습, 평가하는 과정을 단순화하여 보여줍니다. 실제 환경에서는 데이터 전처리 단계에서 더 많은 작업이 필요할 수 있으며, 모델의 성능을 향상시키기 위해 하이퍼파라미터 튜닝이 필요할 수 있습니다.

최근댓글

최근글

skin by © 2024 ttuttak