로지스틱 회귀와 분류 평가 지표 정리

2026. 6. 24. 15:29·TIL/머신러닝

로지스틱 회귀와 분류 평가 지표 정리

 

- 타이타닉 생존 예측으로 이해하는 분류 분석 및 평가 -

📕 글의 목적
 이 글은 선형회귀로 숫자 값을 예측하는 회귀 문제에서 한 단계 나아가, 생존/사망, 정상/불량, 합격/불합격처럼 정해진 범주를 예측하는 분류 문제를 정리한 글이다. 특히 이진 분류에서 자주 사용하는 로지스틱 회귀를 타이타닉 생존 예측 문제와 연결해 이해하고, 분류 모델을 평가할 때 왜 정확도만 보면 위험한지, 혼동 행렬과 정밀도, 재현율, F1-score를 어떻게 해석해야 하는지까지 하나의 흐름으로 정리한다.
Logistic Regression Binary Classification Sigmoid Odds Ratio Logit Confusion Matrix Precision Recall F1-score
목차
  • 1. 회귀 문제와 분류 문제의 차이
  • 2. 타이타닉 생존 분류 문제
  • 3. 왜 선형회귀로 분류를 하면 안 되는가
  • 4. 오즈비와 로짓
  • 5. 로지스틱 함수와 확률 예측
  • 6. 로지스틱 회귀 계수 해석
  • 7. 분류 평가 지표가 필요한 이유
  • 8. 혼동 행렬
  • 9. 정확도, 정밀도, 재현율, F1-score
  • 10. 정확도의 한계와 불균형 데이터
  • 11. scikit-learn에서 로지스틱 회귀 사용하기
  • 12. 타이타닉 데이터 실습 흐름
  • 13. 타이타닉 로지스틱 회귀 예시 코드
  • 14. 다중 로지스틱 회귀
  • 15. 선형회귀와 로지스틱 회귀 비교
  • 16. 로지스틱 회귀의 장점과 한계
  • 17. 데이터 분석 프로세스 관점에서의 로지스틱 회귀
  • 18. 핵심 정리

1. 회귀 문제와 분류 문제의 차이

 앞에서 선형회귀를 통해 숫자 값을 예측하는 회귀 문제를 다뤘다. 회귀 문제에서는 키, 가격, 매출, 순도처럼 연속적인 수치형 값을 예측한다. 예를 들어 집의 면적을 입력받아 집값을 예측하거나, 반응 조건을 입력받아 산출물의 순도를 예측하는 문제가 회귀에 해당한다.

 반면 분류 문제에서는 생존/사망, 정상/불량, 합격/불합격처럼 정해진 범주를 예측한다. 결과가 연속적인 숫자가 아니라 미리 정해진 클래스 중 하나라는 점이 회귀 문제와 다르다.

구분 회귀 문제 분류 문제
예측 대상 연속적인 수치형 값 정해진 범주 또는 클래스
예시 가격, 매출, 순도, 온도 생존/사망, 정상/불량, 합격/불합격
대표 모델 선형회귀, Ridge, Lasso 로지스틱 회귀, 의사결정나무, 랜덤 포레스트
대표 평가 지표 MSE, RMSE, R² Accuracy, Precision, Recall, F1-score

 이번 내용의 핵심은 범주형 종속변수 Y를 어떻게 예측할 것인가이다. 특히 Y가 0 또는 1로 표현되는 이진 분류 문제에서 자주 사용하는 모델이 로지스틱 회귀이다.

이진 분류 예시
Y = 0 → 사망, 정상, 불합격
Y = 1 → 생존, 불량, 합격

2. 타이타닉 생존 분류 문제

 타이타닉 생존 예측 문제는 대표적인 이진 분류 문제이다. 탑승객의 정보를 바탕으로 생존 여부를 예측한다. 모델이 맞춰야 할 정답은 Survived이고, 예측에 사용할 수 있는 입력 변수는 티켓 등급, 성별, 나이, 요금, 승선 항구 등이다.

Y(종속변수): 사망(0), 생존(1)
X(독립변수): 티켓 등급, 성별, 나이, 요금, 승선 항구 등
변수명 의미
PassengerId 승객 식별자
Survived 사망 0, 생존 1
Pclass 티켓 등급
Name 이름
Sex 성별
Age 나이
SibSp 함께 탑승한 형제·배우자 수
Parch 함께 탑승한 부모·자식 수
Ticket 티켓 번호
Fare 요금
Cabin 객실 이름
Embarked 승선 항구
 여기서 Survived가 모델이 맞춰야 할 정답이고, 나머지 변수들이 예측에 사용할 입력 변수이다. 예를 들어 데이터를 살펴보면 여성 승객의 생존 확률이 남성보다 높다는 패턴을 발견할 수 있다. 실제로 “여성은 모두 생존, 남성은 모두 사망”이라고 단순 규칙을 만들면 약 78.6%의 정확도를 얻을 수 있다.
