2 분 소요

[혼공머신]3-1

1. 회귀 문제란?

회귀는 임의의 수치를 예측하는 문제로, 타깃값도 임의의 수치가 됩니다.

2. k-최근접 이웃 회귀

k-최근접 이웃 회귀는 k-최근접 이웃 알고리즘을 사용해 회귀 문제를 풉니다. 가장 가까운 이웃 샘플을 찾아 이 샘플들의 타깃값을 평균하여 예측으로 삼습니다.

3. 결정계수 (R²)

결정계수는 회귀 문제의 성능을 측정하는 대표적인 도구입니다. 1에 가까울수록 좋은 모델이며, 0에 가까울수록 성능이 나쁜 모델입니다.

4. 과대적합과 과소적합

  • 과대적합: 모델의 훈련 세트 성능이 테스트 세트 성능보다 훨씬 높을 때 발생합니다. 모델이 훈련 세트에 너무 집착하여 데이터의 거시적인 패턴을 감지하지 못하는 경우입니다.
  • 과소적합: 훈련 세트와 테스트 세트 성능이 모두 낮거나 테스트 세트 성능이 더 높을 때 발생합니다. 더 복잡한 모델을 사용해 훈련 세트에 잘 맞는 모델을 만들어야 합니다.

5. 핵심 패키지와 함수

  • scikit-learn
    • KNeighborsRegressor: k-최근접 이웃 회귀 모델을 만드는 사이킷런 클래스입니다. n_neighbors 매개변수로 이웃의 개수를 지정합니다.
    • mean_absolute_error(): 회귀 모델의 평균 절댓값 오차를 계산합니다. 첫 번째 매개변수는 타깃, 두 번째 매개변수는 예측값을 전달합니다.
    • mean_squared_error(): 평균 제곱 오차를 계산합니다.
  • numpy
    • reshape(): 배열의 크기를 바꾸는 메서드입니다. 바꾸고자 하는 배열의 크기를 매개변수로 전달합니다.

6. 예제 코드

다음은 k-최근접 이웃 회귀를 사용한 간단한 예제입니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error

# 데이터 준비
# 퍼치 물고기의 길이 데이터
perch_length = np.array(
    [8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0,
     21.0, 21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5,
     22.5, 22.7, 23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5,
     27.3, 27.5, 27.5, 27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0,
     36.5, 36.0, 37.0, 37.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0,
     40.0, 42.0, 43.0, 43.0, 43.5, 44.0]
)

# 퍼치 물고기의 무게 데이터
perch_weight = np.array(
    [5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0,
     110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0,
     130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0,
     197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0,
     514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0,
     820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0,
     1000.0, 1000.0]
)

# 데이터 시각화
# 길이와 무게 데이터를 산점도로 표시
plt.scatter(perch_length, perch_weight)
plt.xlabel('length')  # x축 라벨
plt.ylabel('weight')  # y축 라벨
plt.show()

# 데이터 분할
# train_test_split 함수를 사용하여 데이터를 훈련 세트와 테스트 세트로 분리
train_input, test_input, train_target, test_target = train_test_split(
    perch_length, perch_weight, random_state=42
)

# 데이터 변환
# 1차원 배열을 2차원 배열로 변환
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)

# k-최근접 이웃 회귀 모델 생성 및 훈련
# 기본 이웃 수(k=5)를 사용하여 모델 생성
knr = KNeighborsRegressor()
knr.fit(train_input, train_target)

# 모델 평가
# 테스트 세트에 대한 예측 생성
test_prediction = knr.predict(test_input)
# 평균 절댓값 오차 계산
mae = mean_absolute_error(test_target, test_prediction)
print(f'Mean Absolute Error: {mae}')

# 결정계수 계산
# 훈련 세트와 테스트 세트에 대한 결정계수(R²) 계산
train_score = knr.score(train_input, train_target)
test_score = knr.score(test_input, test_target)
print(f'Train R^2: {train_score}')
print(f'Test R^2: {test_score}')

코드 설명

데이터 준비

퍼치 물고기의 길이와 무게 데이터를 각각 perch_lengthperch_weight 배열로 준비합니다.

데이터 시각화

길이와 무게 데이터를 산점도로 표시하여 데이터의 분포를 시각적으로 확인합니다.

데이터 분할

train_test_split 함수를 사용하여 데이터를 훈련 세트와 테스트 세트로 분리합니다. random_state를 설정하여 실행할 때마다 동일하게 데이터를 분할할 수 있도록 합니다.

데이터 변환

1차원 배열을 2차원 배열로 변환합니다. 이는 scikit-learn의 회귀 모델이 2차원 배열을 입력으로 받기 때문입니다. reshape(-1, 1)을 사용하여 배열을 변환합니다.

k-최근접 이웃 회귀 모델 생성 및 훈련

기본 이웃 수(k=5)를 사용하여 KNeighborsRegressor 모델을 생성하고, fit 메서드를 사용하여 모델을 훈련합니다.

모델 평가

테스트 세트에 대한 예측을 생성하고, mean_absolute_error 함수를 사용하여 평균 절댓값 오차(MAE)를 계산합니다. 또한, 훈련 세트와 테스트 세트에 대한 결정계수(R²)를 계산하여 모델의 성능을 평가합니다.

요약

이 예제에서는 k-최근접 이웃 회귀를 사용하여 물고기의 길이와 무게 데이터를 기반으로 모델을 학습시키고 평가했습니다. 주요 개념과 사이킷런의 핵심 함수를 활용하여 회귀 문제를 해결하는 방법을 배웠습니다.

댓글남기기