susinlee 님의 블로그

k-NN, 선형 모델, 나이브 베이즈 분류 본문

학습/머신러닝

k-NN, 선형 모델, 나이브 베이즈 분류

susinlee 2025. 2. 9. 21:59

1. k-NN 알고리즘 (k-Nearest Neighbors)

k-NN 알고리즘은 지도 학습 알고리즘으로, 주어진 데이터 포인트의 주변 k개의 가장 가까운 이웃을 기준으로 예측하는 방식. 분류와 회귀 문제 모두에서 사용됨.

  • k-NN 분류 (k-NN Classification)
    • 새로운 데이터 포인트가 주어졌을 때, 가장 가까운 k개의 데이터 포인트를 찾고, 다수결 방식으로 클래스 예측
    • 거리 기반 알고리즘이므로, 데이터의 분포에 따라 성능이 결정
  • k-NN 회귀 (k-NN Regression)
    • 새로운 데이터 포인트가 주어졌을 때, 가장 가까운 k개의 데이터 포인트의 평균을 사용하여 값 예측
    • 평균 또는 가중 평균을 사용하여 예측값을 계산
# ==================================================
# k-NN 분류
# ==================================================
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 데이터 로드
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# k-NN 분류 모델 생성 (k=5, 기본값)
knn_clf = KNeighborsClassifier(n_neighbors=5)
knn_clf.fit(X_train, y_train)

# 정확도 평가
accuracy = knn_clf.score(X_test, y_test)
print("k-NN 분류 정확도:", accuracy)

# ==================================================
# k-NN 회귀
# ==================================================
from sklearn.neighbors import KNeighborsRegressor
from sklearn.datasets import make_regression

# 샘플 데이터 생성 (회귀 문제)
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)

# 훈련 / 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# k-NN 회귀 모델 생성 (k=5, 기본값)
knn_reg = KNeighborsRegressor(n_neighbors=5)
knn_reg.fit(X_train, y_train)

# R^2 점수 평가
r2_score = knn_reg.score(X_test, y_test)
print("k-NN 회귀 R^2 Score:", r2_score)

 

매개변수 설명 기본값
n_neighbors 가장 가까운 이웃 개수 (k 값) 5
weights 거리 가중 방식 ('uniform' = 모든 이웃 동일, 'distance' = 거리 가중) 'uniform'
algorithm 최근접 이웃 탐색 알고리즘 ('auto', 'ball_tree', 'kd_tree', 'brute') 'auto'
leaf_size BallTree와 KDTree 에서 사용하는 리프 크기 30
p 거리 계산 방식 (p=1 → 맨해튼 거리, p=2 → 유클리드 거리) 2
metric 거리 측정 방식 ('minkowski', 'euclidean', 'manhattan', 'chebyshev', 'haming', 등) 'minkowski'

 

 

선형 모델 (Linear Models)

  • 특징
    • 입력 데이터와 출력 간의 관계를 직선(선형 함수)으로 모델링하는 알고리즘
  • 선형 회귀 (Linear Regression)
    • 데이터를 직선 방정식으로 모델링
    • 목표 : 평균제곱오차(MSE) 최소화
    • 손실 함수 (MSE)
  • 릿지 회귀 (Ridge Regression)
    • L2 정규화(릿지 패널티)를 적용한 선형 회귀 모델
    • 과적합 방지를 위해 회귀 계수의 크기를 0에 가깝게 함 (0은 안됨)
    • 손실 함수 (MSE + L2)
  • 라쏘 회귀 (Lasso Regression)
    • L1 정규화를 적용한 선형 회귀 모델
    • 불필요한 특성의 계수를 완전히 0으로 만들어 변수 선택이 가능
    • 손실 함수 (MSE + L1)
  • 엘라스틱넷 (ElasticNet)
    • L1 + L2 정규화를 동시에 적용하는 회귀 모델
    • 릿지와 라쏘의 장점을 결합하여 불필요한 변수를 줄이면서도 중요한 특성은 유지
    • 손실 함수 (MSE + L1 + L2)
  • 분위수 회귀 (QuantileRegressor)
    • 중앙값 또는 특정 분위수를 예측하는 회귀 모델
    • 이상치에 강한 회귀 모델
    • 손실 함수 (Pinball Loss)
  • 로지스틱 회귀 (LogisticRegression) 
    • 분류 모델이며, 확률 기반 예측 가능
    • 시그모이드 함수를 사용하여 출력
    • 손실 함수 (Log Loss, Cross-Entropy)
  • 선형 SVM (LinearSVC)
    • 서포트 벡터 머신 기반 선형 분류 모델
    • 힌지 손실을 최소화
    • 손실 함수 (Hinge Loss)
  • SGD 기반 분류와 회귀
    • SGDClassifier (분류)
    • SGDRegressor (회귀)
    • 대규모 데이터에 적합
    • L1, L2 가능
    • 다양한 손실 함수
  • 장점
    • 계산이 빠름
    • 해석 가능
    • 고차원 데이터에서도 잘 작동
  • 단점
    • 데이터가 선형적으로 분리되지 않으면 성능이 떨어짐
    • 이상치에 민감
    • 과적합 방지를 위해 정규화(Ridge, Lasso) 필요
# 회귀
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge # L2 규제
from sklearn.linear_model import Lasso # L1 규제
from sklearn.linear_model import ElasticNet # L1 + L2 규제
from sklearn.linear_model import QuantileRegressor # 예측의 백분위 간격
from sklearn.linaer_model import SGDRegressor # 대용량 데이터
 
# 분류
from sklearn.linear_model import LogisticRegression
from sklaern.svm import LinearSVC
from sklearn.linaer_model import SGDClassifier

 

 

나이브 베이즈 분류기

  • 특징
    • 베이즈 정리를 기반으로 확률을 계산하여 분류하는 알고리즘
    • 조건부 독립 가정을 사용
    • 클래스 확률을 계산한 후, 가장 확률이 높은 클래스로 예측
  • GaussianNB
    • 연속형(실수 값) 데이터
    • 정규 분포(Gaussian)를 가정
  • Multinomial
    • 텍스트 데이터
    • 다항 분포(Multinomial)를 가정
  • BernoulliNB
    • 이진 데이터
    • 베르누이 분포(Bernoulli)
  • 장점
    • 계산이 빠름 (특히 대규모 데이터에서 빠르게 동작)
    • 적은 데이터로도 좋은 성능
    • 이상치에 덜 민감
  • 단점
    • 조건부 독립 가정이 성립하지 않으면 성능이 낮아질 수 있음
    • 연속형 데이터에 GaussianNB를 적용하면 정규 분포를 따른다는 가정이 필요
from sklearn.naive_bayes import GaussianNB  # 연속형 데이터 (정규 분포 가정)
from sklearn.naive_bayes import MultinomialNB  # 텍스트 데이터 (다항 분포 가정)
from sklearn.naive_bayes import BernoulliNB  # 이진 데이터 (베르누이 분포 가정)

 

 

'학습 > 머신러닝' 카테고리의 다른 글

손실, 비용, 목적 함수  (0) 2025.02.09
앙상블  (0) 2025.02.02
결측치  (0) 2025.01.30
회귀  (0) 2025.01.30
분류  (0) 2025.01.29