정확도 = (여성 생존 233 + 남성 사망 468) / 전체 인원 891 ≈ 78.6%
선형회귀 직선과 로지스틱 회귀 S자 곡선의 차이를 비교

 이 결과는 데이터에서 얻은 좋은 인사이트이다. 하지만 단순히 성별 하나만 보고 사람이 직접 규칙을 만든 것이므로 머신러닝 모델이라고 보기는 어렵다. 머신러닝 모델은 더 많은 변수를 함께 사용하고, 모델이 데이터에서 직접 패턴을 학습하도록 만드는 방식이다.

💡 핵심 관점
 분류 문제에서는 정답 Y가 범주형이다. 타이타닉 문제에서는 생존 여부가 0과 1로 표현되며, 모델은 각 승객이 생존할 가능성을 데이터 기반으로 학습한다.

3. 왜 선형회귀로 분류를 하면 안 되는가

 분류 문제도 처음에는 선형회귀처럼 생각할 수 있다. 예를 들어 어떤 승객이 생존할 확률을 예측한다고 하자. 이때 Y는 사망 0 또는 생존 1이다.

0: 사망 | 1: 생존

 문제는 선형회귀의 예측값에는 범위 제한이 없다는 점이다. 선형회귀는 입력값에 따라 -0.3, 0.2, 0.8, 1.4 같은 값을 만들 수 있다. 하지만 확률은 반드시 0과 1 사이에 있어야 한다.

선형회귀 예측값: -0.3, 0.2, 0.8, 1.4
같은 값이 나올 수 있음 확률의 범위: 0 ≤ P ≤ 1

 따라서 분류 문제에서는 직선 함수보다 S자 형태의 함수가 더 적합하다. S자 함수는 입력값이 아무리 작거나 커도 출력값을 0과 1 사이로 제한할 수 있다.

선형회귀 직선과 로지스틱 회귀 S자 곡선의 차이를 비교

 이때 사용하는 대표 함수가 시그모이드 함수이다. 로지스틱 회귀는 선형회귀의 식을 그대로 쓰되, 결과를 시그모이드 함수에 통과시켜 확률로 바꾸는 모델이다.

❗ 주의할 점
 로지스틱 회귀는 이름에 회귀가 들어가지만, 실제 사용 목적은 분류이다. 내부적으로는 선형식과 확률 변환을 사용하기 때문에 회귀라는 이름이 붙었지만, 최종 출력은 특정 클래스에 속할 확률 또는 분류 결과이다.

4. 오즈비와 로짓

 로지스틱 회귀를 이해하려면 오즈비와 로짓 개념을 알아야 한다. 로지스틱 회귀는 단순히 확률 P를 바로 선형식으로 다루는 것이 아니라, 확률을 오즈비와 로짓 형태로 변환해 선형 모델과 연결한다.

4.1  오즈비

 오즈비(Odds Ratio, 승산비)는 실패 확률 대비 성공 확률을 의미한다.

오즈비 = P / (1 - P)

 여기서 P는 어떤 사건이 일어날 확률이다. 예를 들어 어떤 사건이 성공할 확률이 80%라면 실패할 확률은 20%이다.

오즈비 = 0.8 / 0.2 = 4

 이는 “1번 실패할 때 4번 성공한다”는 의미로 해석할 수 있다. 하지만 오즈비는 확률이 1에 가까워질수록 매우 급격하게 증가한다. 확률 P는 0과 1 사이 값이지만, 오즈비는 0부터 무한대까지 커질 수 있다. 이 상태로는 선형 모델의 형태로 다루기 어렵다.

4.2  로짓

 오즈비에 로그를 씌운 값이 로짓(Logit, 로그 오즈)이다.

Logit = log(P / (1 - P))

 로그를 씌우면 오즈비가 급격하게 증가하는 문제를 완화할 수 있다. 또한 로짓은 선형회귀식과 결합하기 좋은 형태가 된다.

log(P / (1 - P)) = w0 + w1X

 이 식이 로지스틱 회귀가 “회귀”라는 이름을 가지는 이유이다. 내부적으로는 선형회귀처럼 입력 변수 X에 가중치 w를 곱하고 편향 b를 더하는 구조를 가진다. 다만 최종 출력은 연속적인 숫자가 아니라 확률이다.

