머신러닝 이론 [2]

juhee·2025년 4월 6일

AI 엔지니어 이론

목록 보기
3/7

Q1. 결정 트리의 장단점

결정 트리 개념

데이터를 조건에 따라 나누는 방식으로 예측하는 모델

회귀) 연속형 예측
분류) 범주형 예측

결정 트리 구조

분할 시작 -> Root Node
조건에 따라 데이터 나눔 -> Internal Node
최종 예측을 담은 노드 -> Leaf Node
연결 경로 -> Edge

학습 방식

데이터를 나누는 기준 -> 불순도를 얼마나 줄이는가?

  • 지니 불순도 (Gini Impurity)
  • 엔트로피 (Entropy, 정보 이득 기반)

가능한 조건들을 모두 시험해 보고 가장 불순도 많이 줄이는 조건 선택해 분기함.

시간 복잡도 많아지는 거 아닌가요? 비효율적이지 않음?

수식

지니 불순도 (GI)

Gini(D)=1k=1Kpk2Gini(D) = 1 - \sum_{k=1}^{K} p_k^2

pkp_k = 데이터 집합 D에서 클래스 k의 비율

엔트로피 (Entropy)
-> 정보의 불확실성

Entropy(D)=k=1Kpklog2(pk)Entropy(D) = - \sum_{k=1}^{K} p_k \log_2(p_k)

정보 이득 (Information Gain)

IG(D,A)=Entropy(D)vValues(A)DvDEntropy(Dv)IG(D, A) = Entropy(D) - \sum_{v \in Values(A)} \frac{|D_v|}{|D|} Entropy(D_v)

장 / 단점

장점
이해 쉬움, 해석 가능
범주형 / 연속형 변수 모두 처리 가능
전처리 필요 X
특성 선택 자동으로 수행 (중요한 특성 먼저 나올 수밖에 없음)

단점
과적합 (깊은 트리)
작은 데이터 변화에 민감 (데이터 바뀔 때마다 트리 구조 바뀜)
일반화 성능 낮음 -> (앙상블로 해결)

Use cases

앙상블의 base model로 사용 (단독으로 사용하는 경우 잘 없어서 예시 X)

Advanced

가지치기(Pruning)
과적합 방지 -> 영향 크지 않은 분기 제거

하이퍼파라미터
max_depth: 트리 최대 깊이 제한
min_samples_split: 분할하기 위한 최소 샘플 수
min_samples_leaf: 리프 노드에 있어야 하는 최소 샘플 수
max_features: 각 분할 시 고려할 특성 수 제한
-> 만약 항상 모든 특성을 기준으로 분기하면
→ 모델이 특정 강력한 특성(매우 설명력 높은 피처)에 너무 의존

Q2. 부스팅 특징

부스팅 개념

여러 개 약한 모델을 순차적으로 학습시켜 이전 모델이 틀린 부분을 보완하면서 강한 예측기를 만드는 방법

-> 약한 모델의 기준은 뭔가요?

무작위 추측보다는 조금 더 나은 성능을 가진 모델
예: 이진 분류에서 정확도 > 50% 정도면 약한 모델로 봄
ex. 깊이가 얕은 트리 (depth=1, 스텀프)

-> Bagging과 어떻게 다른가요?

Bagging -> 많은 친구한테 의견 물어보고 평균내기 (오버피팅 방지)
Boosting -> 한 명이 틀린 거 알려주면 다음 사람이 고치고, 그 다음 사람이 고치고 ...(언더피팅 보완)

AdaBoost (Adaptive Boosting)

[ 개념 ]

이전 모델이 틀린 샘플에 가중치를 더 줘서 다음 모델이 더 집중하도록 함

[ 흐름 ]

초기화
각 샘플에 가중치 wi=1nw_i = \frac{1}{n}

반복

  • 약한 분류기 hm(x)h_m(x) 학습
  • 오차율
    ϵm=i=1nwi1(hm(xi)yi)i=1nwi\epsilon_m = \frac{\sum_{i=1}^n w_i \cdot \mathbb{1}(h_m(x_i) \ne y_i)}{\sum_{i=1}^n w_i}
  • 모델의 중요도 (alpha)
    αm=12log(1ϵmϵm)\alpha_m = \frac{1}{2} \log\left(\frac{1 - \epsilon_m}{\epsilon_m}\right)
    -> 갭차이 너무 커지지 않도록 log 사용하는건가
    -> (1-오차) / 오차 - 정답일 확률 : 틀릴 확률 (비율)

    오차가 0.1이면 비율은 9 (중요도 1.1, 자연로그)
    오차가 0.5면 비율은 1, log 1 == 0 (중요도 0)

    왜 로그?
    boosing 가중치 업데이트 수식과 연결
    가중치 업데이트를 곱셈 형태로 자연스럽게 만들기 위해 (수학적으로 깔끔하게 설계)


