본문 바로가기
[데이터 분석가]/[머신러닝,딥러닝]

로지스틱 회귀(Logistic Regression)

by jsm-portfolio 2025. 1. 23.

오늘은 로지스틱 회귀에 대해서 설명을 드리겠습니다!

 

얘는 아주 큰 함정이 있는 친구입니다.

 

로지스틱 '회귀' 지만 정작 이 친구는 분류 모델입니다!

 

이진 분류에서 사용하는 알고리즘입니다.

 

1. 이진 분류

이진 분류는 결과를 특정된 두 가지 클래스(0과 1, Yes or No 같은 형식)를 나누어 주는 모델입니다.

 

즉, 로지스틱 회귀를 사용하고 해석을 하게 되면 위와 같이 결과를 분류할 수 있습니다.

 

2. 시그모이드 함수

$$ Sigmoid(x) = \frac{1}{1 + e^{-x}} $$

 

이것을 그래프로 표현하면 아래와 같습니다.

 

  • x가 0일 때, 시그모이드 함수의 값은 0.5입니다.
  • x가 작아지면 작아질수록, 0에 가까워 집니다.
  • x가 커지면 커질수록, 1에 가까워 집니다.

3. 로지스틱 회귀의 손실 함수

아래의 수식들을 확인하기 전에 간단한 기호에 대해서 설명을 드리겠습니다.

$$ y_i : 실제 클래스 데이터$$

$$ \hat{y_i} : 모델 예측 확률(P(y = 1|x))$$

$$ n : 데이터\,갯수 $$

 

$$ L(y_i,\hat{y_i}) = -(y_i \cdot \log(\hat{y}_i) + (1 - y_i) \cdot \log(1- \hat{y_i})) $$

 

위의 수식은 잘못된 예측을 할수록 손실함수의 크기가 커지는 형태입니다.

4. 로지스틱 회귀의 비용함수

$$ J(theta) = -\frac{1}{n} \sum_{i = 1}^{n}(y_i \cdot \log(\hat{y}_i) + (1 - y_i) \cdot \log(1- \hat{y_i}) $$

 

손실함수는 데이터 하나의 값의 차이를 나타낸다고 하면

 

비용함수는 데이터 셋 전체의 차이를 값으로 낸 결과입니다.

 

5. 로지스틱 회귀의 모델 학습

적절한 비용함수와 최적의 파라미터를 찾기 위해선, 경사하강법을 사용하면 됩니다!!

 

경사하강법은 추후에 업로드 할 예정입니다.

 

코드리뷰 하겠습니다.

 

사용할 데이터는 저어어어엉말 유명한 iris 데이터 입니다.

 

원래는 라벨이

 

이렇게 3개로 나뉘어져 있지만 0은 빼고 두 가지로 분류를 하도록 하겠습니다!

 

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 로드
iris = load_iris()
X = iris.data
y = (iris.target != 0).astype(int)  # 이진 분류를 위해 라벨 변환

# 데이터 분할
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)

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


# 히트맵 시각화
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues", xticklabels=["Class 0", "Class 1"], yticklabels=["Class 0", "Class 1"])
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix Heatmap")
plt.show()

 

예측 결과는 틀린게 하나도 없네요!!

 

보통은 heatmap을 사용하기도 하는데 confusion_matrix를 사용하는게 훨씬 편할 것 입니다!!

 

그럼 오늘은 여기서 마치고

 

다음번에 뵙겠습니다!!