susinlee 님의 블로그
k-NN, 선형 모델, 나이브 베이즈 분류 본문
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 # 이진 데이터 (베르누이 분포 가정)