co-code 님의 블로그

이진 분류 본문

python

이진 분류

co-code 2026. 5. 13. 19:00
  • 로지스틱 회귀
    • 모델의 이름은 회귀 모델이지만 결과는 분류
    • 0과 1 사이의 값(실수)을 예측
      • 0.5보다 큰 경우 1 출력
      • 0.5보다 작은 경우 0 출력
    • 종속 변수가 범주형인 경우 적용하는 회귀 분석 방식
    • 종속 변수 y를 직접 모델링 하지 않고 y가 특정 범주에 속하는 확률을 모델링
    • parameter(매개변수)
      • penalty
        • 기본값 : L2
        • L1 : Lasso
        • L2 : Ridge
        • elasticnet : ElasticNet
        • None : 규제 없음(선형 회귀)
      • C
        •  기본값 : 1.0
        • 규제 강도의 역수
          • 작을수록 규제 강도 큼(과적합 방지)
          • 클수록 규제 강도 작음(유연)
      • class_weight
        • 기본값 : None
        • 클래스의 불균형을 처리
          • 'balanced' : 클래스의 빈도에 반비례하게 가중치를 부여
          • dict형 데이터 : {클래스명 : 가중치,...} 
            • 특정 클래스에 가중치를 선택하여 부여
      • solver
        • 기본값 : '1bfgs'
        • 최적의 알고리즘 선택(데이터의 크기, 규제 방식)
          • '1bfgs' : 다중 클래스를 지원, 빠르고 안정적, L2 / None 지원
          • 'liblinear' : 적은 데이터, L1 / L2 지원
          • 'sags' : 대규모 데이터, L1 / L2 / ElasticNet 지원
          • 'newton_cg', 'sag' : 대규모 지원, L2 / None 지원
      • multi_class
        • 기본값 : 'auto'
        • 다중 클래스의 처리방식
          • 'ovr'(One Vs Rest) : 2진분류 반복 작업
          • 'multinomial' : softmax 기반, solver 지원
          • 'auto' : solver와 데이터의 크기를 기반으로 자동 설정
      • l1_ratio
        • 기본값 : None
        • ElastiNet에서만 사용이 가능
      • dual
        • 기본값 : False
        • solver의 값이 'liblinear'인 경우
        • 데이터의 개수가 적은 경우 사용
        • 쌍대문제를 생성하여 해답을 낸는 과정을 사용할 것인가?
    • 속성
      • coef_ : 회귀 계수 출력
      • intercept_ : y 절편 출력
      • classes_ : 학습이 된 클래스의 목록
    • 메서드
      • decision_function(x) : 클래스 별 함수
      • predict_proba(x) : 클래스 별 예측 확률
      • predict_log_proba(x) : 클래스 별 예측 로그 확률
      • score(x, y) : 회귀 모델은 score()의 결과가 r2 Score가 나오지만 로지스틱은 정확도를 출력
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

# 1. 가상 데이터 생성 (X: 특징 데이터, y: 0 또는 1의 이진 레이블)
np.random.seed(42)
X = np.random.normal(0, 1.5, (100, 1))
y = (X[:, 0] > 0).astype(int)

# 2. 로지스틱 회귀 모델 학습
model = LogisticRegression()
model.fit(X, y)

# 3. 곡선을 그리기 위한 촘촘한 x축 데이터 및 예측 확률 계산
X_test = np.linspace(-4, 4, 300).reshape(-1, 1) #-4부터 4까지의 구간을 똑같은 간격으로 300등분
y_prob = model.predict_proba(X_test)[:, 1]  # 클래스 1에 속할 확률 추출

# 4. 그래프 그리기
plt.figure(figsize=(8, 5))
plt.scatter(X, y, color='gray', alpha=0.6, label='Data')  # 실제 데이터 점
plt.plot(X_test, y_prob, color='blue', linewidth=2, label='Logistic Curve')  # S자 결정 곡선
plt.axhline(0.5, color='red', linestyle='--', alpha=0.5, label='Threshold (0.5)')  # 분류 기준선(임계값)

plt.title('Logistic Regression')
plt.xlabel('X')
plt.ylabel('Probability')
plt.legend()
plt.grid(True)
plt.show()

  • 혼동 행렬
    • 이진 분류의 예측 오류가 얼마인지, 어떠한 유형의 오류가 발생하는지를 나타내는 지표
      • TN(True Negative) : 예측 값 Negative(0), 실제 값 Negative(0)
      • FP(False Positive) : 예측 값 Positive(1), 실제 값 Negative(0)
      • FN(False Negative) ; 예측 값 Negative(0), 실제 값 Positive(1)
      • TP(True Positive) : 예측 값 Positive(1) , 실제 값 Positive(1)
    • 정확도
      • 실제 데이터와 예측 데이터가 얼마나 같은가?
      • (TN + TP) / (TN + TP + FN + FP)
    • 정밀도
      • 양성 예측도
      • TP / (TP + FP)
      • ex) 스팸 메일인지 아닌지 판별
    • 재현율
      • TP / (TP +FN)
      • ex) 암 진단 판단, 신용카드 사기 탐지
    • F1_Score
      • 정밀도와 재현율을 결합한 분류 성능 지표
      • 어느 한 쪽에 치우치지 않고 적절하게 조화를 이루었을 때 높은 수치를 나타냄
      • (2 * TP) / (2 * TP + FP + FN)
    • 정밀도,재현율, F1_Score는 다중 뷴류 모델에서 일반적인 계산 X(error 발생)
      • average
        • 'macro'
          • 다중 분류에서 각각의 점수들이 생성이 되면 점수들의 평균을 출력
          • ex) A : 90점, B : 30점, C : 50점, D : 10점
            • 점수들의 평균 : 45점
        • 'weighted'
          • 각 클래스 별 가중치(비율)를 생성하여 계산
          • ex) A : 90점 (100/150), B : 30점 (30/150), C : 50점 (20/150)
            • (90 * 100/150) + (30 * 30/150) + (50 * 20/150)
        • 'micro'
          • 혼동 행렬의 모든 값들은 합산해서 점수를 생성
          • 이진 분류에서 정확도가 같은 값들이 생성
    예측 값
    O X
실제 값 O TP(True Positive) FN(False Negative)
X FP(False Positive) TN(True Negaive

 

'python' 카테고리의 다른 글

서포트 벡터 머신(SVM : Support Vector Machine)  (0) 2026.05.14
부스팅(Boosting)  (0) 2026.05.14
데이터 불균형 문제 및 완화 방법  (0) 2026.05.08
이상치 판별 및 처리  (2) 2026.05.08
matplotlib을 이용한 시각화  (0) 2026.04.29