Post

머신러닝 알고리즘 및 비지도 학습

SVM, 결정 트리, 앙상블 기법(랜덤 포레스트, 부스팅), 차원 축소(PCA) 및 비지도 학습

Summarization

  • SVM은 클래스 사이의 가장 넓은 도로(마진)를 찾는 강력한 분류 알고리즘임.
  • 결정 트리는 직관적인 규칙으로 데이터를 분류하며, 지니 불순도와 엔트로피를 기준으로 노드를 분할함.
  • 앙상블 학습은 여러 모델을 결합하여 강력한 예측기를 만드는 기법으로, 배깅(랜덤 포레스트), 부스팅(XGBoost, LightGBM), 스태킹 등이 있음.
  • 차원 축소(PCA)는 정보 손실을 최소화하면서 데이터의 특성 수를 줄여 계산 효율을 높임.
  • 비지도 학습은 레이블이 없는 데이터에서 군집(Clustering)과 같은 숨겨진 패턴을 찾아냄.

서포트 벡터 머신 (SVM)

SVM은 데이터들 사이의 마진(Margin)을 최대화하는 결정 경계를 찾는 것을 목표로 함.

  • 서포트 벡터: 결정 경계(도로)의 경계에 위치한 데이터 샘플들.
  • 커널 트릭 (Kernel Trick): 데이터를 고차원 공간으로 매핑하여 비선형 데이터도 선형적으로 분리할 수 있게 함 (예: RBF 커널).
  • C 파라미터: 규제 강도로, 값이 작을수록 마진이 넓어지지만(과소적합 위험), 클수록 마진이 좁아지고 훈련 데이터를 더 정확히 분류함(과대적합 위험).
1
2
3
4
5
6
7
8
9
10
11
from sklearn.svm import SVC
from sklearn import datasets
import numpy as np

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # 꽃잎 길이, 꽃잎 너비
y = iris["target"]

# SVM 분류 (RBF 커널 예시)
svm_clf = SVC(kernel="rbf", gamma=5, C=0.001)
svm_clf.fit(X, y)

결정 트리 (Decision Tree)

스무고개처럼 특정 기준에 따라 데이터를 반복적으로 분할하는 알고리즘임.

  • 분할 기준:
    • 지니 불순도 (Gini Impurity): $G = 1 - \sum p_i^2$. 한 노드의 모든 샘플이 같은 클래스면 0임.
    • 엔트로피 (Entropy): $H = -\sum p_i \log_2(p_i)$. 정보 이론에서 무질서도를 측정함.
  • 특징: 화이트박스 모델로 결과 해석이 매우 쉽지만, 가지치기(Pruning)를 하지 않으면 과대적합되기 쉬움.
1
2
3
4
from sklearn.tree import DecisionTreeClassifier

tree_clf = DecisionTreeClassifier(max_depth=3, criterion="gini")
tree_clf.fit(X, y)

앙상블 학습 (Ensemble Learning)

“대중의 지혜”를 이용하는 방식으로, 여러 개의 약한 학습기를 결합하여 강한 학습기를 만듦.

1. 배깅 (Bagging)과 랜덤 포레스트

  • 배깅: 중복을 허용하여 샘플을 무작위로 추출(Bootstrapping)하고 여러 모델을 병렬로 훈련함.
  • 랜덤 포레스트: 결정 트리를 기본 모델로 사용하는 배깅의 대표 주자. 특성까지 무작위로 선택하여 트리의 다양성을 높임.

2. 부스팅 (Boosting)

  • 앞선 모델의 오차를 뒤의 모델이 보완하며 순차적으로 학습함.
  • 에이다부스트 (AdaBoost): 잘못 분류된 샘플에 가중치를 높임.
  • 그래디언트 부스팅 (Gradient Boosting): 잔여 오차(Residual Error)에 대해 새 모델을 학습시킴. (XGBoost, LightGBM, CatBoost의 기반)

3. 스태킹 (Stacking)

  • 여러 모델의 예측값을 다시 입력으로 사용하여 최종 모델(Meta-learner)이 예측을 수행함.
1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression

log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()

# 투표 기반 앙상블
voting_clf = VotingClassifier(
    estimators=[('lr', log_clf), ('rf', rnd_clf)],
    voting='soft'
)
voting_clf.fit(X, y)

차원 축소 (Dimensionality Reduction)

데이터의 정보를 최대한 유지하면서 변수의 개수를 줄임. ‘차원의 저주’를 해결하고 시각화에 용이함.

  • PCA (주성분 분석): 데이터의 분산이 가장 큰 방향(주성분)을 찾아 그 위로 데이터를 투영함.
1
2
3
4
5
from sklearn.decomposition import PCA

pca = PCA(n_components=2) # 2차원으로 축소
X_reduced = pca.fit_transform(X)
print("설명 가능한 분산 비율:", pca.explained_variance_ratio_)

비지도 학습 (Unsupervised Learning)

레이블($y$) 없이 데이터 자체의 구조나 패턴을 파악하는 학습법임.

1. 군집 (Clustering)

  • K-평균 (K-Means): 데이터를 $K$개의 군집으로 묶음. 각 군집의 중심(Centroid)을 반복적으로 업데이트함.
  • DBSCAN: 밀도 기반 군집화. 밀집된 영역을 찾으므로 기하학적인 모양의 군집도 잘 찾아냄.

2. 이상치 탐지 (Anomaly Detection)

  • 정상 데이터의 패턴을 학습하여 이와 크게 다른 샘플을 감지함 (예: Isolation Forest).
1
2
3
4
5
6
7
8
from sklearn.cluster import KMeans

k = 3
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)

# 각 샘플의 군집 확인
print(y_pred)

Conclusion

  • SVM부터 비지도 학습까지 머신러닝의 핵심 알고리즘들을 간단히 살펴봤다.
  • 모델이 복잡해질수록 성능은 올라가지만 해석력은 떨어질 수 있으므로, 문제의 특성에 맞는 적절한 알고리즘을 선택하는 것이 중요하다.
This post is licensed under CC BY 4.0 by the author.