상세 컨텐츠

본문 제목

분류 - 로지스틱 회귀(Logistic Regression)

인공지능/머신러닝

by 2^7 2024. 11. 28. 21:00

본문

로지스틱 회귀(Logistic Regression)

 분류 문제(Classification Problem)를 해결하기 위해 자주 사용되는 알고리즘입니다. 이름에 "회귀"라는 단어가 포함되어 있지만, 실제로는 분류(Classification) 작업을 수행함

 

1. 로지스틱 회귀란?

  •  로지스틱 회귀는 특정 데이터가 둘 중 하나의 카테고리or 다수의 카테고리에 속할 확률을 예측하는 알고리즘.
    • 하나의 카테고리 (ex. "스팸 메일" vs "정상 메일") 
    • 다수의 카테고리 (ex. "고양이", "개", "새")
  • 선형 회귀(Linear Regression)와 로지스틱 함수(Logistic Function, 시그모이드 함수)를 결합하여 결과값을 0과 1 사이의 확률로 변환
  • 시그모이드 함수는 결과값을 S자 형태의 곡선으로 나타내며, h(x)값이 0.5보다 크면 "참" (or 1), 작으면 "거짓" (or 0)으로 분류

로지스틱 함수(시그모이드 함수)
는 입력 데이터에 가중치 w와 편향 b를 적용한 선형 결합

 

2. 로지스틱 회귀 특징

  • 확률적 접근: 입력 데이터가 특정 클래스에 속할 확률을 계산함
  • 선형 모델 기반: 입력 변수와 출력 변수 간의 선형 관계를 기반으로 하지만, 결과를 확률값으로 변환하는 비선형 함수(시그모이드)를 사용함
  • 이진 분류: 두 개의 클래스를 분류하는 데 주로 사용되며, 다중 클래스 분류는 "소프트맥스 회귀" 또는 "다항 로지스틱 회귀"로 확장됨
  • 해석 가능성: 결과를 확률로 제공하기 때문에 직관적이고 해석이 쉬운 모델

 

3. 로지스틱 회귀의 장단점

 1) 장점

  • 단순성과 효율성: 구현이 간단하고 계산 비용이 낮아 소규모 데이터에서 효과적
  • 해석 가능성: 예측 결과가 확률로 나타나므로 각 변수의 기여도를 쉽게 이해할 수 있음
  • 과적합 방지: 필요에 따라 정규화를 추가해 과적합(overfitting)을 줄일 수 있음(예: L1, L2 정규화).
  • 다양한 응용: 의료 진단, 이메일 스팸 필터링 등 다양한 분야에서 널리 사용됨

 2) 단점

  • 선형 분리가 필요한 데이터: 데이터가 선형적으로 분리되지 않는 경우 성능이 떨어짐
  • 복잡한 관계 모델링의 어려움: 비선형적인 데이터 관계를 잘 표현하지 못함
  • 큰 데이터셋 한계: 데이터가 너무 크거나 복잡하면 더 복잡한 모델(예: 랜덤 포레스트, 딥러닝)이 필요할 수 있음

 

4. 로지스틱 회귀의 학습 방법

로지스틱 회귀는 데이터를 기반으로 모델의 파라미터(가중치 w, 편향 b)를 학습하며, 이 과정에서 최적화 알고리즘을 사용하여 진행

1). 손실 함수

  • 로지스틱 회귀는 로그 손실(Log Loss) 또는 크로스 엔트로피 손실(Cross-Entropy Loss)을 사용합니다.
은 데이터 샘플 수, y^(i)는 실제 레이블, h(x^(i))는 예측 확률

2) 경사 하강법(Gradient Descent)

  • 손실 함수를 최소화하기 위해 경사 하강법을 사용하여 가중치와 편향을 반복적으로 업데이트
는 학습률(Learning Rate)

3) 정규화

  • L1 정규화(라쏘): 불필요한 변수 제거
  • L2 정규화(릿지): 가중치 크기 축소로 과적합 방지

(예시 코드) scikit-learn에서 제공하는 Iris 데이터셋을 사용하여 꽃의 품종을 분류하는 방법

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, ConfusionMatrixDisplay

# 1. 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

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

# 3. 로지스틱 회귀 모델 학습
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

# 4. 예측 및 평가
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
print("\nClassification Report:\n", classification_report(y_test, y_pred))

# 5. Confusion Matrix 시각화
ConfusionMatrixDisplay.from_estimator(model, X_test, y_test, display_labels=iris.target_names)
plt.title("Confusion Matrix")
plt.show()
728x90

관련글 더보기