[머신러닝] 분류 학습 모델 - Logistic Regression

2025. 2. 27. 21:09AI & DS/머신러닝

 

 

로지스틱 회귀(Logistic Regression)를 사용하여 분류(Classification) 문제를 해결하는 과정으로,
Confusion Matrix(혼동 행렬)을 출력하여 모델 성능을 평가한다.

 

 

Logistic Regression : 로지스틱 회귀

 

 

1. 데이터 전처리 (StandardScaler 사용) 입력 데이터를 표준화하여 모델 학습을 안정화
2. 로지스틱 회귀 모델 생성 max_iter=200 설정하여 충분히 학습
3. 모델 학습 (fit) 학습 데이터(X_train_scaled, y_train)를 사용하여 패턴 학습
4. 예측 (predict) 테스트 데이터(X_test_scaled)를 분류 (0 또는 1)
5. 평가 (confusion_matrix) 얼마나 정확한지 혼동 행렬을 통해 평가

 


원본 데이터 (Raw Data)

 

 

위 그래프는 모델이 학습하기 전, 원본 데이터를 보여준다.

  • 파란색 (Class 1, 악성) → 우측 상단에 위치
  • 빨간색 (Class 0, 양성) → 좌측 하단에 위치

데이터가 두 개의 그룹으로 나뉘어져 있으며, 머신러닝 모델은 이 두 클래스를 나누는 경계를 찾아야 한다.

 

 

 

 

 

 

 

로지스틱 회귀 (Logistic Regression) 결정 경계

로지스틱 회귀(Logistic Regression)  모델이 학습한 결과를 시각화

 

  • 로지스틱 회귀는 데이터를 직선(선형 경계)으로 나누려고 한다.
  • 빨간색 영역 (Class 0, 양성) vs 파란색 영역 (Class 1, 악성)
  • 데이터를 최대한 정확하게 나누는 직선(결정 경계)을 찾음S자 함수(Sigmoid)를 사용하여 확률을 예측
  • 선형적으로 나눌 수 있는 데이터에서는 성능이 좋지만, 복잡한 데이터에서는 한계가 있을 수 있다.

 

 

 


1 . 데이터 스케일링 (StandardScaler 적용)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 학습 데이터 기준으로 변환
X_test_scaled = scaler.transform(X_test)
📌 이유 (왜 스케일링을 해야 할까?)
- 로지스틱 회귀는 기울기 기반(Gradient Descent) 최적화를 사용하기 때문에 따라서, 특성이 크기가 다르면 학습이 어렵다.
  • StandardScaler()를 사용하여 평균=0, 표준편차=1로 변환
  • .fit_transform(X_train) → 학습 데이터를 기준으로 변환
  • .transform(X_test) → 동일한 변환을 테스트 데이터에 적용

💡결과적으로 모든 입력 데이터(feature)가 같은 범위를 가지게 되어, 모델이 더 안정적으로 학습할 수 있음

  • 원본 데이터 :  Weight는 50 ~ 100 사이의  값이고, Height는  1.5 ~ 2.0 사이로 값의 범위가 다름
Weight(kg) Height(m)
50 1.5
60 1.6
70 1.7
80 1.8
90 1.9
100 2.0
  • Z-score 표준화 후 데이터 (평균 0, 표준편차 1) :  모든 값이 평균 0, 표준편차 1을 가지도록 변환됨
Weight(kg) Height(m)
-1.46 -1.46
-0.88 -0.88
-0.29 -0.29
0.29 0.29
0.88 0.88
1.46 1.46

 


2. 로지스틱 회귀 모델 생성 및 학습

lr_model = LogisticRegression(max_iter=200)
📌 이유 (왜 max_iter=200?)
- LogisticRegression() → 이진 분류(Binary Classification)에 사용됨
- .max_iter=200 → 경사 하강법(Gradient Descent) 반복 횟수 설정.
- 기본값(100)보다 늘려서, 학습이 충분히 이루어지도록 보장.

 

lr_model.fit(X_train_scaled, y_train)
  • X_train_scaled (훈련 데이터) : 입력 데이터 (Features)
  • y_train (정답 데이터) : 출력 데이터 (Labels)
  • 로지스틱 회귀 모델이 이 데이터를 학습하면서 가중치(Weight)를 업데이트함
  • 모델이 W와 b (가중치와 편향)를 찾음 → 가장 잘 맞는 결정 경계를 학습
  • 로지스틱 회귀는 시그모이드(Sigmoid) 함수를 사용하여 클래스 확률을 계산

 3. 예측 수행

lr_pred = lr_model.predict(X_test_scaled)
  • predict(X_test_scaled) : 모델이 테스트 데이터(X_test_scaled)에 대해 예측을 수행
  • 각 샘플에 대해 0(양성) 또는 1(악성) 클래스를 예측
  • 결과적으로 테스트 데이터의 각 샘플이 Class 0 또는 Class 1로 분류됨

 4. 모델 평가 (Confusion Matrix 출력)

lr_matrix = confusion_matrix(y_test, lr_pred)
print("Logistic Regression Confusion Matrix:")
print(lr_matrix)
📌 Confusion Matrix란?
- Confusion Matrix(혼동 행렬)는 모델이 얼마나 정확하게 분류했는지 평가하는 방법

 

Logistic Regression Confusion Matrix:
[[ 62   1]
 [  2 106]]

 

각 숫자의 의미 (TP, TN, FP, FN)

예측 0(양성) 1(악성)
실제 0 (양성) TN(True Negative) = 62
정확히 정상(양성)을 맞춤
FP(False Positive) = 1 오탐
정상(양성)을 암 환자(악성)으로 잘못 예측
실제 1 (악성) FN(False Negative) = 2 오탐
암환자(악성)을 정상(양성)으로 잘못 예측
TP(True Positive) = 106
정확히 암 환자(악성)을 맞춤
  • 양성(0) 예측 정확도: 62 / (62+1) = 98.41%
  • 악성(1) 예측 정확도: 106 / (106+2) = 98.15%
  • 전반적으로 높은 정확도를 가진 모델이며, FN(False Negative)이 2개라서, 악성 환자를 놓칠 확률이 낮지만 존재함
    • 이 모델은 높은 정확도를 가지며, 오탐(FP)과 미탐(FN)이 매우 적음
    • FN(악성을 놓치는 것)이 낮은 것이 중요 (의료 데이터에서는 FN이 치명적일 수 있음)

코로나 검사 예제

  • TN (True Negative) = 진짜 음성 (정상)
  • FN (False Negative) = 잘못된 음성 (진짜 확진자인데 정상 판정)
  • FP (False Positive) = 잘못된 양성 (정상인데 확진자로 나옴)
  • TP (True Positive) = 진짜 양성 (확진자 제대로 잡음)