머신러닝 기초 4일차 - 다양한 분류 알고리즘

컬럼월드·2025년 11월 5일
post-thumbnail

복잡한 수식과 개념으로 가득 찬 머신러닝 알고리즘 5가지와 그 기법에 대해서 알려드리겠습니다. 이는 모든 머신러닝 프로젝트의 기본 토대가 됩니다.
즉, 오늘 배우는 것들은 모두 알고리즘의 든든한 배양분이 되고, 이것이 토대가 되어서
머신러닝의 건위자가 되기를 바라면서 오늘의 키워드를 말씀드리겠습니다.

  1. Decision Tree (의사결정 트리)
  • 나무 구조로 의사결정하는 방법
  1. Loss Functions
  • MSE vs Cross Entropy - 왜 다른 Loss를 쓸까?
  1. Naive Bayes
  • 베이즈 정리를 이용한 확률적 분류
  1. LDA (Linear Discriminant Analysis)
  • 차원 축소 + 분류
  1. KNN (K-Nearest Neighbors)
  • 가장 가까운 이웃으로 예측

1. 🦸‍♂️ 분류의 기본: Decision Tree (의사결정 나무) - 질문의 달인

Decision Tree (의사결정 나무)란,
복잡한 문제를 단순한 '예/아니오' 질문의 연속으로 해결하는 알고리즘입니다. 마치 스무고개처럼
한 번의 질문으로 데이터를 가장 효율적으로 나누는 방법을 찾아 정답에 도달합니다.
나무를 거꾸로 뒤집은 모양입니다.

이 모양이 마치

출처 : https://n.news.naver.com/mnews/article/023/0003642997
거꾸로 나무의 형태와 비슷한 양상이 보입니다.

트리의 구성 요소

3가지 핵심 부분으로 나뉩니다.
1. Root Node (뿌리 노드)
역할: 시작점, 모든 데이터가 여기서 출발
질문: 가장 중요한 첫 번째 질문
예: "나이가 30세 미만인가?"

2. Internal Node (중간 노드)
역할: 의사결정 지점, 데이터를 나누는 곳
질문: "조건을 만족하는가? Yes/No"
특징: 자식 노드를 가짐 (최소 2개)

3. Leaf Node (잎 노드)
역할: 최종 답, 더 이상 나누지 않음
출력: 예측 클래스 (예: "합격", "불합격")
특징: 자식 노드가 없음 (끝!)

🌳 나무의 핵심 작동 원리: 가장 좋은 질문을 골라야 합니다.

의사결정 나무가 "어떤 질문을 먼저 할까?"를 고민할 때 필요한 점수표가 바로 Gini\text{Gini} (지니 계수)
Entropy\text{Entropy} (엔트로피)입니다.

비유: 복도에 섞여 있는 빨간 공과 파란 공을 분류할 때, 한 번의 칸막이 설치로 공들이 '얼마나 순수하게' (한쪽에는 빨간 공만, 다른 쪽에는 파란 공만) 나뉘었는지를 측정하는 기준입니다. 순수하게 빨간 공🏀 /
파란 공 🥏으로 나뉘면 Gini계수는 0이 됩니다. 순수지니~
이 수치가 가장 낮아지는 질문(분할)을 선택하는 것이 중요합니다.

"순수하다"는 게 뭘까?
Purity (순수도) 개념
: 노드의 데이터가 얼마나 한 가지 클래스로 통일되어 있는가를 뜻합니다.

수치적으로 얘기해보자면
완전 순수 (Gini = 0):
주머니에 빨간 공 100개만 있음
→ 눈 감고 뽑아도 100% 빨간 공
→ 더 나눌 필요 없음! ✓

불순수 (Gini = 0.5):
주머니에 빨간 공 50개, 파란 공 50개
→ 눈 감고 뽑으면 50% 확률
→ 불확실함! 더 나눠야 함!

핵심
순수도가 높을수록 (Gini ≈ 0) → 예측 정확
순수도가 낮을수록 (Gini ≈ 0.5) → 예측 불확실

