카테고리 없음

[머신러닝 특강] 머신러닝 주요기법 1회차

iron-min 2025. 11. 3. 19:40

오늘 배운것.

1. 분류 문제 이해하기

회귀(Regression): "얼마나?"의 문제
  • 집값 예측: 3억 2천만원
  • 주식 가격 예측: 52,300원
  • 기온 예측: 23.5도 </aside>
분류(Classification): "무엇인가?"의 문제
  • 이메일 분류: 스팸 vs 정상
  • 의료 진단: 양성 vs 음성
  • 고객 분류: 구매 vs 비구매

 

 

분류의 유형

이진 분류 (Binary Classification)
  • 특징: 2개의 클래스 중 하나를 선택
  • 출력: 0 또는 1, Yes 또는 No
  • 예시:
    • 의료 분야: 암 진단 (양성/음성), 응급환자 분류 (응급/일반)
    • 금융 분야: 대출 승인 (승인/거절), 신용카드 사기 탐지 (정상/사기)
    • 마케팅: 구매 예측 (구매/비구매), 이탈 고객 예측 (이탈/유지)
    • IT 보안: 악성코드 탐지 (정상/악성), 스팸 메일 필터링 (정상/스팸)
다중 분류 (Multi-class Classification)
  • 특징: 3개 이상의 클래스 중 하나를 선택
  • 출력: 여러 범주 중 정확히 하나
  • 예시:
    • 제조업: 제품 불량 유형 분류 (정상/스크래치/변형/파손)
    • 소매업: 고객 등급 분류 (VIP/골드/실버/브론즈)
    • 교통: 교통수단 선택 예측 (도보/자전거/버스/지하철/자동차)
    • 콘텐츠: 뉴스 기사 분류 (정치/경제/사회/문화/스포츠)

 

 

2. 로지스틱 회귀 분석

로지스틱 회귀: 종속변수가 범주형(0, 1) 정상(0), 불량(1)일 때 사용하는 회귀분석 방법. 선형회귀의 한계를 극복하고 확률을 예측할 수 있는 강력한 분류 알고리즘

 

선형적으로 나타내는 확률 변수를 0과 1로 분류할수 있습니다.

 

로지스틱회귀의 해결책:

  • 시그모이드 함수 사용으로 항상 0~1 사이 값 보장 
  • S자 곡선 형태로 자연스러운 확률 변화 표현 

 

1) 오즈비의 이해

 

예시) 

이기면 몇 번, 지면 몇 번인지 비율로 바꿔 싸움의 기울기를 본다.

오즈비는 실패확률 대비 성공확률의 비율입니다.

도박사들이 자주 쓰는 개념입니다. 예를 들어 도박이 성공할 확률이 80% 라면, 오즈비는 80%/20% = 4 예요. 다시 해석해보면 1번 실패하면 4번은 딴다는 소리입니다.

 

 

2) 로짓변환

 

오즈비가 0~ 무한대인데, 비대칭적으로 다루기가 어려워서 로그를 취하자

 

3) 로지스틱 함수

로짓을 다시 확률로 변환하는 역함수입니다. → 위의 로짓 함수를 X-Y 축 교체한 것

어떤 실수값이라도 0과 1 사이의 확률로 변환해줍니다

 

 

 

 

 

선형회귀식 도출

양변에 e를 취하기

 

최종확률

 

 

 

결론

1. 성공 확률 p를 알 수 있게 됩니다. (X 데이터를 input으로 넣게 된 후)

2. 가중치 β가 정해졌으므로, 해당 X 변수의 영향도를 파악할 수 있습니다.

3. X 변수의 단위가 1 증가할 때, exp(해당 β값)만큼 성공확률이 올라갑니다.

 

 

예시) 머신러닝 모델에서 .coef_()를 써서 회귀계수를 알수있는데 이때 e^b 만큼 확률이 증가함

 

코드로 확인하기

 

로지스틱 회귀 결과를 올바르게 해석하는 것이 실무에서 가장 중요합니다. 타이타닉 데이터를 통해 각 특성이 생존에 미치는 영향을 분석해봅시다. 특히 계수 해석을 해 보겠습니다. 로지스틱 회귀의 계수는 로그 오즈비의 변화량을 의미합니다. 양수면 해당 변수가 증가할 때 생존 확률이 높아집니다

 

# 모델 계수 분석
feature_names = X.columns
coefficients = model.coef_[0]

print("=== 타이타닉 생존에 영향을 미치는 요인 분석 ===")
coef_df = pd.DataFrame({
    'Feature': feature_names,
    'Coefficient': coefficients,
    'Odds_Ratio': np.exp(coefficients)
}).sort_values('Coefficient', ascending=False)

print(coef_df)
print("\n=== 상세 해석 ===")
for feature, coef in zip(feature_names, coefficients):
    odds_ratio = np.exp(coef)
    print(f"{feature}: 계수 {coef:.3f}")
    
    if coef > 0:
        print(f"  → 이 변수가 1단위 증가하면 생존 오즈비가 {odds_ratio:.3f}배 증가")
        print(f"  → 생존에 긍정적인 영향")
    else:
        print(f"  → 이 변수가 1단위 증가하면 생존 오즈비가 {odds_ratio:.3f}배 감소")
        print(f"  → 생존에 부정적인 영향")
    print()

 

 

3. 모델의 성능평가

# 테스트 데이터로 예측
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)

# 정확도 계산
train_accuracy = accuracy_score(y_train, y_pred_train)
test_accuracy = accuracy_score(y_test, y_pred_test)

print(f"훈련 데이터 정확도: {train_accuracy:.3f}")
print(f"테스트 데이터 정확도: {test_accuracy:.3f}")

# 상세한 분류 보고서
print("\n=== 테스트 데이터 분류 보고서 ===")
print(classification_report(y_test, y_pred_test, target_names=['사망', '생존']))

 

  • 훈련/테스트 정확도 비교: 과적합 여부 확인

사망 0.3, 생존 0.7 ⇒ 너는 생존

  • 훈련 정확도 >> 테스트 정확도: 과적합 의심
  • 두 정확도가 비슷: 적절한 일반화 성능
  • classification_report(): 정밀도, 재현율, F1-score 등 상세 성능 지표 제공 → 이 부분은 내일 자세히 다루도록 하겠습니다~!
    • 정밀도(Precision): 생존 예측 중 실제 생존 비율
    • 재현율(Recall): 실제 생존자 중 올바르게 예측한 비율
    • F1-score: 정밀도와 재현율의 조화평균
  • macro avg: 각 클래스별 지표의 단순 평균
  • weighted avg: 클래스별 샘플 수를 고려한 가중 평균