Loading...

Python/머신러닝 / / 2022. 5. 17. 23:56

머신러닝 6강. k-최근접 이웃 회귀

반응형

지도 학습 알고리즘은 크게 분류와 회귀로 나뉜다.

회귀는 임의의 어떤 숫자를 예측하는 문제이다.

 

예측하려는 샘플에 가장 가까운 샘플 몇 개를 선택하여

이웃들의 타겟값의 평균이 예측 타겟값이 된다.

 

우선 농어의 길이만으로 무게를 예측해보자.

 

import numpy as np
import matplotlib.pyplot as plt

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")
plt.ylabel("weight")
plt.show()

그래프상에서 확인해보니 농어의 길이가 커짐에 따라 무게도 늘어난다.

 

테스트 세트와 훈련 세트로 나눠준다.

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42)

 

사이킷런을 사용하기 위해 2차원 배열로 바꿔준다.

# 사이킷런은 2차원 배열을 받아야함 (42, 1)

# print(train_input) # 1차원 배열임 (42, )
# print(train_input.size)

train_input = train_input.reshape(train_input.size, 1)
test_input = test_input.reshape(test_input.size, 1)

 

이제 학습시키고 테스트 세트의 점수를 확인해보자.

from sklearn.neighbors import KNeighborsRegressor

knr = KNeighborsRegressor()
knr.fit(train_input, train_target) # (길이, 무게)
knr.score(test_input, test_target)

분류 알고리즘에서 score의 점수는 테스트 세트에 있는 샘플을

정확하게 분류한 개수의 비율이다. 정확도!

 

회귀에서는 정확한 숫자를 맞힌다는 것은 거의 불가능하다.

예측하는 값이나 타겟 모두 임의의 수치이기 때문이다.

 

회귀의 경우에는 결정계수로 평가한다.

 

결정계수가 0.99라면 아주 좋은 값이다.

하지만 정확도처럼 R제곱이 직감적으로 얼마나 좋은지 이해하기에 어렵다.

 

타겟과 예측한 값 사이의 차이(SSE)를 구해보면

어느 정도 예측이 벗어났는지 가늠하기 좋을 것이다.

 

사이킷런의 metrics 패키지 아래

타겟과 예측값의 절댓값 오차를 평균하여 반환해주는

mean_absolute_error를 사용해보자.

from sklearn.metrics import mean_absolute_error

test_prediction = knr.predict(test_input) # 예측

# Mean Absoulte Error === Mean Squered Error
# 평균 절댓값 오차 mae ===  평균 제곱 오차 mse
mae = mean_absolute_error(test_target, test_prediction) # (실제정답, 예측값) 으로 얼마나 틀렸는지 확인
print(mae)

결과에서 예측이 평균적으로 19g 정도 타겟값과 다르다는 것을 알 수 있다.

 

그럼 훈련 세트의 결정계수도 살펴보자.

print(knr.score(test_input, test_target)) # 테스트 데이터로 결정계수 확인 0.99
print(knr.score(train_input, train_target)) # 훈련 데이터로 결정계수 확인 0.96

 

테스트 세트의 결정계수가 더 높은 것을 볼 수 있다.

보통 훈련 세트의 점수가 좀 더 높게 나오는 게 정상이다.

 

1. 과대 적합

만약 훈련 세트에서 점수가 굉장히 좋았는데

테스트 세트에서는 점수가 굉장히 나쁘다면

모델이 훈련 세트에 과대 적합되었다고 말한다.

 

2. 과소 적합

반대로 훈련 세트보다 테스트 세트의 점수가 높거나

두 점수가 모두 너무 낮은 경우

모델이 훈련 세트에 과소 적합되었다고 말한다.

 

즉 모델이 너무 단순하여 훈련 세트에 적절히 훈련되지 않은 경우이다.

 

이 경우를 해결하기 위해 선형 회귀 알고리즘을 사용해야 한다.

 

 

 

[출처]

 

혼자 공부하는 머신러닝 + 딥러닝

 

머신러닝+딥러닝 » 혼자 공부하는 책

혼자 공부하는 머신러닝 딥러닝, 무료 동영상 강의, 머신러닝+딥러닝 용어집을 다운로드 하세요. 포기하지 마세요! 독학으로 충분히 하실 수 있습니다. ‘때론 혼자, 때론 같이’ 하며 힘이 되겠

hongong.hanbit.co.kr

 

반응형