언제까지 분할을 해야될까?
Stopping Criteria (중단 조건)
1. 완전 순수 (Perfect Purity)
조건: Gini = 0 또는 Entropy = 0
의미: 모든 샘플이 같은 클래스
예: 100개 데이터 모두 Class 0
→ Leaf Node 생성!

2. 최대 깊이 도달 (Max Depth)
조건: max_depth에 도달
의미: 더 이상 깊어질 수 없음
예: max_depth=3이면 3층까지만
→ 강제로 Leaf Node!

3. 샘플 수 부족 (Too Few Samples)
조건: 샘플 < min_samples_split
의미: 나누기에는 데이터가 너무 적음
예: min_samples_split=10인데 샘플 5개
→ Leaf Node로 중단!

4. 개선 없음 (No Improvement)
조건: Information Gain ≈ 0
의미: 나눠도 별로 좋아지지 않음
예: Gini가 0.40 → 0.39 (미미한 개선)
→ Leaf Node로 중단!

그럼 지니의 순수함이,, 불순하다면,,?
Gini Impurity.하다면 어떻게 해야 될까요

Gini Impurity란?
: 데이터가 얼마나 섞여있는지 (순수하지 않은지) 측정하는 지표이다.

Gini = 1 - Σ(pᵢ²)

수치적으로 얘기해보자면
상황 1: 주머니에 빨간 구슬 50개, 파란 구슬 50개
→ 매우 섞여있음 (불순도 높음) → Gini = 0.5

상황 2: 주머니에 빨간 구슬 100개만
→ 전혀 안 섞임 (순수함) → Gini = 0

공식 설명
pᵢ: 각 클래스의 비율 (0~1 사이)
Σ(pᵢ²): 모든 클래스 비율의 제곱을 더함
1 - Σ(pᵢ²): 순수도를 불순도로 변환
범위: 0 (완전 순수) ~ 0.5 (최대 불순, 2클래스)

순수지니와 불순수지니의 설명은 여기까지 입니다.
의사결정 나무의 점수표중에서 Gini\text{Gini} (지니 계수)Entropy\text{Entropy} (엔트로피)가 있다고 했는데, 이 다음부터는 Entropy\text{Entropy} (엔트로피)에 대해서 알아보도록 하겠습니다.

Entropy란?

: 데이터의 "무질서도" 측정
: 데이터의 불확실성 또는 혼란도를 측정하는 정보 이론 지표

H = -Σ pᵢ log₂(pᵢ)

수치적으로 얘기해보자면
상황 1: 동전 던지기 (앞면 50%, 뒷면 50%)
→ 결과 예측 불가능 (불확실성 최대) → H = 1.0

상황 2: 양면이 모두 앞면인 동전
→ 결과 확실함 (불확실성 없음) → H = 0

공식 설명
pᵢ: 각 클래스의 비율
log₂(pᵢ): 정보량 (비트 단위)
-Σ: 모든 클래스의 정보를 합산 (음수 제거)
범위: 0 (확실) ~ 1 (최대 불확실, 2클래스)

이 지니와 엔트로피의 차이점을 비교해보자면

Gini vs Entropy 비교

Gini ImpurityEntropy
공식: 1 - Σ(pᵢ²)공식: -Σ pᵢ log₂(pᵢ)
장점: 계산 빠름 (제곱만)장점: 이론적으로 더 정확
범위: 0 ~ 0.5범위: 0 ~ 1.0
사용: sklearn 기본값사용: C4.5 알고리즘
특징: 확률 기반특징: 정보 이론 기반

이러한 차이가 있긴 하지만
실전에서는?
두 방법의 결과가 거의 비슷합니다!
Gini가 더 빠르니까 보통 Gini 사용
중요한 건 어느 쪽을 쓰든 일관성 유지

이제 이렇게 측정한 순도와 불순도를 비교하는 Information Gain이라는게 있습니다.

Information Gain이란?

: 데이터를 나눴을 때 불순도가 얼마나 감소했는지 측정

Information Gain = 부모 불순도 - 자식들의 가중 평균 불순도

수치적으로 얘기해보자면
Before: 섞인 사탕 100개 (빨강 60, 파랑 40)
→ 불순도 = 0.48

