Home Machine Learning Overview
Post
Cancel

Machine Learning Overview

Machine Learning

목차


Machine Learning의 역할

Machine Learning은 데이터에서 패턴을 학습해 새로운 데이터에 대해 예측이나 분류를 수행하는 방법이다. 명시적인 규칙을 프로그래밍하지 않고 데이터 자체에서 규칙을 추출한다.

1
2
3
4
5
6
7
Traditional Programming:
규칙 작성 → 데이터 입력 → 결과 출력
("if-else" 로직)

Machine Learning:
데이터 입력 → 패턴 학습 → 규칙 자동 추출 → 결과 출력
(자동으로 규칙 생성)

기본 흐름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Training Phase:
특성 추출 (Features)
    ↓
모델 학습 (손실 최소화)
    ↓
가중치 최적화 (Optimization)
    ↓
학습된 모델

Inference Phase:
새 데이터 입력
    ↓
학습된 모델 적용
    ↓
예측 결과 출력

Supervised Learning

“supervised learning과 unsupervised learning은 무엇이 다른가?”

Supervised Learning은 입력 X와 정답 Y가 있어서 X→Y 매핑을 학습하는 방식, Unsupervised Learning은 X만 있어서 패턴을 스스로 찾는 방식이다.

1
2
3
4
5
6
7
Supervised Learning (지도학습):
입력(Features) + 정답(Label) → 모델 학습

예:
- 이메일 → 스팸/정상 (분류)
- 집의 평방피트 → 가격 (회귀)
- 영상 픽셀 → 고양이/개 (분류)

Classification vs Regression

1
2
3
4
5
6
7
8
9
10
11
Classification (분류):
- 정답: 카테고리 (종속)
- 출력: 클래스 또는 확률
- 예: 스팸(0) vs 정상(1)
- 지표: Accuracy, Precision, Recall, F1

회귀 (Regression):
- 정답: 연속값
- 출력: 실수
- 예: 집값 예측 (100만원, 200만원, ...)
- 지표: MSE, RMSE, MAE, R²

구현 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Sklearn 분류 (Logistic Regression)
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 데이터 준비
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)  # 패턴 학습

# 예측
y_pred = model.predict(X_test)

# 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2%}")

Unsupervised Learning

“unsupervised learning은 어떤 경우에 쓰는가?”

Unsupervised Learning은 정답 없이 데이터의 숨은 구조나 패턴을 찾아내는 방식이다. 레이블 없는 데이터가 많을 때 유용하다.

1
2
3
4
5
6
7
8
Unsupervised Learning (비지도학습):
입력(Features만) → 패턴 자동 발견

예:
- 고객 세분화 (비슷한 구매 패턴인 고객 묶음)
- 이상 탐지 (정상과 다른 거래 탐지)
- 차원 축소 (고차원 데이터 단순화)
- 추천 시스템 (유사한 상품 찾기)

주요 기법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Clustering (클러스터링):
- 비슷한 데이터 묶음
- K-Means: 미리 정한 개수 K로 분할
- DBSCAN: 밀도 기반 묶음
- Hierarchical: 계층 구조

예:
고객 1: [구매액 높음, 방문 자주]
고객 2: [구매액 높음, 방문 자주]
고객 3: [구매액 낮음, 방문 드문]
→ Clustering → {고객 1, 2}, {고객 3}

Dimensionality Reduction (차원 축소):
- 고차원 → 저차원
- 변수 1000개 → 10개
- 계산 비용 절감, 시각화

이상 탐지 (Anomaly Detection):
- 정상과 다른 패턴
- 신용카드 이상 거래
- 네트워크 침입 탐지

K-Means 예시

1
2
3
4
5
6
7
8
9
from sklearn.cluster import KMeans

# 클러스터링
kmeans = KMeans(n_clusters=3)  # 3개 그룹으로 분할
kmeans.fit(X)  # 데이터 학습

# 각 샘플의 클러스터 (0, 1, 2)
labels = kmeans.labels_
print(labels)  # [0, 1, 2, 0, 1, ...]