확률 P, 오즈비 P/(1-P), 로짓 log(P/(1-P))의 관계를 비교하는 이미지를 삽입한다.

5. 로지스틱 함수와 확률 예측

 로짓 식을 P에 대해 정리하면 로지스틱 함수가 된다. 로지스틱 함수는 입력값을 0과 1 사이의 확률 값으로 변환한다.

P = 1 / (1 + e^(-z))
z = w0 + w1X

 즉, 로지스틱 회귀는 입력 변수 X를 받아 선형식 z를 계산하고, 이 z를 로지스틱 함수에 넣어 확률 P로 변환한다. 이후 P가 기준값보다 크면 1, 작으면 0으로 분류한다.

1. 입력 변수 X를 받는다.
2. z = w0 + w1X를 계산한다.
3. z를 로지스틱 함수에 넣어 확률 P로 변환한다.
4. P가 기준값보다 크면 1, 작으면 0으로 분류한다.

 일반적으로 기준값은 0.5를 사용한다. 타이타닉 문제라면 생존 확률이 0.5 이상이면 생존으로 예측하고, 0.5보다 작으면 사망으로 예측한다.

P ≥ 0.5 → 1로 예측
P < 0.5 → 0으로 예측
타이타닉 문제: P(생존) ≥ 0.5 → 생존으로 예측 | P(생존) < 0.5 → 사망으로 예측

 다만 0.5라는 기준은 절대적인 값이 아니다. 문제의 목적에 따라 임계값은 조정할 수 있다. 예를 들어 불량 탐지나 질병 진단처럼 놓치면 위험한 문제에서는 재현율을 높이기 위해 기준값을 0.5보다 낮출 수도 있다.

📌 임계값 해석
 로지스틱 회귀는 먼저 확률을 예측하고, 그 확률을 임계값과 비교해 최종 클래스를 결정한다. 따라서 분류 결과는 모델 자체뿐 아니라 임계값 선택에도 영향을 받는다.

6. 로지스틱 회귀 계수 해석

 로지스틱 회귀의 계수는 선형회귀처럼 바로 “Y가 몇만큼 증가한다”로 해석하지 않는다. 로지스틱 회귀의 출력은 확률이고, 내부적으로는 오즈비와 로짓을 사용하기 때문이다.

log(P / (1 - P)) = w0 + w1X

 여기서 X가 1 증가할 때 로짓은 w1만큼 증가한다. 이를 오즈비 관점으로 바꾸면 X가 1 증가할 때 오즈비는 e^w1배가 된다.

w1 > 0 → X가 증가할수록 사건이 발생할 가능성이 커짐
w1 < 0 → X가 증가할수록 사건이 발생할 가능성이 작아짐
X가 1 증가할 때 오즈비 변화 = e^w1 배

 예를 들어 타이타닉 데이터에서 Sex_male의 계수가 음수라면, 남성일수록 생존 확률이 낮아지는 방향으로 모델이 학습했다는 의미이다. 반대로 어떤 변수의 계수가 양수라면 그 변수는 생존 확률을 높이는 방향으로 작용한다고 볼 수 있다.

❗ 계수 해석 시 주의점
 로지스틱 회귀의 계수는 확률 자체의 증가량이 아니라 로짓의 증가량이다. 따라서 계수의 부호는 영향 방향을 해석하는 데 유용하지만, 확률이 몇 %p 증가한다고 직접 해석하면 안 된다.

7. 분류 평가 지표가 필요한 이유

 회귀 문제에서는 실제값과 예측값의 차이를 계산해 MSE, RMSE, R² 등을 사용했다. 분류 문제에서는 예측한 범주가 실제 범주와 맞았는지 확인한다. 가장 단순한 지표는 정확도이다.

정확도 = 맞춘 개수 / 전체 개수

 하지만 정확도만으로는 모델을 제대로 평가하기 어려운 경우가 많다. 특히 클래스 비율이 불균형한 데이터에서는 정확도가 모델 성능을 왜곡할 수 있다.

 예를 들어 암 진단 모델이 있다고 하자. 전체 환자 100명 중 정상 환자가 95명이고 암 환자가 5명인 상황에서, 모델이 모든 사람을 정상이라고 예측하면 정확도는 95%이다.

전체 환자 100명 정상 환자 95명 암 환자 5명 모든 사람을 정상이라고 예측한 경우: 정확도 = 95 / 100 = 95%

 겉으로는 좋아 보이지만 실제 암 환자 5명을 한 명도 찾지 못했다. 이 모델은 실제 목적에는 실패한 모델이다. 이처럼 클래스 비율이 불균형한 데이터에서는 정확도 외에 다른 평가 지표를 반드시 함께 확인해야 한다.