After Split: "맛이 단가?"로 나눔
• Yes(40개): 빨강 10, 파랑 30 → 불순도 = 0.375
• No(60개): 빨강 50, 파랑 10 → 불순도 = 0.278
→ 가중 평균 불순도 = 0.4 × 0.375 + 0.6 × 0.278 = 0.317

Information Gain = 0.48 - 0.317 = 0.163
→ 불순도가 0.163 줄어듦 = 좋은 질문! ✓

Information Gain이 가장 큰 것을 고르는게 제일 베스트지만,
지금 당장 가장 좋은 선택만 하는게 전체적으로 봤을때에는 최선이 아닐 수 있습니다.
이를 탐욕적 알고리즘(Greedy Algorithm)이라는 용어로 읽컸습니다.

탐욕적(Greedy)이란?
의미: 지금 당장 가장 좋은 선택만 함
장점: 빠르고 간단
단점: 전체적으로는 최선이 아닐 수 있음

예시)
현재 상황:
• Feature A로 나누면 → Info Gain = 0.3
• Feature B로 나누면 → Info Gain = 0.5 ✓
선택: Feature B (지금 당장 더 좋으니까!)

하지만...
나중에 Feature A를 먼저 썼다면
전체적으로 더 좋은 트리를 만들 수도 있음
→ 그래도 괜찮음! 충분히 잘 작동함

이렇게 트리를 만드는데 제약조건이 참 많습니다. 허허
근데 어찌저찌 만들었다고 한들 너무 깊은 트리에 대해서는 또 위험해요.

트리가 너무 깊어지면...과한 적합이 생깁니다.

과적합(Overfitting)

훈련 데이터: 완벽하게 예측 (100%)
테스트 데이터: 엉망 (50%)
이유: 노이즈까지 학습함

비유
시험 문제 답을 달달 외우는 학생
→ 모의고사는 100점
→ 실제 시험(새 문제)은 50점
? 원리를 이해한 게 아니라 암기만 했기 때문입니다!
이러한 문제도 생깁니다!!! 과적합이 생기지 않기 위한 방법이 있습니다.

Overfitting 해결 방법

하이퍼파라미터로 제어

max_depth (최대 깊이)
의미: 트리가 몇 층까지 자랄 수 있는가
예: max_depth=3 → 3층까지만
효과: 깊이 제한 → 과적합 방지

min_samples_split (분할 최소 샘플)
의미: 노드를 나누려면 최소 몇 개 샘플 필요?
예: min_samples_split=10 → 10개 미만이면 안 나눔
효과: 너무 작은 노드 분할 방지

min_samples_leaf (리프 최소 샘플)
의미: Leaf Node는 최소 몇 개 샘플을 가져야 하나?
예: min_samples_leaf=5 → 5개 미만이면 Leaf 불가
효과: 너무 특수한 규칙 방지

Pruning (가지치기)
방법 1: Pre-pruning (사전) - 위의 조건들
방법 2: Post-pruning (사후) - 다 키운 후 잘라냄

이렇게 트리를 만들때 어떠한 제약조건으로 만들어야 되는지 확인해 보았습니다.
코드를 직접 보면서 Decision Tree를 봐봅시다.

Decision Tree 실습


이렇게 코드를 짜서 실행해본다면

이런 결과를 얻을 수 있습니다. 모델이 어떻게 결정하는지 한눈에 파악이 가능하다는 장점이 있습니다.

Decision Tree (의사결정 트리) 모델에서 특정 특성(Feature)이 최종 예측을 결정하는 데 얼마나 큰 영향을 미쳤는지 측정하는 특성 중요도 (Feature Importance)가 필요합니다.

특성 중요도 (Feature Importance)를 해야되는 이유

1. 모델 해석 및 투명성 (Interpretability) 증대:

Decision Tree는 어떤 질문(특성)을 먼저 선택해야 Information Gain(정보 획득량, 불순도 감소)이 가장 큰지 계산하여 트리를 만듭니다.

특성 중요도를 확인하면 모델이 가장 중요하게 생각하는 입력 변수가 무엇인지 숫자로 파악할 수 있어 이해하기 쉬운 시각적인 표현이 가능합니다.