Feature

“feature engineering은 왜 중요한가?”

Feature Engineering은 원본 데이터에서 모델 학습에 유용한 특성들을 뽑아내는 과정이다. 좋은 특성이 없으면 아무리 좋은 모델도 성능이 떨어진다.

1
2
3
4
5
6
7
8
9
10
원본 데이터:
- "2026-05-23" (날짜)
- "서울 강남구" (주소)
- "$150,000" (금액 텍스트)

특성 공학:
- 날짜 → [월, 요일, 계절]
- 주소 → [위도, 경도, 강남=1/아니면=0]
- 금액 → 150000 (숫자 변환)
→ 모델이 사용 가능한 형태로 변환

특성 공학 기법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. 수치 특성 (Numerical Features)
   정규화 (Normalization): 0~1 범위로 스케일
   표준화 (Standardization): 평균 0, 표준편차 1

2. 범주 특성 (Categorical Features)
   원-핫 인코딩: [남성=1,0] [여성=0,1]
   라벨 인코딩: [남성=0] [여성=1]

3. 시간 특성 (Temporal Features)
   날짜 → [연도, 월, 일, 요일]
   시계열 → 이전 값 (lag), 이동 평균

4. 특성 상호작용 (Interaction)
   가격 × 개수 = 총액
   온도 × 습도 = 열지수

구현 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 데이터 준비
df = pd.DataFrame({
    'age': [25, 30, 35],
    'salary': [30000, 50000, 100000],
    'city': ['Seoul', 'Busan', 'Seoul']
})

# 수치 특성 정규화
scaler = StandardScaler()
df['age_scaled'] = scaler.fit_transform(df[['age']])

# 범주 특성 원-핫 인코딩
df = pd.get_dummies(df, columns=['city'])
print(df)

Loss Function

“loss와 metric은 왜 다를 수 있는가?”

Loss는 모델 학습 중 최소화하는 목표 함수, Metric은 최종 성능 평가 지표이다. 목표와 평가 관점이 다를 수 있어서 다르게 선택할 수 있다.

1
2
3
4
5
6
7
8
9
Loss Function (학습 중):
- 목표: 가중치 업데이트를 위해 최소화할 값
- 미분 가능해야 함 (gradient descent)
- 예: MSE, Cross Entropy

Metric (평가 시):
- 목표: 모델 성능 평가
- 반드시 미분 가능할 필요 없음
- 사람이 이해하기 쉬워야 함

Loss 함수 종류

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
회귀 (Regression):
MSE (Mean Squared Error):
loss = 1/n * Σ(y_true - y_pred)²
→ 큰 오차에 페널티 (이상치 민감)

MAE (Mean Absolute Error):
loss = 1/n * Σ|y_true - y_pred|
→ 절댓값 (이상치 둔감)

분류 (Classification):
Cross Entropy:
loss = -Σ(y_true * log(y_pred))
→ 확률 분포 간 거리
→ 멀수록 손실 커짐

Hinge Loss:
loss = max(0, 1 - y_true * y_pred)
→ SVM에서 사용

예시: Loss vs Metric

1
2
3
4
5
6
7
8
9
10
11
12
13
작업: 암 진단 분류

Loss = Cross Entropy
(학습 중 최소화)

Metric (평가):
- Accuracy: 전체 맞춘 비율
  BUT: 실제 암 5%, 정상 95%
  "모두 정상" 예측 → 95% 정확도 (틀린 평가!)
  
- Recall: 암 중 찾은 비율 (놓친 암 없나?)
  실제 암 100명 중 95명 진단
  → Recall = 95% (더 나은 지표)

Optimization

“모델은 어떻게 최적화되는가?”

Optimization은 손실 함수를 최소화하는 가중치를 찾는 과정이다. 기울기(gradient)를 이용해 가중치를 반복적으로 업데이트한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
목표:
최소 손실 찾기

