목차
1. 분류 알고리즘(Classification)
1-1 분류의 주요 목표
1-2 분류 알고리즘의 특징
1-3클래스 개수에 따른 분류 종류
2. 로지스틱 회귀(Logistic Regression)
2-1 로지스틱 회귀의 작동 원리
2-2 로지스틱 회귀 학습 과정
3. 성능 성가 지표
3-1 혼동 행렬(Confusion Matrix)
3-2 정확도(Accuracy)
3-3 정밀도(Precision)
3-4 재현율(Recall)
3-5 F1-Score
4. Scikit-learn을 이용한 분류 성능 평가
1. 분류 알고리즘(Classification)
분류는 주어진 데이터를 특정 범주(Category 또는 클래스(Class)로 나누는 머신러닝 작업이다.
즉, 입력 데이터를 분석하여 해당 데이터가 어떤 클래스에 속하는지 예측하는 문제이다.
예를 들어, 다음과 같은 문제들이 분류 문제에 해당된다.
- 이메일이 스팸인지 정상 메일인지 분류
- 환자가 암인지 정상인지 분류
- 금융 거래가 정상거래인지 사기 거래인지 분류
분류 모델은 단순히 클래스만 출력하는 것이 아니라 '각 클래스에 속할 확률(probability)을 계산하기도 한다.
1-1 분류의 주요 목표
1) 정확한 예측
분류 모델의 가장 중요한 목표는 데이터를 정확하게 분류하는 것이다.
모델은 각 데이터가 특정 클래스에 속할 확률을 계산하고, 그 확률을 기준으로 최종 크래스를 결정한다.
예)
- 스팸일 확률 = 0.82 → 스팸
- 스팸일 확률 = 0.15 → 정상 메일
과 같이 분류가 이루어진다.
2) 실용적 적용
분류 알고리즘은 다양한 실제 문제에 활용된다.
예)
- 보안 시스템 : 악성 트래픽 탐지
- 이메일 시스템 : 스팸 메일 필터링
- 의료 시스템 : 질병 진다
실제 문제에서는 높은 정확도를 유지하면서 오탐(False Positive)을 줄이고, 중요한 문제를 놓치지 않도록 미탐(False Negative)을 최소화하는 것이 중요하다
1-2 분류 알고리즘의 특징
분류 알고리즘은 다음과 같은 특징을 가진다.
- 입력 데이터 : 다양한 특징을 가진 데이터
- 예) 이메일 제목, 발신자, 메시지 내용
- 출력 데이터 : 데이터가 속한 범주 또는 클래스
- 예) 스팸/정상
1-3 클래스 개수에 따른 분류 종류
- 이진 분류(Binary Classfication)
- 두 개 클래스 중 하나로 분류하는 문제
- 예) 스팸/정상, 암/정상 등
- 다중 클래스 분류(Multi-Class Classification)
- 세 개 이상의 클래스 중 하나로 분류하는 문제
- 예) 뉴스 기사 분류, 정치/경제/스포츠/IT
1-4 분류 알고리즘의 흐름
1) 데이터 수집 및 전처리
- 먼저 모델 학습에 사용할 데이터를 수집하고 정리한다.
- 이 과정에서 다음 작업이 이루어진다.
- 결측값 처리
- 데이터 정규화
- 불필요한 특징 제거
- 학습 데이터/테스트 데이터 분리
2) 모델 학습
- 학습 데이터(X)와 정답(Label)을 사용하여 모델을 학습시킨다.
- 모델은 입력 데이터와 정답 사이의 패턴을 학습하게 된다.
3) 모델 예측
- 학습된 모델에 새로운 데이터를 입력하면, 모델은 해당 데이터가 어떤 클래스에 속할지 예측한다.
4) 모델 평가
- 테스트 데이터를 이용하여 모델 성능을 평가한다.
- 이때 다음과 같은 평가 지표가 사용된다.
- 정확도(Accuracy)
- 정밀도(Precision)
- 재현율(Recall)
- F1-.Score
2. 로지스틱 회귀(Logistic Regression)
로지스틱 회귀는 분류 문제를 해결하기 위한 지도 학습 알고리즘이다.
이름에 '회귀'가 포함되어 있지만, 실제로는 연속 값을 예측하는 것이 아니라 데이터를 특정 클래스로 분류하는 데 사용된다.
특히 이진 분류(Binary Classification) 문제에서 널리 사용된다.
예를 들어,
이 이메일이 스팸일 확률 = 0.85
와 같이 특정 클래스에 속할 확률을 계산한 후, 해당 확률을 기준으로 최종 클래스를 결정한다.
2-1 로지스틱 회귀의 작동 원리
1) 선형 결합 계산
먼저 입력 데이터들을 이용해 다음과 같은 값을 계산한다.
z = β₀ + β₁x₁ + β₂x₂ + ... + βₖxₖ
- z : 입력 특징들의 선형 결합 값
- β₀: 절편(Bias)
- β₁, β₂ ... βₖ : 입력 데이터의 특
- x₁, x₂ ... x : 입력 데이터의 특
이 값 z는 이후 확률 값을 계산하기 위한 입력 값으로 사용된다.
2) 시그모이드 함수 적용
로지스틱 회귀에서는 위에서 계산한 값을 시그모이드 함수(Sigmoid Function)에 입력한다.
σ(z) = 1 / (1 + e^(-z))
시그모이드 함수는 다음과 같은 특징이 있다.
- 출력 값 범위 : 0~1
- 결과를 확률 값으로 해석 가능
즉, 계산된 값은 특정 클래스에 속할 확률을 의미하게 된다.
예) σ(z) = 0.82 → 해당 데이터가 특정 클래스에 속할 확률이 82%이다.
3) 클래스 결정
시그모이드 함수 결과를 기준으로 클래스를 결정한다.
일반적으로 임계값(threshold) = 0.5를 사용한다.
예시
- 확률 ≥ 0.5 → 클래스 1
- 확률 < 0.5 → 클래스 0
하지만, 문제에 따라 임계값을 변경할 수 있다.
2-2 로지스틱 회귀 학습 과정
1) 가설 설정
입력 데이터의 선형 결합을 계산한 뒤, 시그모이드 함수를 이용해 확률을 계산한다.
2) 손실 함수 정의
로지스틱 회귀는 로그 손실 함수(Log Loss)를 사용한다.
손실 함수는 모델의 예측이 실제 값과 얼마나 차이가 있는지를 계산한다.
3) 모델 학습
모델은 경사 하강법(Gradient Descent)을 사용하여, 가중치와 절편을 반복적으로 업데이트한다.
목표는 손실 함수 값을 최소화하는 것이다.
3. 성능 평가지표
분류 모델의 성능을 평가하기 위해 다양한 지표가 사용된다.
대표적인 지표는 다음과 같다.
- 정확도(Accuracy)
- 정밀도(Precision)
- 재현율(Recall)
- F1-.Score
이 모든 지표는 혼동 행렬(Confusion Matrix)을 기반으로 계산된다.
3-1 혼동 행렬(Confusion Matrix)
혼돈 행렬은 모델의 예측 결과와 실제 값을 비교하는 표이다.
| 항목 | 실제 Positive | 실제 Negative |
| 예측 Positive | True Positive(TP) | Flase Positive(FP) |
| 예측 Negative | Fasle Negative(FN) | True Negative(TN) |
- True Positive(TP) : 실제 Positive를 Positive로 정확히 예측
(암 환자를(P) 암(P)이라고 정확히 판단) - True Native(TN) : 실제 Negatvie를 Negative로 예측하게 예측
(정상 환자를(N) 정상(T)이라고 정확히 판단) - False Positive(fP) : 실제 Negative인데 Positive로 잘못 판단
- Fasle Negative(FN) : 실제 Positive인데 Negative로 잘못 판단
3-2 정확도(Accuracy)
전체 데이터 중 올바르게 예측한 비율이다.
Accuracy = (TP + TN) / 전체 데이터(TP+TN+FP+FN)
정확도는 전체적인 예측 성능을 간단히 측정할 수 있다.
데이터의 클래스 불균형(Positive와 Negative의 비율이 크게 차이날 경우)에서 신뢰도가 낮아질 수 있다.
3-3 정밀도(Precision)
모델이 Positive라고 예측한 것 중 실제로 Positive인 비율
즉, 모델이 Positive라고 판단한 결과가 얼마나 정확한지를 나타내는 지표이다.
Precision = TP / (TP+FP)
정밀도는 False Positive가 중요한 문제에서 중요하다.
예를 들어, 스팸 메일을 분류하는 경우 정상 메일을 스팸으로 분류하면 안된다.
정밀도는 False Positive를 줄이는 데 중점을 둔다.
하지만 정밀도를 지나치게 높이려고 하면 모델이 Positive라고 판단하는 기준이 매우 엄격해질 수 있다.
이 경우 실제 Positive 데이터도 Negative로 판단될 가능성이 증가하여 Recall(재현율)이 낮아질 수 있다.
3-4 재현율(Recall)
실제 Positive 중에서 모델이 찾아낸 비율
Recall = TP / (TP+FN)
재현율은 False Negative가 중요한 문제에서 중요하다.
예) 암 진단, 보안 침입 탐지
즉, 문제가 있는 것을 놓치지 않는 것이 중요하다.
보안 분야에서도 마찬가지로
- 공격을 놓치는 것(FN)은 매우 위험하다.
- 반면, 정상 데이터를 공격으로 판단(FP)은 어느 정도 허용 가능하다.
재현율은 False Negative를 줄이는 데 중점을 둔다.
주의할 점은 Positive로 예측하는 경향이 커져 정밀도가 낮아질 수 있다.
3-5 F1-Score
F1-socre는 정밀도와 재현율의 균형을 고려한 지표이다.
F1 = 2 × (Precision × Recall) / (Precision + Recall)
정밀도와 재현율을 동시에 고려해야 할 때 사용된다.
F1-Score는 정밀도와 재현율을 모두 종합적으로 평가할 수 있다.
다만, 클래스 불균형이 심한 데이터에서는 추가적인 분석이 필요하다.
4. Scikit-learn을 이용한 분류 성능 평가
Scikit-learn을 사용하면 분류 모델을 학습한 뒤, 다양한 성능 평가 지표를 쉽게 계산할 수 있다.
이번 예제에서는 Iris 데이터셋을 사용하여 꽃이 setosa인지 아닌지를 분류하고, 정확도, 정밀도, 재현율, F1-Score, 혼동 행렬을 확인해본다.
예제 1) 필요한 라이브러리 불러오기
분류 모델에 학습과 성능 평가에 필요한 라이브러리를 불러온다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score,
confusion_matrix,
classification_report
)
각 라이브러리의 역할은 다음과 같다.
- load_Iris : Irsis 데이터셋 불러오기. sklearn에서 기본적으로 제공하고 있는 데이터셋
- tran_test_split : 학습용/테스트용 데이터 분리
- LogisticRegression : 로지스틱 회귀 분류 모델
- accuracy_score, precision_score, recall_score, f1_score : 성능 평가 지표
- confusion matrix : 혼동 행렬 계산
- classification_report : 분류 결과를 종합적으로 출력
예제 2) 데이터셋 로드 및 분리
Iris 데이터셋을 불러오고, 이를 이진 분류 문제로 변환한다.
data = load_iris()
X = data.data
y = (data.target == 0).astype(int) # setosa이면 1, 아니면 0
- astype :데이터의 자료형을 변환하는 함수
- X : 입력 데이터(꽃받침 길이, 꽂받침 너비, 꽃잎 길이, 꽃잎 너비)
- y : 정답 레이블(setosa인지 아닌지 분류)
예제 3) 학습용 데이터와 테스트용 데이터로 나누기
모델 학습과 성능 평가를 위해 데이터를 학습용과 테스트용으로 나눈다.
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
- test_size : 전체 데이터의 20%를 테스트 데이터로 사용하겠다.
- random_state=42 : 실행할 때마다 동일한 데이터 분할 결과를 얻기 위한 설정
이 과정을 통해
- 학습 데이터 : X_train, y_train
- 테스트 데이터 : X_test, y_test
가 생성된다.
예제 4) 로지스틱 회귀 모델 학습
로지스틱 회귀 모델을 생성하고 학습한다.
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
- LogisticRegression(): 로지스틱 회귀 모델 생성
- max_iter=1000 : 최대 반복 횟수 설정
- fit(X_train, y_train) : 학습 데이터로 모델 학습
즉, 모델은 학습 데이터를 이용하여, 입력 특징과 클래스 사이의 패턴을 학습하게 된다.
예제 5) 테스트 데이터 예측
학습된 모델을 사용하여 테스트 데이터에 대한 예측을 수행한다.
y_pred = model.predict(X_test)
- predict(x_test) : 테스트 데이터를 입력으로 받아 예측 결과를 반환
즉, 모델이 테스트 데이터의 각 샘플이 setosea인지 아닌지 판단하는 단계이다.
예제 6) 평가 지표 계산
이제 예측 결과를 바탕으로 다양한 성능 평가 지표를 계산한다.
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
- accracy_socre() : 정확도(전체 데이터 중 올바르게 분류한 비율)를 계산
- precision_score() 정밀도(Positive라고 예측한 것 중 실제 Positive 비율)를 계산
- recall_score() : 재현율(실제 Positive 중에서 모델이 제대로 찾아낸 비율)를 계산
- fl_score() : 정밀도와 재현율의 조화 평균 계산
예제 7) 결과 출력
계산한 성능 평가 지표를 출력한다.
print("정확도(Accuracy):", accuracy)
print("정밀도(Precision):", precision)
print("재현율(Recall):", recall)
print("F1-Score:", f1)
이 값을 통해 모델이 얼마나 잘 분류하고 있는지 확인할 수 있다.
예제 7) 출력 결과
정확도(Accuracy): 1.0
정밀도(Precision): 1.0
재현율(Recall): 1.0
F1-Score: 1.0
이 모델은 테스트 데이터에서 정확도, 정밀도, 재현율, F1-score가 모두 1.0으로 나타났으며, 이는 모델이 모든 데이터를 정확하게 분류했다는 것을 의미한다.
즉, 오탐(False Positive)과 미탐(False Negative)이 모두 발생하지 않은 매우 높은 성능의 분류 모델이라고 해석할 수 있다.
예제 8) 분류 보고서 출력
혼동 행렬을 통해 TP, TN, FP, FN 값을 확인한다.
print("\n혼동 행렬 (Confusion Matrix):\n", confusion_matrix(y_test, y_pred))
혼동 행렬은 다음과 같은 형태로 출력된다.
[[TN FP]
[FN TP]]
예제 8) 출력 결과
혼동 행렬 (Confusion Matrix):
[[20 0]
[ 0 10]]
True Negative (TN) = 20
- 실제로 Negative인 데이터 20개를 모델이 Negative로 정확하게 예측
- 즉, 정상 데이터를 정상으로 판단
False Positive (FP) = 0
- 실제로 Negative인데 Positive로 잘못 예측한 경우
- 여기서는 0개
- 즉 오탐(False Positive)이 없음
False Negative (FN) = 0
- 실제로 Positive인데 Negative로 잘못 예측한 경우
- 여기서는 0개
- 즉 미탐(False Negative)이 없음
True Positive (TP) = 10
- 실제로 Positive인 데이터 10개를 모델이 Positive로 정확하게 예측
👉 머신러닝 & 딥러닝 기초 22편 | KNN 알고리즘 개념부터 Scikit-learn 구현까지
'머신러닝&딥러닝' 카테고리의 다른 글
| 머신러닝 & 딥러닝 기초 23편 | 비지도학습 - 군집화(Clustering) (0) | 2026.03.18 |
|---|---|
| 머신러닝 & 딥러닝 기초 22편 | KNN 알고리즘 개념부터 Scikit-learn 구현까지 (0) | 2026.03.17 |
| 머신러닝 & 딥러닝 기초 20편 | 지도 학습 - 선형 회귀, 성능 평가 (0) | 2026.03.17 |
| 머신러닝 & 딥러닝 기초 19편 | 지도 학습 vs 비지도 학습 정리 (0) | 2026.03.16 |
| 머신러닝 & 딥러닝 기초 18편 | 상관관계와 회귀 분석 (0) | 2026.03.16 |