8. 혼동 행렬

 혼동 행렬(Confusion Matrix)은 실제값과 예측값의 모든 경우를 2x2 표로 정리한 것이다. 이진 분류에서는 실제 양성/음성과 예측 양성/음성의 조합에 따라 TP, FP, FN, TN 네 가지 값이 나온다.

TP, FP, FN, TN 위치가 표시된 혼동 행렬 기본 구조 이미지를 삽입한다.

구분 의미
TP(True Positive) 실제 양성을 양성으로 올바르게 예측
FP(False Positive) 실제 음성을 양성으로 잘못 예측
FN(False Negative) 실제 양성을 음성으로 잘못 예측
TN(True Negative) 실제 음성을 음성으로 올바르게 예측
 표기법은 다음과 같이 이해하면 된다. True와 False는 실제값과 예측값이 같은지 다른지를 의미하고, Positive와 Negative는 모델이 양성으로 예측했는지 음성으로 예측했는지를 의미한다.
True / False: 실제값과 예측값이 같으면 True, 다르면 False
Positive / Negative: 모델이 양성으로 예측하면 Positive, 음성으로 예측하면 Negative

 앞의 암 진단 예시에서 모든 환자를 정상이라고 예측한 모델은 다음과 같다.

TP = 0 | FP = 0 | FN = 5 | TN = 95

 정확도는 높지만 TP가 0이고 FN이 5이므로 실제 양성 환자를 하나도 잡지 못했다. 이처럼 혼동 행렬을 보면 정확도 하나만으로 보이지 않던 모델의 실패를 확인할 수 있다.

9. 정확도, 정밀도, 재현율, F1-score

 혼동 행렬을 바탕으로 여러 분류 평가 지표를 계산할 수 있다. 정확도, 정밀도, 재현율, F1-score는 분류 모델 평가에서 가장 기본적으로 확인해야 하는 지표이다.

9.1 정확도

 정확도(Accuracy)는 전체 데이터 중 올바르게 예측한 비율이다.

Accuracy = (TP + TN) / (TP + TN + FP + FN)

 정확도는 전체적인 예측 성공률을 보기 쉽지만, 클래스 불균형 데이터에서는 위험할 수 있다. 다수 클래스를 많이 맞춘 것만으로 높은 점수가 나올 수 있기 때문이다.

9.2 정밀도

 정밀도(Precision)는 모델이 양성이라고 예측한 것 중 실제 양성의 비율이다.

Precision = TP / (TP + FP)

 정밀도는 모델의 예측 관점에서 보는 지표이다. 즉, “모델이 양성이라고 한 것 중 얼마나 진짜 양성인가?”를 확인한다. 예를 들어 불량이라고 판정한 제품 중 실제 불량품의 비율을 보고 싶다면 정밀도를 확인한다.

혼동 행렬에서 Precision 계산에 사용되는 TP와 FP 영역을 강조한 이미지를 삽입한다.

9.3 재현율

 재현율(Recall)은 실제 양성 데이터 중 모델이 양성으로 찾아낸 비율이다.

Recall = TP / (TP + FN)

 재현율은 데이터의 실제 정답 관점에서 보는 지표이다. 즉, “실제 양성 중 모델이 얼마나 찾아냈는가?”를 확인한다. 암 진단, 사기 탐지, 불량 탐지처럼 실제 양성을 놓치면 위험한 문제에서는 재현율이 매우 중요하다.

혼동 행렬에서 Recall 계산에 사용되는 TP와 FN 영역을 강조한 이미지를 삽입한다.

9.4 F1-score

 F1-score는 정밀도와 재현율의 조화 평균(정밀도와 재현율을 똑같이 중요하게 생각할 때)이다.

F1-score = 2 × Precision × Recall / (Precision + Recall)

 정밀도와 재현율은 서로 trade-off 관계가 있다. 재현율을 높이기 위해 양성 판정을 많이 내리면 실제 양성을 더 많이 찾을 수 있지만, 음성을 양성으로 잘못 예측하는 FP도 늘어날 수 있다. 그러면 정밀도는 낮아진다.

 반대로 아주 확실한 경우에만 양성으로 예측하면 정밀도는 높아질 수 있지만, 실제 양성을 놓치는 FN이 늘어나 재현율은 낮아질 수 있다. F1-score는 정밀도와 재현율의 균형을 보고 싶을 때 사용한다.

