분류(Classification) 알고리즘
어떤 데이터가 어떤 범주(클래스)에 속하는지를 자동으로 판단하는 알고리즘
예 :
- 이메일이 스팸 메일인지 아닌지 분류하기
- 은행에서 고객이 대출을 갚을 수 있는지 여부 판단하기
- 사진 속 동물이 강아지인지 고양이인지 판단하기
대표적인 분류 알고리즘
1. K-최근접 이웃 (KNN, K-Nearest Neighbors) (=끼리끼리)
새로운 데이터가 들어오면 주변에 있는 가장 가까운 K개의 데이터를 보고, 가장 많은 데이터가 속한 범주로 분류하는 방법
* 거리 기반 알고리즘
KNN 은 '가깝다'라는 개념을 사용함
데이터를 점으로 표현하고, 각 점 사이의 거리를 측정함.
가장 가까운 K개의 데이터가 속한 그룹으로 분류
예 : 키와 몸무게로 축구선수, 농구선수를 분류할 때,
키 170, 몸무게 65인 사람은 주변의 가장 가까운 3명 (K=3)을 보고 더 많이 속한 그룹을 따라감
예 (2) :
- 민수는 축구를 좋아하는지 농구를 좋아하는지 궁금함.
- 민수의 친한 친구 5명 중에 축구를 좋아하는 친구가 3명, 농구를 좋아하는 친구가 2명이라면 민수는 축구를 좋아할 가능성이 더 높다고 판단
장점 : 간단하고 이해하지 쉬우며 학습 시간이 매우 짧음
단점 : 데이터가 너무 많거나 복잡하면 성능 떨어짐 + 계산 오래 걸림
: 거리 기반이기 때문에 데이터의 스케일이 다르면 정확도가 떨어질 수 있음 -> 데이터 정규화 해야함
* 정규화란? (Normalication)
데이터의 범위를 통일하는 작업
예 : 몸무게 30kg ~ 100kg를 0~1 사이로 변환하여 분석에 사용하기 좋게 만드는 과정
실무 활용 예시
- 고객의 특성을 기반으로 구매할 가능성이 높은 상품 추천
- 영화 추천 시스템 (비슷한 취향의 사용자 기반 추천)
- 이메일 스팸 필터링 (유사한 이메일과 거리 계산)
2. 결정 트리 (Decision Tree, DT) (=스무고개 라잌...)
데이터를 특정 조건에 따라 단계별로 나눠 최종적으로 분류하는 방법
나무 가지처럼 여러 개의 조건을 통해 최종 분류함.
예 :
- 과일을 분류한다고 했을 때
크기가 큰가요? → 네 → 색깔이 빨간가요? → 네 → 사과
아니오 → 수박
아니오 → 색깔이 노란가요? → 네 → 바나나
아니오 → 포도
중요한 개념
(1) 노드(Node) : 질문(조건)을 나타내는 지점 (예 : 크기가 큰가요?)
(2) 가지 (Branch) : 질문의 답 (Yes/No)을 따라 나뉘는 경로 (예: "네", "아니오")
(3) 잎 (Leaf) : 최종 분류 결과 (예 : 사과, 바나나, 수박, 포도)
장점 : 매우 직관적이고 이해하기 쉬움
: 분류 결과를 시각화하여 쉽게 설명할 수 있음 (결과 해석이 중요할 때 사용)
단점 : 너무 많은 조건으로 나누면(=트리 계층 구조(hierachy)가 커지면 과적합(overfittiong) 현상이 발생하여 새 데이터에 잘 맞지 않을 수 있음
: 작은 데이터 변화에도 나무 구조가 크게 변할 수 있다.
* 과적합이란?
훈련 데이터에는 너무 잘 맞지만, 새 데이터에선 정확도가 떨어지는 현상
시험에서 기출문제만 외웠는데, 새로운 문제는 못푸는 것.
실무 활용
- 은행 대출 승인 결정
- 환자 질병 진단
- 고객 이탈 예측 및 원인 분석
3. 서포트 벡터 머신 (SVM, support Vector Machine)
두 집단을 가장 명확하게 나눌 수 있는 경계선 또는 평면 (마진)을 찾아내는 방법
예 : 책상 위에 연필과 지우개가 섞여있을 때, 연필과 지우개를 구분하는 가장 좋은 경계선을 찾는 과정과 비슷함
두 그룹 사이에 가장 넓은 공간을 가지는 경계를 선택함
핵심 개념 :
1. 결정 경계 (Decision Boundary)
- 두 클래스를 나누는 기준선을 의미함.
- 2차원 데이터에서는 선 형태, 3차원 데이터에서는 평면 형태, 더 높은 차원의 데이터에서는 초평면(hyperplane)으로 불림
예 :
운동장에 농구공(🔵)과 축구공(⚽)이 섞여 있다고 생각하자.
이 두 종류의 공을 구분하기 위해 줄을 하나 그어서 분리한다고 했을 때 이 줄이 결정 경계임
⚽ ⚽ ⚽ | 🔵 🔵 🔵 🔵
2. 서포트 벡터 (Support Vector)
- 결정 경계와 가장 가까운 데이터
- SVM은 이 서포트 벡터를 기준으로 결정 경계를 만듦
예 :
두 그룹 사이의 가장 가까운 공들이 서포트 벡터가 됨
⚽ ⚽ | 🔵 🔵
↑ ↑ ↑
서포트 벡터 서포트 벡터
결정경계
3. 마진(Margin)
두 클래스 사이의 경계선으로부터 양쪽 서포트 벡터까지의 거리
- SVM은 이 마진을 최대한 넓게 하는 경계선을 찾음
- 마진이 넓을 수록 좋은 분류 성능을 보임
예 :
축구공과 농구공 사이에 선을 그을 때 가능한 두 종류의 공 사이 간격을 넓게 유지하려고 함
⚽ | 🔵
← 마진(최대 거리) →
+) 만약 데이터를 잘 나누기 어려울 때? (커널 함수)
데이터가 아래처럼 직선 또는 평면으로 나눌 수 없을 정도로 뒤죽박죽쓰~?
⚽ 🔵 ⚽ 🔵 ⚽ 🔵 ⚽ 🔵
=> Kernel function 이라는 기법을 사용함 = 데이터를 더 높은 차원으로 옮겨서 분리하기 쉽게 만드는 방법
예 : 종이를 구기는 비유
깨끗한 종이 위에 빨간점과 파란점이 섞여있을 때,
이 상태에선 선 하나로 나누기 어렵다면, 종이를 구겨서 입체적인 공간을 만들어 두 점을 나눌 수 있게 한다.
장점 : 복잡한 데이터를 잘 구분함
: 데이터의 차원이 높거나 복잡한 형태라도 좋은 성능을 보임
: 과적합을 잘 방지함
: 데이터의 개수가 적어도 잘 동작함
단점 : 성능을 좋게 하려면 하이퍼파라미터라는 설정값을 잘 조정해야함.
: 데이터가 많아지면 연산량이 증가해 느려질 수 있음
: 결과가 직관적이지 않을 수 있음
* 하이퍼파라미터란?
사람이 설정하는 변수, 최적의 값을 찾으면 성능이 좋아짐 (예 : 마진의 크기, 규제 강도 등)
SVM에서 중요한 하이퍼파라미터는 C와 Gamma ( γ) 임
- C : 잘못 분류된 데이터에 얼마나 민감하게 반응할 지 결정
: C가 크면 데이터 분류에 엄격해지고, C가 작으면 어느 정도의 오류를 허용함
- Gamma(γ) : 하나의 데이터가 다른 데이터에 영향을 미치는 범위를 결정
: Gamma가 크면 가까운 데이터만 영향을 주고, 작으면 멀리있는 데이터까지 영향을 줌
실무 활용 예시
- 이미지 분류 (얼굴 인식, 글자 인식, 사물 구분 등)
- 텍스트 분류 (스팸 메일 여부 판단, 뉴스 카테고리 분류 등)
- 의료 데이터 분석 (환자의 질병 진단 및 암세포 분류)
4. 로지스틱 회귀 (Logisitc Regression)
어떤 사건이 일어날 가능성을 예측할 때 사용되는 분류 알고리즘
입력값들을 기반으로 확률을 계산하여 분류를 수행함. (확률값)
시그모이드 함수를 통해 최종 결과를 0과 1 사이의 확률 값으로 변환함.
(보통 확률이 0.5 이상이면 긍정(1), 미만이면 부정(0)으로 판단함)
작동 방식 :
1. 입력 데이터(x)에 가중치를 곱한 뒤 모두 합산
2. 합산한 값을 시그모이드 함수에 넣어 확률을 얻는다
3. 얻은 확률을 기반으로 최종 분류 (0 또는 1)를 결정함
예 :
시험점수와 공부시간을 기반으로 "합격" 여부를 판단할 때, 합격할 확률이 0.7이면 합격, 0.4면 불합격으로 판단하는 식
입력 변수 : 공부시간 (x1), 수업 출석률(x2)
가중치 : 공부시간 (w1 = 2), 출석률(w2=1), 편향 (b=-4)
확률 : 시그모이드(2 * 공부시간 + 1 * 출석률 -1) => 공부시간과 출석률이 높을수록 시그모이드 값이 높아져, 합격 확률이 증가
장점 : 간단하고 빠르게 계산됨
: 결과가 확률값으로 나오기 때문에 결과 해석이 쉬움
단점 : 데이터가 선형적(직선 형태)일 때만 성능이 좋음, 복잡한 데이터는 잘 다루지 못함
* 시그모이드 함수 (Sigmoid function)
어떤 입력이든 0~1 사이의 확률 값으로 바꿔주는 함수
수식 :
예시 :
- 시그모이드(10) ≈ 0.99995 (매우 높은 확률)
- 시그모이드(0) = 0.5 (중립)
- 시그모이드(-10) ≈ 0.00005 (매우 낮은 확률)
실무에선 어디에서 쓰일까?
- 이메일이 스팸메일인지 아닌지 분류
- 고객이 제품을 살 확률 예측
- 은행 고객이 대출을 갚을 확률 예측
5. 랜덤 포레스트 (Random Forest)
결정트리를 여러 개 만들어, 가장 많은 투표를 받은 결과로 최종 결정을 내린다.
(한 명의 전문가가 아니라 여러 명의 전문가가 투표해서 가장 많은 표를 받은 답을 선택하는 방식이라고 생각하면 됨)
+) 투표의 개념? = 결정트리 각각이 바로 투표를 하는 사람이라고 생각하면 됨
즉, 랜포에서의 투표는 각각의 결정트리가 자신의 판단(예측)을 내리는 행위
모든 결정트리가 독립적으로 판단한 후, 가장 많은 결정 트리들이 선택한 결과를 최종 결론으로 삼는 것
랜덤포레스트의 핵심 개념 :
(1) 결정트리 (Decision Tree, DT) : 데이터를 조건에 따라 단계별로 나누어 최종적으로 분류하는 나무 형태의 구조
환자가 열이 있나요?
├─ 네 → 기침이 심한가요?
│ ├─ 네 → 독감으로 분류
│ └─ 아니오 → 감기로 분류
└─ 아니오 → 건강으로 분류
-> 이러한 결정트리를 수십 개 ~ 수백 개 만듦
(2) 앙상블(Ensemble) 학습
앙상블은 여러 개의 모델을 함께 사용하여 성능을 높이는 방식
- 랜포는 많은 결정트리를 만들고 각 트리가 독립적으로 분류를 진행함
- 최종 결과는 각 결정트리의 결과를 모아 가장 많은 투표를 받은 분류를 선택함.
예 :
친구 5명에게 날씨 예측을 부탁했다. 친구 3명은 비가 온다고 했고 2명은 안온다고 했을 때 최종적으로 비가 오는 것으로 결정
작동 원리 :
1. 데이터에서 무작위로 일부 데이터를 뽑아 여러 개의 결정트리를 만듦
2. 각 결정 트리는 주어진 데이터를 가지고 서로 조금씩 다른 방식으로 학습
3. 새로운 데이터가 들어왔을 때 각 결정 트리의 결과를 수집하여 다수결 투표로 최종 결론을 정함
예 :
100명의 의사가 한 환자의 병을 진단한다고 생각해보자.
각각의 의사는 자신의 경험과 진료법으로 독립적으로 진단함.
70명의 의사가 환자에게 독감이라고 진단을 내리면 최종 진단은 독감이 됨.
장점 : 정확도가 높고 과적합을 방지할 수 있어 매우 강력함
: 데이터의 복잡한 패턴도 잘 찾음
단점 : 많은 트리를 만들어서 속도가 느리고 자원(메모리, cpu)을 많이 사용함
: 결과가 어떻게 나왔는지 직관적으로 설명하기 어려움
실무에선 어디에서 쓰일까?
- 주식 가격 예측 및 투자 분석
- 보험사의 고객 위험 평가
- 질병 진단 및 의료 데이터 분석 (MRI 사진 분석 등)
- 고객이 구매할 제품 추천 (추천 시스템)
분류 성능 평가 지표
모델이 얼마나 정확하게 분류했는지 평가하는 기준
정확도 (Accuracy)
전체 중 맞춘 비율 (맞춘 데이터의 수 / 전체 데이터의 수)
예 : 100문제 중 90문제를 맞추면 정확도는 90%
정확도의 한계 : 한 클래스에 데이터가 몰려있는 경우 (불균형 데이터)
예 :
100명 중 98명이 건강하고 2명만 아픈 경우, 모든 사람을 무조건 건강하다로 예측해도 정확도는 98%가 됨
이 때 정확도는 높지만, 모델의 성능은 나쁨
-> 정확도 외의 지표도 중요햠.
혼동 행렬 (Confusion Matrix)
정답과 오답을 네 가지 방식으로 표현한 표
실제로 "참"(긍정) | 실제로 "거짓"(부정) | |
모델이 "참"이라고 예측 | TP (True Positive, 진짜 긍정) ✅ | FP (False Positive, 거짓 긍정) ❌ |
모델이 "거짓"이라고 예측 | FN (False Negative, 거짓 부정) ❌ | TN (True Negative, 진짜 부정) ✅ |
암 진단 예시 :
- TP: 암 환자를 암이라고 정확히 진단 ✅
- FP: 암이 아닌데 암이라고 잘못 진단 ❌
- FN: 암 환자를 암이 아니라고 잘못 진단 ❌
- TN: 암이 아닌 환자를 정확히 암이 아니라고 진단 ✅
분류 리포트 (Classification Report)
정밀도 (Precision)
모델이 맞다고 한 것 중 실제로 맞는 비율 (스팸 메일 분류할 때 중요)
FP를 줄이고 싶을 때 중요한 지표
이메일 100개 중 스펨메일이라고 분류한 메일이 10개인데, 실제 스팸메일은 그 중 8개 뿐이라면?
정밀도 = 8/10 = 0.8 (80%)
=> 즉 모델이 긍정이라고 판단한 결과를 얼마나 믿을 수 있는가를 의미
재현율 (Recall)
실제 맞는 것 중 모델이 얼마나 찾아냈는가? (암 진단처럼 놓치면 안되는 경우 중요)
FN을 줄이고 싶을 때 중요한 지표
암 환자 10명이 있는데, 모델이 암이라고 정확히 진단한 환자가 7명이라면?
재현율 = 7/10 = 0.7(70%)
=> 즉 실제로 중요한 데이터를 얼마나 놓치지 않고 잡아내느냐의 능력을 의미
* 정밀도와 재현율의 차이
정밀도 : 모델이 긍정이라고 예측한 결과 중 실제 긍정 비율 (틀리지 않는 것이 중요)
재현율 : 실제 긍정인 데이터 중 모델이 맞춘 비율 (놓치지 않는 것이 중요)
스팸 메일 분류는 정밀도가 중요하다 (정상 메일을 스팸메일이라고 하면 큰 문제가 발생)
암 진단은 재현율이 중요하다 (환자를 놓치면 위험)
F1-score
정밀도와 재현율의 조화 평균 (두 지표가 모두 중요할 때 사용)
정밀도가 0.8이고 재현율이 0.6이라면 f1-score 는 약 0.686이 됨
정밀도와 재현율 중 하나라도 낮으면 f1-score도 낮아짐
두 지표가 모두 중요할 때 유용함
* 조화 평균 vs 산술 평균
산술평균 : (정밀도 + 재현율) / 2 -> 일반적인 평균
조화평균 : 두 값의 균형을 더 강하게 강조하는 평균, 한 쪽이 극단적으로 낮으면 값이 크게 낮아짐
조화 평균 예시:
- 60km/h와 30km/h로 같은 거리를 달렸을 때 전체 평균 속도는 40km/h (산술 평균인 45km/h보다 낮음)
- 즉, 성능이 한쪽으로 치우치면 점수가 크게 떨어집니다.
실무 활용 팁
데이터가 한쪽으로 쏠려있으면 정확도보다 정밀도/재현율/f1-score를 우선 평가
암진단, 금융사기 탐지 등 위험한 분야에서는 재현율을 우선 평가 (놓치면 안됨, 의심 많이 해라~)
추천 시스템이나 스팸메일 등 잘못된 판단이 문제되는 경우는 정밀도를 우선 평가함 (일단 널널하게 해라)
분류 알고리즘 선택 기준
필요성 적합한 알고리즘
빠르고 단순한 분류 | KNN, 로지스틱 회귀 |
복잡하고 비선형적 데이터 처리 | SVM, 랜덤 포레스트 |
결과 해석과 설명이 중요할 때 | 결정 트리 |
데이터가 매우 적을 때 | KNN, SVM |
정확성이 가장 중요할 때 | SVM, 랜덤 포레스트 |
'Data Analysis' 카테고리의 다른 글
KNN 실습 : 의류 이미지 속성 분류 (2) | 2025.06.09 |
---|---|
KNN 분류 예제 (Iris 데이터 셋) (0) | 2025.06.08 |
Linear Regression (선형 회귀) (1) | 2025.06.08 |
Classification (분류), 붓꽃 데이터 예제, Scikit-learn, seaborn, pairplot (2) | 2025.06.08 |
머신러닝(Machine Learning), Big Data, AI의 기초 개념 (4) | 2025.06.08 |