2. 특성 선택 (Feature Selection) 및 엔지니어링:

중요도가 낮은 특성을 제거하여 모델을 단순화하고 학습 속도를 높일 수 있습니다.

가장 중요한 특성에 집중하여 데이터 수집이나 추가적인 특성 엔지니어링을 진행할 수 있는 근거를 제공합니다.

코드로 이를 확인해보면

실행결과가

이렇게 나옵니다.

자. 이제 거의 다 왔습니다!
이러한 Feature Importance (특성 중요도)의 역할
특성 중요도는 Decision Tree 계열 모델에서 분할(split)의 품질을 측정하는 지표를 기반으로 합니다

  1. 계산 기반: Decision Tree에서 특성 중요도는 주로 해당 특성이 트리를 구성하는 데 기여한 Information Gain (정보 획득량, 불순도 감소량)의 총합을 기준으로 계산됩니다.

  2. 모델 평가: 모델이 이미 학습을 마친 후, 학습된 트리 구조를 분석하여 각 특성이 최종 예측에 얼마나 기여했는지 측정합니다.

이 트리에 관해서 어떠한 목표로 모델의 학습 과정을 주도하는 기준을 정하는 함수가 하나 있습니다.
바로 Loss Function (손실 함수)라고 하는데요. 이에 대해서 봐보자면

2. 학습 과정 주도하는 기준 : Loss Function(손실 함수)

  1. 목표 정의: 모델의 예측값이 실제 정답과 얼마나 차이가 나는지를 측정합니다.
    최적화 유도: 모델은 이 손실 함수의 값을 최소화하는 방향으로 가중치(weight)를 업데이트하며 학습합니다.

  2. 분류(Classification) 문제에는 주로 Cross Entropy가 사용됩니다.
    회귀(Regression) 문제에는 주로 MSE (Mean Squared Error)가 사용됩니다.

  3. 직접적인 관계는 없음: 손실 함수는 어떤 특성을 사용할지 결정하는 것이 아니라, 특정 특성으로 인해 발생한 예측 오류를 측정하는 데 중점을 둡니다.

핵심 요약

개념역할의존 관계
Loss Function (손실 함수)모델 학습의 방향과 목표를 정의합니다.특성 중요도 계산에 직접 관여하지 않습니다.
Feature Importance (특성 중요도)학습된 모델이 어떤 특성을 중요하게 활용했는지 평가합니다.모델이 이미 Loss Function을 사용하여 학습된 후 계산됩니다.

이거 표가 이상한 배열로 보이는데 이거 가운데 정렬로 보이는 방법 아시는 분 있나요..

저희 앞선 수업내용에서 회귀에 대해서 배웠었습니다.
회귀라고 불리는 MSE (Mean Squared Error)는 평균 제곱 오차이며, 주로 회귀(Regression) 문제에서 사용되는 가장 기본적인 손실 함수(Loss Function)이자 성능 평가 지표입니다.
이와 관련된 설명은 링크 공유해드리도록 하겠습니다.
손실함수와 평균제곱오차(MSE)
30분 정도의 영상입니다.

Loss Functions 비교
MSE vs Cross Entropy
왜 다른 Loss 함수를 쓸까?

왜 다른 Loss를 쓸까?
수학적 이유

핵심: 문제 유형에 맞는 Loss 선택이 중요!

3. 확률로 분류하는 단순하지만 강력한 방법 : Naive Bayes (나이브 베이즈) - 베이즈 정리를 이용한 분류, 단순한 확률 전문가

Naive Bayes (나이브 베이즈)란,
확률로 분류하는 단순하지만 강력한 방법

P(y|X) = P(X|y) × P(y) / P(X)

베이즈 정리
P(y|X): 후보 확률 (데이터 X가 주어졌을 때 y일 확률)
P(X|y): 가능도 (y일 때 X가 나올 확률)
P(y): 사전 확률 (y의 기본 확률)
P(X): 증거 (정규화 상수)

Naive Bayes의 "Naive"에 대해서
순진한 가정

놀라운 점: 이 단순한 가정에도 불구하고 잘 작동!

Naive Bayes 예시)
스팸 메일 분류