지표 공식 핵심 질문 주의점
Accuracy (TP + TN) / 전체 전체 중 얼마나 맞췄는가? 불균형 데이터에서 착시 가능
Precision TP / (TP + FP) 양성 예측 중 진짜 양성은 얼마나 되는가? 양성 판정을 엄격하게 하면 높아질 수 있음
Recall TP / (TP + FN) 실제 양성 중 얼마나 찾아냈는가? 양성 판정을 넓게 하면 높아질 수 있음
F1-score Precision과 Recall의 조화 평균 정밀도와 재현율의 균형은 어떤가? 두 지표 중 하나가 낮으면 함께 낮아짐

10. 정확도의 한계와 불균형 데이터

 앞의 암 진단 예시를 다시 보면 다음과 같다.

TP = 0 | FP = 0 | FN = 5 | TN = 95

 정확도는 95%로 높게 나온다.

Accuracy = (TP + TN) / 전체 = (0 + 95) / 100 = 95%

 하지만 재현율은 0이다.

Recall = TP / (TP + FN) = 0 / (0 + 5) = 0

 F1-score도 0이 된다. 정확도가 높더라도 실제 양성을 전혀 찾지 못하면 좋은 모델이 아니다. 이런 문제는 Y 값의 비율이 불균형할 때 자주 발생한다.

❗ 불균형 데이터 평가 원칙
 제조 공정의 불량 탐지 문제도 이와 비슷하다. 전체 제품 중 불량품은 매우 적을 수 있다. 이때 모든 제품을 정상이라고 예측하면 정확도는 높게 나올 수 있지만, 실제로 중요한 불량품을 놓치게 된다. 따라서 Accuracy만 보는 것이 아니라 Precision, Recall, F1-score를 함께 확인해야 한다.
불균형 데이터에서 고려할 점
1. 정확도만 보지 않고 Precision, Recall, F1-score를 함께 확인한다.
2. 소수 클래스가 중요하면 Recall 또는 F1-score를 우선 확인한다.
3. 클래스 비율을 맞추는 샘플링 기법을 고려한다.
4. 문제 목적에 맞게 임계값을 조정한다.

11. scikit-learn에서 로지스틱 회귀 사용하기

 Python에서는 sklearn.linear_model.LogisticRegression을 사용해 로지스틱 회귀 모델을 만들 수 있다. scikit-learn의 모델은 대부분 fit()으로 학습하고, predict()로 예측하는 일관된 구조를 가진다.

속성 의미
classes_ 클래스 Y의 종류
n_features_in_ 입력된 독립변수 X의 개수
feature_names_in_ 입력된 독립변수 X의 이름
coef_ 가중치
intercept_ 편향
메서드 의미
fit 데이터 학습
predict 클래스 예측
predict_proba 각 클래스에 속할 확률 예측

 predict()는 최종 분류 결과를 반환하고, predict_proba()는 각 클래스에 속할 확률을 반환한다. 이진 분류에서 보통 predict_proba(X)[:, 1]은 Y=1일 확률을 의미한다.

💡 predict와 predict_proba 차이
 predict()는 이미 임계값을 적용한 최종 클래스 결과이고, predict_proba()는 임계값 적용 전의 확률이다. 임계값을 조정하거나 ROC, PR Curve를 그릴 때는 확률값이 필요하다.

12. 타이타닉 데이터 실습 흐름

 타이타닉 실습은 데이터 불러오기, 변수 선택, 결측치 처리, 범주형 변수 인코딩, train/test 분할, 모델 학습, 예측, 평가 순서로 진행할 수 있다.

1. 데이터 불러오기
2. 필요한 변수 선택
3. 결측치 처리
4. 범주형 변수 인코딩
5. train/test 분할
6. 로지스틱 회귀 모델 학습
7. 예측
8. accuracy와 f1-score로 평가

 강의 흐름상 1차 모델은 Fare만 사용하고, 2차 모델은 Pclass, Sex, Fare를 사용한다. 이렇게 모델을 단계적으로 확장하면 변수를 추가했을 때 성능이 어떻게 달라지는지 비교할 수 있다.

1차 모델: Fare | 2차 모델: Pclass, Sex, Fare

13. 타이타닉 로지스틱 회귀 예시 코드

 아래 코드는 seaborn의 타이타닉 데이터를 사용한 예시이다. Kaggle 원본 데이터와 컬럼명이 약간 다를 수 있지만, 학습 흐름은 같다.

import pandas as pd
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, classification_report

# 데이터 불러오기
titanic = sns.load_dataset("titanic")

# 필요한 변수 선택
df = titanic[["survived", "pclass", "sex", "fare"]].copy()

# 결측치 제거
df = df.dropna()