오차가 0.5보다 크면 정답보다 틀린 게 더 많으니까 반대로 예측하는 게 나음

  • 가중치 업데이트
    wiwiexp(αmyihm(xi))w_i \leftarrow w_i \cdot \exp(-\alpha_m y_i h_m(x_i))

    e를 밑으로 사용하는 이유
    미분 결과가 자기 자신 -> 미분해도 형태 안바뀜
    미분, 최적화에 사용하기 좋음 (수학적으로 다루기 좋음)

최종 예측기

H(x)=sign(m=1Mαmhm(x))H(x) = \text{sign} \left( \sum_{m=1}^M \alpha_m h_m(x) \right)

-> 이진 분류 기준의 AdaBoost 설명

[ Multi-class boosting ] OvA, SAMME, SAMME.R

OvA(sigma 느낌)
각 클래스마다 이진 분류기 만들고, 입력 x에 대해 각 분류기의 출력 점수 비교해 최종 클래스 선택

y^(x)=argmaxkm=1Mαm(k)hm(k)(x)\hat{y}(x) = \arg\max_{k} \sum_{m=1}^{M} \alpha_m^{(k)} \cdot h_m^{(k)}(x)

예시
Cat(0), Dog(1), Rabbit(2)

최종 예측
y^(x)=argmax{0.9, 1.0, 0.8}=1Dog \hat{y}(x) = \arg\max \{ 0.9, \ \mathbf{1.0}, \ -0.8 \} = 1 \Rightarrow \textbf{Dog }

-> OvA에서 O를 {+1}로 둬야한다는 점

SAMME [hard label]

Fk(x)=tαt1(ht(x)=k)F_k(x) = \sum_t \alpha_t \cdot \mathbf{1}(h_t(x) = k)

Cat(0), Dog(1), Rabbit(2)

FCat(x)=0(아무도 Cat 안 골랐음)FDog(x)=0.7+0+0.8=1.5FRabbit(x)=0+0.6+0=0.6F_{\text{Cat}}(x) = 0 \quad (\text{아무도 Cat 안 골랐음}) \\ F_{\text{Dog}}(x) = 0.7 + 0 + 0.8 = 1.5 \\ F_{\text{Rabbit}}(x) = 0 + 0.6 + 0 = 0.6
-> 약간 L1 규제같은 느낌 해당 클래스만 남기고 나머지 0

최종 예측

y^(x)=argmaxkFk(x)=1Dog\hat{y}(x) = \arg\max_k F_k(x) = 1 \Rightarrow \textbf{Dog}

SAMME.R (softmax 느낌) [soft label]

SAMME.R 점수 누적 (K=3)

각 클래스 점수

Fk(x)=tlog(pt,k(x)1/3)=tlog(3pt,k(x))F_k(x) = \sum_t \log\left(\frac{p_{t,k}(x)}{1/3}\right) = \sum_t \log(3 \cdot p_{t,k}(x))

Cat 입장

FCat(x)=log(30.1)+log(30.2)+log(30.3)=log(0.3)+log(0.6)+log(0.9)F_{\text{Cat}}(x) = \log(3 \cdot 0.1) + \log(3 \cdot 0.2) + \log(3 \cdot 0.3) = \log(0.3) + \log(0.6) + \log(0.9)

Dog 입장

FDog(x)=log(30.7)+log(30.3)+log(30.6)=log(2.1)+log(0.9)+log(1.8)F_{\text{Dog}}(x) = \log(3 \cdot 0.7) + \log(3 \cdot 0.3) + \log(3 \cdot 0.6) = \log(2.1) + \log(0.9) + \log(1.8)

Rabbit 입장

FRabbit(x)=log(30.2)+log(30.5)+log(30.1)=log(0.6)+log(1.5)+log(0.3)F_{\text{Rabbit}}(x) = \log(3 \cdot 0.2) + \log(3 \cdot 0.5) + \log(3 \cdot 0.1) = \log(0.6) + \log(1.5) + \log(0.3)

최종 예측 -> y^(x)=argmaxkFk(x)=Dog\hat{y}(x) = \arg\max_k F_k(x) = \textbf{Dog}

차별점