Naive Bayes 종류
데이터 타입에 따라 나뉩니다.

1. Gaussian Naive Bayes
연속형 데이터
정규 분포 가정
예: 키, 몸무게

2. Multinomial Naive Bayes
카운트 데이터
텍스트 분류에 많이 사용
예: 단어 빈도

3. Bernoulli Naive Bayes
이진 데이터
있다/없다
예: 단어 존재 여부

이와 관련된 실습이 있습니다.

Naive Bayes 장단점

4. 차원 축소 + 분류를 동시에 : LDA (Linear Discriminant Analysis)

📸 LDA의 핵심 비유: 사진 각도 조정
LDA의 목표와 작동 원리를 실생활에 비유하면 다음과 같습니다:

사진을 찍을 때 각도를 조정해서 사람들이 가장 잘 구분되도록 하기

비유 설명
1. 사람들 (데이터): 서로 다른 클래스(그룹)에 속하는 데이터 포인트입니다.
2. 사진 각도 (LDA): 데이터를 바라보는 새로운 관점(축)을 찾는 과정입니다.
3. 잘 구분되도록 하기 (목표): 클래스를 가장 잘 구분하는 방향을 찾는 것입니다.

🎯 목표 (수학적 설명)

LDA는 데이터를 투영시킬 새로운 축을 찾을 때, 다음 두 가지 조건을 동시에 만족시키는 방향을 찾습니다.

  1. 클래스 간 거리 최대화: 서로 다른 클래스(사람들)는 최대한 멀리 떨어지도록 합니다.
  2. 클래스 내 분산 최소화: 같은 클래스(같은 그룹의 사람들)는 최대한 뭉쳐 있도록 합니다.

LDA (지도)는 클래스 구분 잘 되는 방향, 레이블 활용, 분류 성능 향상 목적을 두고 있습니다.
하지만 LDA는 최대 (클래스 개수 - 1)차원으로 축소가 되어 이에 대한 제약이 있을 수 있습니다.
예: 3개 클래스 → 최대 2차원

LDA 실습

실행을 하면

이러한 결과를 얻을 수 있습니다.

5. 가장 가까운 이웃들로 예측 : KNN (K-Nearest Neighbors) - 헤이 끼리끼리 유노왓

KNN이란,
K-최근접 이웃(K-Nearest Neighbors)의 약자로, 지도 학습 방식의 비모수적(Non-parametric) 분류 및 회귀 알고리즘입니다.

원리
새로운 데이터가 들어오면
1. 가장 가까운 K개의 이웃 찾기
2. 이웃들의 다수결로 결정

비유
🧍"친구를 보면 그 사람을 안다"는 속담
주변 친구들이 어떤 사람인지 보고
이 사람도 비슷할 거라고 예측
새로운 데이터 (당신): 분류할 대상입니다.
기존 데이터 (친구): 이미 어떤 그룹(클래스)에 속하는지 알고 있는 훈련 데이터입니다.
K (가장 가까운 K명): 당신과 가장 가까운 K명의 친구들입니다.
예측 (다수결): 당신의 가장 가까운 친구들 K명 중 다수가 속한 그룹(예: "좋은 사람" 그룹)으로 당신을 분류합니다.

KNN이 적용되는 과정

K 값의 영향
얼마나 많은 이웃을 보느냐에 따라 결과값 달라진다.
K가 작을 때 (K=1)
가장 가까운 1개만
장점: 세밀한 경계
단점: 노이즈에 민감
Overfitting

K가 클 때 (K=50)
많은 이웃 고려
장점: 안정적
단점: 경계가 뭉개짐
Underfitting

최적 K 찾기
일반적으로 K는 동점 방지를 위해 홀수를 선택하며,
교차 검증(Cross-validation)을 통해 최적의 값을 찾습니다.

KNN은 상대적으로 작은 데이터셋이나 복잡도가 높지 않은 경우에 유용하며, 패턴 인식이나 추천 시스템 등에도 활용됩니다.

개념과 원리를 설명하는데 도움을 줄 수 있는 영상입니다.
understanding K-Nearest Neighbors