방법: Gradient Descent (경사 하강법)
1. 현재 가중치에서 손실 계산
2. 손실의 기울기(gradient) 계산
3. 기울기 반대 방향으로 가중치 업데이트
4. 반복 (수렴할 때까지)

비유:
산을 내려가는데 안개 속에서 발을 디딤
현재 위치의 기울기를 느끼고
기울기 반대로 한 발 내디딤
계속 반복하면 계곡(최소값)에 도달

최적화 알고리즘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SGD (Stochastic Gradient Descent):
- 한 샘플씩 업데이트
- 빠르지만 진동 (noisy)
- 시간: 빠름, 안정성: 낮음

Mini-batch GD:
- 작은 배치 (32, 64개)씩 업데이트
- 균형 잡힘
- 시간: 중간, 안정성: 중간

Adam (Adaptive Moment Estimation):
- 최신 최적화 알고리즘
- 기울기 방향과 크기 모두 고려
- 시간: 중간, 안정성: 높음
- 대부분 기본값으로 사용

구현 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import torch
from torch.optim import Adam

# 모델과 옵티마이저 정의
model = MyModel()
optimizer = Adam(model.parameters(), lr=0.001)

# 학습 루프
for epoch in range(10):
    for X_batch, y_batch in dataloader:
        # 1. 예측
        y_pred = model(X_batch)
        
        # 2. 손실 계산
        loss = loss_fn(y_pred, y_batch)
        
        # 3. 기울기 계산
        optimizer.zero_grad()  # 이전 기울기 삭제
        loss.backward()  # gradient 계산
        
        # 4. 가중치 업데이트
        optimizer.step()  # 가중치 업데이트

Evaluation Metric

“평가 지표는 어떻게 선택해야 하는가?”

평가 지표는 문제 특성에 따라 다르게 선택해야 한다. 정확도(Accuracy)만으로는 클래스 불균형 문제를 제대로 평가할 수 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Precision과 Recall의 Trade-off:

Precision (정밀도):
"스팸이라고 한 것 중 정말 스팸인 비율"
= TP / (TP + FP)

Recall (재현율):
"실제 스팸 중 찾아낸 비율"  
= TP / (TP + FN)

선택:
- 스팸 필터: Recall 중요 (스팸을 못 거르면 안 됨)
- 승인 시스템: Precision 중요 (거짓 승인 위험)
- 암 진단: Recall 중요 (암을 못 찾으면 생명 위험)

평가 지표 선택 가이드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
분류 (Classification):

클래스 균형 O:
→ Accuracy

클래스 불균형 X (특히 소수 클래스 중요):
→ Precision, Recall, F1, AUC-ROC

다중 클래스:
→ Macro F1 (모든 클래스 동등)
→ Weighted F1 (빈도 고려)

회귀 (Regression):

일반:
→ RMSE, MAE

이상치 중요:
→ MAE (덜 민감)

정규화 필요:
→ MAPE (백분율 오차)

혼동 행렬과 지표

1
2
3
4
5
6
7
8
9
10
11
12
13
14
         예측 양성  예측 음성
실제 양성  TP(80)   FN(20)
실제 음성  FP(10)   TN(890)

Accuracy = (TP+TN)/(Total) = 970/1000 = 97%

Precision = TP/(TP+FP) = 80/90 = 89%
(양성이라 예측한 것 중 맞은 비율)

Recall = TP/(TP+FN) = 80/100 = 80%
(실제 양성 중 찾은 비율)

F1 = 2*(Precision*Recall)/(Precision+Recall) = 84%
(Precision과 Recall의 조화평균)

정리

개념설명
Supervised정답이 있는 학습 (분류, 회귀)
Unsupervised정답 없이 패턴 발견 (클러스터링, 차원축소)
Feature모델 입력으로 사용할 특성
Feature Engineering원본 데이터에서 유용한 특성 추출
Loss학습 중 최소화할 목표 함수
Metric최종 성능 평가 지표
Optimization손실 최소화 위한 가중치 조정
Gradient Descent기울기를 이용한 최적화 알고리즘

This post is licensed under CC BY 4.0 by the author.