샘플에 가중치 부여하고 분류 오류를 기반으로 업데이트

사용할 수 있는 약한 분류기 예시
DecisionTreeClassifier (AdaBoost, SAMME, SAMME.R)

  • 보통 max_depth=1 (stump)로 사용
    ->

RandomForestClassifier (weak learner로 사용은 잘 안함)

  • predict_proba() 지원

LogisticRegression

  • predict_proba() 지원

KNeighborsClassifier

  • predict_proba() 지원
  • 계산량이 많을 수 있어 약한 모델로 잘 안씀

Gradient Boosting (GBM)

개념

부스팅을 최적화 문제로 해석, 목적함수를 미분해서 잔차를 줄이도록 모델을 업데이트 함

흐름

예측 함수 초기화

F0(x)=argminγL(yi,γ)F_0(x) = \arg\min_\gamma \sum L(y_i, \gamma)

반복

  • 잔차 계산 (loss에 대한 gradient)
    rim=[L(yi,F(xi))F(xi)]F(x)=Fm1(x)r_{im} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]{F(x) = F{m-1}(x)}
  • 잔차에 대해 회귀트리 hm(x)h_m(x) 학습
  • 학습률 η\eta, 선형 조합
    Fm(x)=Fm1(x)+ηhm(x)F_m(x) = F_{m-1}(x) + \eta h_m(x)

최종 예측기

y^=FM(x)\hat{y} = F_M(x)

차별점

손실 함수의 gradient를 이용해 모델 업데이트 (잔차 기반) -> 재귀

XGBoost (eXtreme Gradient Boosting)

개념

정규화 + 병렬 처리 + 빠른 계산
Gradient Boosting의 확장 버전

흐름

y^i=k=1Kfk(xi),fkF\hat{y}i = \sum{k=1}^K f_k(x_i), \quad f_k \in \mathcal{F}

(F\mathcal{F}: 회귀트리 공간)

목적 함수

L=i=1nL(yi,y^i)+k=1KΩ(fk)\mathcal{L} = \sum_{i=1}^n L(y_i, \hat{y}i) + \sum{k=1}^K \Omega(f_k)

정규화 항

Ω(f)=γT+12λj=1Twj2\Omega(f) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2

(여기서 TT는 트리의 리프 수, wjw_j는 리프 값)

2차 근사 (테일러 전개)

L(t)i=1n[gift(xi)+12hift(xi)2]+Ω(ft)\mathcal{L}^{(t)} \approx \sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t(x_i)^2] + \Omega(f_t)
gi=L(yi,y^i)y^ig_i = \frac{\partial L(y_i, \hat{y}_i)}{\partial \hat{y}_i}
hi=2L(yi,y^i)y^i2h_i = \frac{\partial^2 L(y_i, \hat{y}_i)}{\partial \hat{y}_i^2}

차별점

2차 테일러 근사를 통한 정밀한 업데이트
정규화로 과적합 방지
빠른 분할/트리 구조 최적화

Q3. 차원 축소 기법 (PCA, FA)

차원 축소를 왜 해야할까?

Dimensionality Reduction

  • 고차원 저주 (Curse of Dimensionality)
    -> 차원이 높아질수록 밀도 희석, 모델 성능 저하
  • 시각화
  • 과적합 방지
    -> 노이즈 제거
  • 학습 시간 단축
    -> 연산량 감소

차원 축소 선형 기법

PCA (Principal Component Analysis)

최대 분산 방향으로 축 재구성

  • 공분산 행렬 -> 고유값 분해 -> 주성분
  • 분산 중심, 축 간 독립성

방법 (이에 대한 개념은 따로)
1. 공분산 행렬
2. 고유값 분해
3. 주성분
4. 차원 축소

특징

  • 각 성분은 orthogonal
  • 비지도 학습
  • 설명된 분산 비율 (Explained Variance Ratio)

FA (Factor Analysis)

관측 변수들의 공통된 요인 탐색

  • 공분산 행렬 = 공통 요인 + 고유 요인 분해
  • 설명력 중심, 잠재 변수 독립
X=μ+ΛF+ϵX = \mu + \Lambda F + \epsilon

Λ\Lambda: 로딩 행렬 (요인-변수 간 상관성)
FF: 공통 요인 (잠재 변수)
ϵ\epsilon: 특이 요인 (해당 변수에만 영향)

-> 잠재 요인을 가정하는 생성 모델
-> Factor Rotation 기법 사용 (Varimax 등)
-> 노이즈 분리해 공통된 구조 추출

0개의 댓글