티스토리 뷰
머신러닝 기초학습 2: 대표 ML 알고리즘—학습과 추론의 ‘방식’까지 이해하기
이 글은 “용어 나열”이 아니라, 각 모델이 ‘무엇을 최적화’하고 ‘어떻게 일반화’하며 ‘추론 시 무슨 계산’을 하는지까지 파고듭니다. 손에 잡히는 짧은 실행 코드도 함께 넣었습니다(로컬에서 scikit-learn만 있으면 바로 실행됩니다).
0. 큰 지형 보기: 공통 수식과 관점
대부분의 지도학습은 아래 꼴로 요약됩니다.
[
\theta^* ;=; \arg\min_\theta \frac{1}{N}\sum_{i=1}^N L\big(y_i,; f(x_i; \theta)\big);+;\lambda,\Omega(\theta)
]
- (L): 손실함수(예측과 정답의 차이)
- (\Omega): 정규화(복잡도 패널티, 과적합 방지)
- (\lambda): 정규화 강도
- 학습: (\theta) 찾기(보통 경사하강)
- 추론: 학습된 (\theta)로 (f(x)) 계산
비지도학습은 라벨 없이 분포 구조나 잠재변수를 찾습니다. 대표적으로 K-Means(거리 최소화), PCA(분산 최대/재구성 오차 최소), GMM(가능도 최대/EM) 등이 있습니다.
1. 선형회귀 (Linear Regression)
- 목표: 연속값 예측
- 학습: 최소제곱(OLS)로 평균제곱오차(MSE) 최소화
[
\min_\theta \sum_i \big(y_i - \theta^\top x_i\big)^2
]
해석 가능한 해 ((X^\top X)^{-1}X^\top y) 또는 경사하강. Ridge/Lasso로 규제 추가. - 추론: ( \hat{y}= \theta^\top x)
언제 좋은가: 선형성이 강하고 해석 가능성이 중요한 문제, 피처 수 대비 데이터가 충분할 때.
2. 로지스틱 회귀 (Logistic Regression)
- 목표: 이진/다중 분류에서 확률 추정
- 모형: (p(y=1|x)=\sigma(\theta^\top x)), (\sigma)는 sigmoid
- 학습: 로지스틱 우도 최대화 ↔ 교차엔트로피 최소화
[
\min_\theta -\sum_i \Big[ y_i\log \hat{p}_i + (1-y_i)\log(1-\hat{p}_i)\Big] + \lambda|\theta|^2
] - 추론: (\hat{p}=\sigma(\theta^\top x)), 임계값 0.5 등으로 레이블 결정
강점: 확률적 해석, 빠른 학습, 피처 중요도 계수로 해석 용이.
3. k-최근접 이웃 (k-NN)
- 목표: 레이블 또는 값의 국소 평균/다수결
- 학습: 없음(게으른 학습) —데이터 저장이 전부
- 추론: 쿼리 (x)와 훈련 샘플 간 거리 계산 → 가장 가까운 k개의 다수결/평균
- 핵심 하이퍼파라미터: (k), 거리(metric), 가중(가까울수록 더 크게)
장단: 구조 가정이 없어 직관적이나, 고차원에서 거리 의미 약화, 예측 시 느림.
4. 나이브 베이즈 (Naive Bayes)
- 목표: 조건부 확률 모델로 빠르고 견고한 분류
- 가정: 클래스 (y) 하에서 피처 독립
[
p(x|y)=\prod_j p(x_j|y)
] - 학습: (p(y))와 각 (p(x_j|y))의 통계량 추정(가우시안/멀티노미얼 등)
- 추론: 베이즈 규칙으로 (p(y|x) \propto p(y)\prod_j p(x_j|y))
특징: 독립 가정이 강하지만 데이터 적을 때 의외로 강력, 매우 빠름.
5. 결정트리 & 앙상블 (Random Forest, Gradient Boosting)
5.1 결정트리 (Decision Tree)
- 학습: 재귀적 분할. 분할 기준은 지니, 엔트로피(분류)/MSE(회귀) 감소 최대
- 추론: 루트→리프 경로를 따라가 리프 값/다수결 반환
- 장점: 비선형/상호작용 자동 포착, 해석 쉬움
- 약점: 단독 트리는 과적합 쉬움 → 가지치기/최대깊이 제한 필요
5.2 랜덤 포레스트 (Random Forest)
- 학습: 부트스트랩 샘플링 + 피처 서브샘플링으로 많은 트리 학습 → 평균/다수결
- 효과: 분산 감소(안정성↑), 과적합 완화, 피처 중요도 제공
5.3 그라디언트 부스팅 (XGBoost/LightGBM 포함)
- 아이디어: 현재 예측 오차(손실의 음의 그래디언트)를 새 트리로 순차 보정
- 학습: 약한 학습기(얕은 트리)를 단계적으로 추가, 학습률(learning rate)로 제어
- 특징: 탁월한 성능/랭킹, 섬세한 정규화, 결측/카테고리 처리(라이브러리별)
6. SVM (Support Vector Machine)
- 목표: 마진 최대화 초평면으로 분류
- 학습(선형 SVM):
[
\min_{w,b}\frac{1}{2}|w|^2 + C\sum_i \max\big(0, 1-y_i(w^\top x_i + b)\big)
]
힌지 손실 + 정규화 → 소프트마진으로 이상치 견고 - 커널 트릭: (\phi(x)) 고차원 매핑을 커널 (K(x,x')) 로 암시적으로 계산(RBF, Poly 등)
- 추론: 서포트 벡터와의 커널 합으로 부호/점수 판단
장점: 고차원/작은 데이터에 강함. 단점: 대용량 데이터엔 비용↑, 확률 출력 직접 없음(Platt scaling 등 필요).
7. K-Means (비지도)
- 목표: 클러스터 중심 ({\mu_k})와 할당 (z_i)로 제곱거리 합 최소화
[
\min_{{\mu_k},{z_i}} \sum_i |x_i - \mu_{z_i}|^2
] - 학습(반복): (E) 각 점을 가장 가까운 중심에 할당 → (M) 각 클러스터 평균으로 중심 갱신
- 추론: 새 점을 가장 가까운 중심에 할당
주의: (K) 선택 필요(엘보/실루엣), 구형/균등 분포 가정에 강함.
8. PCA (비지도 차원축소)
- 목표: 분산 최대 방향(고유벡터) 찾기 ↔ 재구성 오차 최소
- 학습: 공분산 행렬 고유분해(또는 SVD)로 주성분 획득
- 추론(투영): (z = W^\top(x-\bar{x})) (저차 잠재공간)
효과: 잡음 제거, 시각화, 선형 상관 구조 파악. (비선형은 커널PCA/오토인코더 고려)
9. 가우시안 혼합모형 GMM (비지도, 확률 모형)
- 목표: 데이터가 여러 개의 가우시안 혼합에서 왔다고 가정
[
p(x)=\sum_{k=1}^K \pi_k \mathcal{N}(x|\mu_k,\Sigma_k)
] - 학습(EM):
- E-step: 각 점의 클러스터 책임도(posterior) 계산
- M-step: 책임도로 가중된 평균/공분산/혼합비 갱신
- 추론: (\arg\max_k, p(z=k|x))로 소속/확률 추정
장점: 타원형 클러스터/불확실성 모델링. 주의: (K) 선택(BIC/AIC), 수렴 품질 초기값 의존.
10. 다층 퍼셉트론(MLP) & 딥러닝
- 구성: 선형변환 + 비선형 활성화(ReLU/SiLU 등) 레이어를 깊게 쌓음
- 학습: 역전파(Backprop) 로 각 레이어 가중치의 그래디언트 계산 → 옵티마이저(SGD/Adam)로 갱신
- 손실: 회귀(MSE), 분류(크로스엔트로피)
- 추론: 순전파로 로짓/확률 계산 → 레이블 결정
- 강점: 표현 학습(피처 공학 자동화), 대규모 데이터에서 강력
- 주의: 하이퍼파라미터, 정규화(드롭아웃/정규화층/가중감쇠), 데이터/연산 비용
11. 바이어스–분산, 정규화, 모델 선택
- 바이어스: 단순한 가정의 체계적 오차
- 분산: 데이터 샘플 변화에 대한 민감도
- 정규화/규제: L2(L2 norm), L1(희소성), 조기종료, 드롭아웃, 앙상블
- 검증: K-Fold CV, 홀드아웃, 시계열 CV
- 선택: 문제 성격(선형/비선형/해석/속도/데이터 크기)에 맞추기
12. 한 번에 돌려보는 미니 실험 코드 (검증 완료)
아래 코드는 분류/회귀/비지도를 한 번에 확인합니다.
(의존성: pip install scikit-learn matplotlib — 그래프는 옵션)
# 실행 환경: Python 3.9+ / scikit-learn >= 1.2
# 기능: 분류(로지스틱, SVM, RF, kNN, NB), 회귀(선형), 비지도(KMeans, PCA, GMM)
from sklearn.datasets import make_classification, make_regression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, r2_score, adjusted_rand_score
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.mixture import GaussianMixture
import numpy as np
import warnings
warnings.filterwarnings("ignore")
# 1) 분류용 데이터
Xc, yc = make_classification(n_samples=1200, n_features=10, n_informative=5,
n_redundant=2, n_clusters_per_class=2,
flip_y=0.03, class_sep=1.2, random_state=42)
Xc_tr, Xc_te, yc_tr, yc_te = train_test_split(Xc, yc, test_size=0.25, random_state=42)
# 2) 회귀용 데이터
Xr, yr = make_regression(n_samples=1000, n_features=8, noise=10.0, random_state=42)
Xr_tr, Xr_te, yr_tr, yr_te = train_test_split(Xr, yr, test_size=0.25, random_state=42)
# --- 지도학습(분류) ---
models_cls = {
"Logistic": make_pipeline(StandardScaler(), LogisticRegression(max_iter=200)),
"SVM-RBF": make_pipeline(StandardScaler(), SVC(kernel="rbf", probability=False)),
"RandomForest": RandomForestClassifier(n_estimators=200, random_state=42),
"kNN(k=7)": make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=7)),
"NaiveBayes": GaussianNB(),
}
print("== Classification ==")
for name, clf in models_cls.items():
clf.fit(Xc_tr, yc_tr)
pred = clf.predict(Xc_te)
acc = accuracy_score(yc_te, pred)
print(f"{name:12s} | accuracy = {acc:.3f}")
# --- 지도학습(회귀) ---
reg = LinearRegression()
reg.fit(Xr_tr, yr_tr)
r2 = r2_score(yr_te, reg.predict(Xr_te))
print("\n== Regression ==")
print(f"LinearRegression | R2 = {r2:.3f}")
# --- 비지도(KMeans, PCA, GMM) ---
print("\n== Unsupervised ==")
kmeans = KMeans(n_clusters=2, n_init=10, random_state=42)
kmeans.fit(Xc_tr)
cluster_pred = kmeans.predict(Xc_te)
ari = adjusted_rand_score(yc_te, cluster_pred) # 라벨 불일치 문제 보정 지표
print(f"KMeans | Adjusted Rand Index = {ari:.3f}")
pca = PCA(n_components=0.95, random_state=42) # 95% 분산 유지
pca.fit(Xc)
print(f"PCA | n_components = {pca.n_components_}, "
f"explained_var(%) ~ {pca.explained_variance_ratio_.sum()*100:.1f}")
gmm = GaussianMixture(n_components=2, covariance_type="full", random_state=42)
gmm.fit(Xc_tr)
bic = gmm.bic(Xc_te)
print(f"GMM | BIC = {bic:.1f}")
# (선택) 새 샘플 하나에 대한 추론 예시
x_new = Xc_te[0:1]
log_proba = models_cls["Logistic"].predict_proba(x_new)[0]
svm_label = models_cls["SVM-RBF"].predict(x_new)[0]
rf_label = models_cls["RandomForest"].predict(x_new)[0]
print("\n== Single-sample inference ==")
print(f"Logistic p(y=1|x_new) ≈ {log_proba[1]:.3f} | SVM label = {svm_label} | RF label = {rf_label}")
무엇을 확인할 수 있나
- 서로 다른 학습 방식: 확률(로지스틱), 마진(SVM), 다수결/평균(kNN), 배깅(RF)
- 비지도 지표: ARI(KMeans), BIC(GMM), 분산 보존율(PCA)
- 단일 샘플 추론: 확률/결정함수/다수결이 서로 다른 관점임을 체감
13. 어떤 문제에 어떤 모델?
- 선형/해석/속도: 로지스틱, 선형회귀
- 작은 데이터·고차원: 선형SVM/커널SVM
- 비선형·강한 성능: 랜덤포레스트, 그라디언트부스팅(XGBoost/LightGBM)
- 규모 작은 실험/빠른 베이스라인: 나이브 베이즈, k-NN
- 분포/잠재구조 파악: K-Means, PCA, GMM
- 대규모·표현학습: MLP/딥러닝
14. 마무리—모델은 ‘관점’이다
같은 데이터를 보고도 모델마다 무엇을 중요하게 보는가가 다릅니다.
- 로지스틱: 우도/확률을 정합시키려는 관점
- SVM: 결정경계와 마진을 넓히려는 관점
- 트리/앙상블: 규칙과 평균화로 분산을 줄이는 관점
- 비지도: 거리/분산/가능도로 구조를 밝히는 관점
다음 글에서는 일반화 성능을 좌우하는 검증/정규화/피처공학/파이프라인화를 실전 관점에서 정리하겠습니다.
참고 자료(출처)
- Bishop, Pattern Recognition and Machine Learning, Springer.
- Hastie, Tibshirani, Friedman, The Elements of Statistical Learning, Springer.
- Murphy, Machine Learning: A Probabilistic Perspective, MIT Press.
- scikit-learn User Guide (Classification, Regression, Clustering, Decomposition, Mixture).
머신러닝,ML알고리즘,지도학습,비지도학습,로지스틱회귀,SVM,랜덤포레스트,그라디언트부스팅,PCA,가우시안혼합모형
원하면, **“모델 선택과 튜닝(교차검증·정규화·특성공학·파이프라인)”**을 바로 다음 편으로 이어가겠습니다.
'study > ML' 카테고리의 다른 글
| 머신러닝 기초학습 6: 하이퍼파라미터 튜닝과 모델 최적화 — 모델의 ‘감’을 숫자로 조정하는 기술 (0) | 2025.11.03 |
|---|---|
| 머신러닝 기초학습 5: 모델 평가와 일반화 — 과적합을 피하고 진짜 실력을 확인하는 법 (0) | 2025.10.30 |
| 머신러닝 기초학습 4: 데이터 전처리와 피처 엔지니어링 — 모델이 이해할 수 있는 데이터로 바꾸는 기술 (0) | 2025.10.29 |
| 머신러닝 기초학습 3 (개정판): 비전공자도 이해하는 머신러닝 핵심 용어 사전 (0) | 2025.10.28 |
| 머신러닝 기초학습 1: 데이터가 세상을 이해하는 방식 (0) | 2025.10.28 |
- Total
- Today
- Yesterday
- Prisma
- REACT
- Express
- llm
- 딥러닝
- Next.js
- JAX
- 쿠버네티스
- Redis
- PostgreSQL
- 개발블로그
- flax
- NestJS
- seo 최적화 10개
- LangChain
- Python
- ai철학
- fastapi
- kotlin
- 백엔드개발
- SEO최적화
- 압박면접
- nextJS
- CI/CD
- Docker
- rag
- DevOps
- node.js
- JWT
- 웹개발
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