print(df.head())

13.1  성별에 따른 생존 분포 확인

 모델링 전에 먼저 데이터를 시각화하여 주요 변수와 정답 사이의 관계를 확인한다. 성별에 따른 생존 여부 countplot은 타이타닉 데이터에서 가장 직관적으로 확인할 수 있는 EDA 결과이다.

import seaborn as sns
import matplotlib.pyplot as plt

sns.countplot(data=df, x="sex", hue="survived")
plt.title("Survival Count by Sex")
plt.show()

 이 시각화를 통해 남성과 여성의 생존 비율 차이를 확인할 수 있다. 이 단계는 모델링 전에 데이터를 이해하는 EDA(Exploratory Data Analysis, 탐색적 데이터 분석)에 해당한다.

13.2  1차 모델 : Fare만 사용

 첫 번째 모델에서는 요금 Fare 하나만 사용한다. 이 모델은 요금이 생존 여부에 어느 정도 영향을 주는지 확인하는 기준 모델로 볼 수 있다.

# X, y 분리
X = df[["fare"]]
y = df["survived"]

# train/test 분할
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

# 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 평가
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("Accuracy:", accuracy)
print("F1-score:", f1)
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

 Fare 하나만 사용하면 요금이 생존 여부에 어느 정도 영향을 주는지 볼 수 있다. 다만 생존 여부를 설명하기에는 정보가 부족할 가능성이 높다. 그래서 다음 단계에서는 티켓 등급과 성별을 함께 사용한다.

13.3  2차 모델 : Pclass, Sex, Fare 사용

 Sex는 문자형 범주 데이터이므로 인코딩이 필요하다. 여기서는 pd.get_dummies()를 사용한다. drop_first=True를 사용하면 sex_male 하나의 컬럼만 생성된다. 이 값이 1이면 남성, 0이면 여성을 의미한다.

# 범주형 변수 인코딩
df_encoded = pd.get_dummies(
    df,
    columns=["sex"],
    drop_first=True
)

print(df_encoded.head())
# X, y 분리
X = df_encoded[["pclass", "fare", "sex_male"]]
y = df_encoded["survived"]

# train/test 분할
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]

# 평가
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("Accuracy:", accuracy)
print("F1-score:", f1)

print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

print("Classification Report:")
print(classification_report(y_test, y_pred))

 이 모델은 Pclass, Fare, Sex를 함께 고려한다. 단일 변수 모델보다 생존 여부를 더 잘 설명할 가능성이 높다. 이처럼 모델 성능은 사용하는 변수에 따라 달라질 수 있으므로, 변수 선택과 전처리는 분류 모델링에서 매우 중요하다.

13.4  모델 속성 확인

 학습된 로지스틱 회귀 모델은 클래스 종류, 입력 변수 개수, 변수 이름, 가중치, 편향 등을 속성으로 가지고 있다. 이를 확인하면 모델이 어떤 변수를 어떤 방향으로 학습했는지 살펴볼 수 있다.

print("클래스 종류:", model.classes_)
print("입력 변수 개수:", model.n_features_in_)
print("입력 변수 이름:", model.feature_names_in_)
print("가중치:", model.coef_)
print("편향:", model.intercept_)
coef_df = pd.DataFrame({
    "feature": X.columns,
    "coef": model.coef_[0]
})

print(coef_df)

 계수가 양수이면 해당 변수가 증가할수록 생존 확률이 증가하는 방향으로 작용하고, 음수이면 생존 확률이 감소하는 방향으로 작용한다. 단, 앞에서 설명했듯이 계수는 확률 자체가 아니라 로짓에 대한 영향으로 해석해야 한다.

14. 다중 로지스틱 회귀

 다중 로지스틱 회귀는 여러 독립변수를 사용해 이진 분류를 수행하는 로지스틱 회귀이다. 단일 로지스틱 회귀가 하나의 변수로 분류한다면, 다중 로지스틱 회귀는 여러 변수를 동시에 사용한다.

단일 로지스틱 회귀: 생존 여부 = f(Fare)
다중 로지스틱 회귀: 생존 여부 = f(Pclass, Sex, Age, Fare, Embarked, FamilySize ...)

 타이타닉 문제에서는 Pclass, Sex, Age, Fare, Embarked, FamilySize 같은 변수 확장이 가능하다. SibSp와 Parch는 각각 형제·배우자 수, 부모·자식 수를 의미한다. 이 둘을 더하고 본인 1명을 추가하면 가족 규모를 나타내는 FamilySize 변수를 만들 수 있다.

titanic = sns.load_dataset("titanic")

