본문 바로가기
Study/[도서] 혼자 공부하는 머신러닝+딥러닝

[혼자 공부하는 머신러닝+딥러닝] KNN 회귀 알고리즘

by CodeNook; 2024. 6. 21.
반응형

[혼자 공부하는 머신러닝+딥러닝] KNN 회귀 알고리즘

안녕하세요, 오늘은 머신러닝 스터디 네 번째 시간으로 최근접 이웃 회귀 알고리즘에 대해 다뤄보겠습니다. 지난 시간에 분류 문제를 KNN 알고리즘을 사용해 해결했었는데요, 이번 시간에는 회귀 문제를 해결해 보도록 하겠습니다.

회귀란 무엇일까요?

분류 문제는 데이터가 특정 클래스에 속하는지 예측하는 것이고, 회귀 문제는 연속적인 값을 예측하는 것입니다. 예를 들어, 생선의 길이와 무게를 가지고 도미의 무게를 예측하는 것이 회귀 문제입니다.

데이터 전처리

데이터 전처리는 모델이 데이터의 스케일에 영향을 받지 않도록 하는 중요한 과정입니다. 여기서는 표준점수(z-score)를 사용해 스케일링을 진행했습니다. 넘파이의 meanstd 함수를 사용하여 평균과 표준 편차를 구한 후, 이를 통해 각 특성을 표준점수로 변환했습니다. 이렇게 하면 모델이 각 특성의 스케일에 민감하지 않게 됩니다.

import numpy as np

# 샘플 데이터
lengths = np.array([25.4, 26.3, 26.5, 29.0, 29.0, 30.0, 30.7, 31.0, 31.5, 32.0, 32.0, 33.0, 33.0, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 36.0, 36.0, 37.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0])
weights = np.array([242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 500.0, 500.0, 600.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0])

# 데이터 전처리: 표준점수로 변환
lengths_mean = lengths.mean()
lengths_std = lengths.std()
lengths_scaled = (lengths - lengths_mean) / lengths_std

 

데이터 분할

데이터를 훈련 세트와 테스트 세트로 나누기 위해 사이킷런의 train_test_split 함수를 사용했습니다. 회귀 문제에서는 stratify 매개변수를 사용하지 않고, 랜덤하게 데이터를 나눴습니다.

 

from sklearn.model_selection import train_test_split

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(lengths_scaled.reshape(-1, 1), weights, test_size=0.2, random_state=42)

 

KNN 회귀 모델 생성 및 훈련

KNN 회귀 모델은 주변의 k개의 이웃의 타겟값을 평균내어 예측값을 도출합니다. 여기서는 기본값인 k=5를 사용하지 않고, 더 나은 결과를 위해 k=3을 사용했습니다.

from sklearn.neighbors import KNeighborsRegressor

# KNN 회귀 모델 생성 및 훈련
k = 3
knn_regressor = KNeighborsRegressor(n_neighbors=k)
knn_regressor.fit(X_train, y_train)

 

예측 및 평가

훈련 세트와 테스트 세트에 대해 예측을 수행하고, R² 점수와 평균 절대 오차(MAE)를 계산합니다.

 

from sklearn.metrics import mean_absolute_error, r2_score

# 예측
y_pred_train = knn_regressor.predict(X_train)
y_pred_test = knn_regressor.predict(X_test)

# 평가
train_r2 = r2_score(y_train, y_pred_train)
test_r2 = r2_score(y_test, y_pred_test)
mae = mean_absolute_error(y_test, y_pred_test)

print(f"훈련 세트 R^2 점수: {train_r2:.2f}")
print(f"테스트 세트 R^2 점수: {test_r2:.2f}")
print(f"평균 절대 오차(MAE): {mae:.2f}g")

 

그래프 출력

원본 데이터와 예측 값을 시각화하여 비교합니다.

 

import matplotlib.pyplot as plt

# 그래프 출력
plt.scatter(lengths_scaled, weights, color='blue', label='Original data')
plt.scatter(X_train, y_pred_train, color='red', label='Training predictions')
plt.scatter(X_test, y_pred_test, color='green', label='Test predictions')
plt.xlabel('Length (standardized)')
plt.ylabel('Weight')
plt.legend()
plt.show()

결론

이번 시간에는 KNN 회귀 알고리즘을 사용하여 회귀 문제를 해결해 보았습니다. 앞으로도 다양한 머신러닝 알고리즘을 사용해보면서 더 많은 문제를 해결해볼 것입니다.

감사합니다. 다음 시간에도 많은 참여 부탁드립니다!

 

반응형