또한, KNN은 별도의 복잡한 학습 과정이 필요 없는 (게으른 학습, Lazy Learning이라고도 불리는) 알고리즘입니다. 왜냐면 유일한 계산 과정은 "거리 측정"밖에 없어요.

📏 거리 측정이 필요한 이유
KNN은 새로운 데이터 포인트를 분류하거나 값을 예측할 때, 주변의 가장 가까운 K개의 이웃을 찾고 그 이웃들의 정보를 바탕으로 다수결 투표(분류)평균(회귀)을 통해 예측을 수행합니다.이 과정에서 "가장 가깝다"는 것을 정의하고 측정하기 위해 거리가 필요합니다.

거리 측정 방법

Distance Metrics
1. Euclidean Distance (기본)

d = √[(x₁-x₂)² + (y₁-y₂)²]
직선 거리 측정

  1. Manhattan Distance

    d = |x₁-x₂| + |y₁-y₂|
    격자 거리 측정

  2. Minkowski Distance

    d = (Σ| xᵢ - yᵢ |ᵖ)^(1 / p)
    p=1: Manhattan, p=2: Euclidean

KNN 실습

실행하면

이런 결과를 얻을 수 있습니다.

최적 K 찾기

실행하면

이런 결과를 얻을 수 있습니다.

KNN 장단점
장점
1. 간단하고 직관적
2. 훈련 불필요 (Lazy Learning)
3. 비선형 문제 해결 가능
4. 새로운 데이터 추가 쉬움

단점
1. 예측이 느림 (거리 계산)
2. 메모리 많이 사용
3. 차원의 저주
4. 특성 스케일링 필수
5. 불균형 데이터에 약함

주의
특성의 스케일이 다르면 결과 왜곡!
StandardScaler 사용 필수

총정리
1. Decision Tree
질문 반복 → Gini/Entropy로 최선의 분할 선택

2. Loss Functions
회귀(MSE) vs 분류(Cross Entropy)

3. Naive Bayes
베이즈 정리 + 독립 가정 = 빠른 분류

4. LDA
클래스 구분 잘 되는 방향으로 차원 축소

5. KNN
가장 가까운 K개 이웃의 다수결

알고리즘 비교
언제 무엇을 쓸까?

이러한 기초를 가지고 어떤 복잡한 데이터 분석 프로젝트를 접근해 보실수 있을 겁니다.
오늘 꽤 많은 양을 나가야 됐어서 2회분으로 나눠서 진행할려다가 한번에 정리했습니다.ㅎㅎ
정리하다 보니 11시가 넘어가네요,,
저 블로그를 쓰는 재미가 조금씩 생기면서(그와 반대로 자주 오진 못함) 마지막 정리하는 말을 무엇으로 할까
생각을 가끔 하곤 하는데요
오늘도 어김없이 수업을 듣다가 집 밖을 우연히 봤는데 나무가 형형색색 단풍이 들은걸 보았습니다.
가을이 이렇게 또 넘어가고 있다는게 체감이 되는 나무의 색깔이었습니다.
초록 노랑 주황 빨강.. 저곳을 보며 잠깐 눈의 휴식을 가졌습니다.
우리 집에도 한 이주일?전에 화분 하나가 새로 들어왔는데요

우리 조카분께서 만든(?) 화분입니다.
친언니의 아기(아직 1살도 안됨)가 어린이집에 가서 저 화분에 꽃을 심는 활동을 하고 가져온거라고 그러더라구요.
꽃은 국화꽃이라고 하네요.. 아직 만 1세도 안된 아가가 뭘 할 수 있었는지는 모르지만 어쨋거나
꽃을 보니 기분이 좋아지는 것 같네요.


수업 공간에서 다같이 찰-칵!!
나름 형형색색을 갖춘 파워레인저입니다.
다른 파워레인저 분들도 다음에 같이 사진찍어요!!!! 📸 물론 다른 분들도 기회가 된다면 저기 벚꽃나무 밑에서 찍어서 간직할 예정입니다.😎😎(굳은 의지를 뽐내며)

profile
안녕하세요, 코딩과 잡다한 얘기도 좋아해요.

0개의 댓글