df = titanic[[
    "survived",
    "pclass",
    "sex",
    "age",
    "sibsp",
    "parch",
    "fare",
    "embarked"
]].copy()

# 가족 수 변수 생성
df["family_size"] = df["sibsp"] + df["parch"] + 1

# 필요한 컬럼만 사용
df = df[[
    "survived",
    "pclass",
    "sex",
    "age",
    "fare",
    "embarked",
    "family_size"
]]

# 결측치 처리
df = df.dropna()

# 범주형 변수 인코딩
df_encoded = pd.get_dummies(
    df,
    columns=["sex", "embarked"],
    drop_first=True
)

X = df_encoded.drop(columns=["survived"])
y = df_encoded["survived"]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print("Accuracy:", accuracy_score(y_test, y_pred))
print("F1-score:", f1_score(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

 변수를 많이 넣는다고 항상 성능이 좋아지는 것은 아니다. 불필요한 변수가 들어가면 모델이 복잡해지고, 해석이 어려워질 수 있다. 따라서 다양한 변수를 넣고 빼면서 accuracy와 f1-score를 비교해야 한다.

🔍 변수 확장 관점
 다중 로지스틱 회귀는 여러 변수를 동시에 고려할 수 있다는 장점이 있다. 하지만 변수 추가가 곧 성능 향상을 의미하지는 않는다. 결측치 처리, 인코딩 방식, 변수 간 상관관계, 모델 해석 가능성을 함께 고려해야 한다.

15. 선형회귀와 로지스틱 회귀 비교

 선형회귀와 로지스틱 회귀는 모두 선형 모델의 아이디어를 기반으로 한다. 두 모델 모두 모델 생성이 쉽고, 가중치 또는 회귀계수를 통해 변수의 영향을 해석하기 쉽다는 장점이 있다. 또한 X 변수에는 수치형 변수와 범주형 변수를 모두 사용할 수 있다. 단, 범주형 변수는 반드시 인코딩해야 한다.

구분 선형회귀 로지스틱 회귀
문제 유형 회귀 분류
종속변수 Y 수치형 범주형
예측 결과 연속적인 숫자 특정 클래스 또는 확률
대표 평가 지표 MSE, R² Accuracy, F1-score
sklearn 모델 LinearRegression LogisticRegression
주요 메서드 fit, predict fit, predict, predict_proba

 선형회귀는 숫자를 예측하는 모델이고, 로지스틱 회귀는 범주를 분류하는 모델이다. 로지스틱 회귀는 선형회귀의 구조를 사용하지만, 종속변수를 확률 형태로 바꾸기 위해 로지스틱 함수를 적용한다.

16. 로지스틱 회귀의 장점과 한계

 로지스틱 회귀는 분류 문제에서 가장 먼저 기준 모델로 사용하기 좋은 알고리즘이다. 구조가 단순하고 학습이 빠르며, 계수를 통해 변수의 영향 방향을 어느 정도 해석할 수 있다.

장점 설명
직관적 구조 선형식과 시그모이드 함수를 이용하므로 이해하기 쉽다.
간단한 모델링 모델 생성과 학습이 비교적 간단하다.
해석 가능성 계수를 통해 변수의 영향 방향을 확인할 수 있다.
확률 예측 predict_proba를 통해 확률 기반 예측이 가능하다.
한계 설명
비선형 관계 표현 한계 복잡한 비선형 관계를 모델링하기 어렵다.
상호작용 자동 포착 한계 변수 간 상호작용을 자동으로 잘 잡아내지는 못한다.
인코딩 필요 범주형 변수는 숫자형으로 변환해야 한다.
불균형 데이터 주의 클래스 불균형이 심하면 accuracy만으로는 평가가 어렵다.

 따라서 로지스틱 회귀는 분류 문제의 기본 모델로 적합하다. 먼저 로지스틱 회귀로 기준 성능을 만들고, 이후 결정트리, 랜덤 포레스트, XGBoost 같은 더 복잡한 모델과 비교하는 방식이 좋다.

17. 데이터 분석 프로세스 관점에서의 로지스틱 회귀

 로지스틱 회귀를 배웠다고 해서 모든 분류 문제를 바로 해결할 수 있는 것은 아니다. 실제 데이터 분석 업무에서 모델링은 전체 과정의 일부에 불과하다. 많은 시간은 데이터 수집, 전처리, 결측치 처리, 이상치 처리, 인코딩, 스케일링, EDA에 사용된다.

데이터 사이언스에서 모델링보다 데이터 수집과 전처리에 많은 시간이 들어간다는 기대와 현실 비교

데이터 수집 → 데이터 전처리 → EDA → 모델링 및 평가 → 배포

데이터 수집, 데이터 전처리, EDA, 모델링 및 평가, 배포로 이어지는 전체 데이터 분석 프로세스 이미지를 삽입한다.

단계 주요 내용
데이터 수집 분석에 필요한 데이터 확보
데이터 전처리 결측치, 이상치, 중복, 타입, 인코딩 처리
EDA 기초 통계, 시각화, 변수 관계 확인
모델링 및 평가 모델 학습, 예측, 성능 평가
배포 실제 서비스 또는 업무 프로세스에 적용

 로지스틱 회귀는 이 중 모델링 및 평가 단계에서 사용하는 대표적인 분류 모델이다. 하지만 좋은 모델을 만들기 위해서는 그 이전 단계인 전처리와 EDA가 반드시 필요하다.

📌 실무 관점
 분류 모델의 성능은 알고리즘만으로 결정되지 않는다. 데이터가 어떤 기준으로 수집되었는지, 결측치와 이상치를 어떻게 처리했는지, 범주형 변수를 어떻게 인코딩했는지, 어떤 평가 지표를 선택했는지가 모델 결과에 직접적인 영향을 준다.

18. 핵심 정리

 로지스틱 회귀는 이진 분류 문제에서 사용하는 대표적인 모델이다. 회귀 문제는 숫자를 예측하고, 분류 문제는 범주를 예측한다.

회귀 문제: 숫자를 예측한다.
분류 문제: 범주를 예측한다.

 타이타닉 생존 예측 문제는 사망 0, 생존 1을 정답으로 갖는 이진 분류 문제이다. 입력 변수로는 티켓 등급, 성별, 나이, 요금, 승선 항구 등을 사용할 수 있다.

Y: 사망 0, 생존 1
X: 티켓 등급, 성별, 나이, 요금, 승선 항구 등

 선형회귀는 확률을 예측하기에 한계가 있다. 예측값이 0보다 작거나 1보다 커질 수 있기 때문이다. 로지스틱 회귀는 시그모이드 함수를 사용해 출력값을 0과 1 사이의 확률로 변환한다.

P = 1 / (1 + e^(-z))
z = w0 + w1X
P = sigmoid(z)
P ≥ 0.5 → 1
P < 0.5 → 0

 분류 모델은 accuracy만으로 평가하면 위험할 수 있다. 특히 클래스 불균형 데이터에서는 정확도가 높아도 실제 중요한 클래스를 전혀 찾지 못할 수 있다. 따라서 혼동 행렬을 기반으로 Accuracy, Precision, Recall, F1-score를 함께 확인해야 한다.

지표 핵심 의미
Accuracy 전체 중 맞춘 비율
Precision 양성 예측 중 실제 양성 비율
Recall 실제 양성 중 모델이 찾아낸 비율
F1-score Precision과 Recall의 조화 평균
 타이타닉 실습에서는 처음에는 Fare 하나만 사용하고, 이후 Pclass, Sex, Fare 등 여러 변수를 함께 사용해 모델을 개선할 수 있다. 더 나아가 Age, Embarked, FamilySize 같은 변수를 추가해 다중 로지스틱 회귀 모델을 만들 수 있다.
🧩 한 문장 결론
 로지스틱 회귀는 선형식의 결과를 시그모이드 함수로 변환해 0과 1 사이의 확률을 예측하고, 이 확률을 기준으로 클래스를 분류하는 기본적인 이진 분류 모델이다.

출처

※ KDT 빅데이터 기반 품질 관리(QA/QC) 양성 과정 학습 정리

'TIL > 머신러닝' 카테고리의 다른 글

선형 모델 이후의 모델링 프로세스 실습  (0) 2026.06.29
머신러닝 : 데이터 전처리부터 모델링과 평가까지  (0) 2026.06.18
머신러닝의 정의와 학습 유형 그리고 모델링 흐름 정리  (0) 2026.06.17
머신러닝 기초와 선형회귀 이해하기  (0) 2026.06.17
VS Code 설치 및 설정 방법 : Python과 Jupyter Notebook 실습 환경 조성하기  (0) 2026.06.17
'TIL/머신러닝' 카테고리의 다른 글
  • 선형 모델 이후의 모델링 프로세스 실습
  • 머신러닝 : 데이터 전처리부터 모델링과 평가까지
  • 머신러닝의 정의와 학습 유형 그리고 모델링 흐름 정리
  • 머신러닝 기초와 선형회귀 이해하기
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
로지스틱 회귀와 분류 평가 지표 정리
상단으로

티스토리툴바