머신러닝/혼공머신

혼공머신 | Chap 03-1. k-최근접 이웃 회귀

하카데미 2022. 8. 22. 18:36

지도학습은 분류와 회귀로 나눌 수 있다.

 

1. k-최근접 이웃 회귀

분류

샘플을 몇개의 클래스 중 하나로 분류하는 문제

예시) 이것은 도미인가, 빙어인가?

 

회귀

임의의 어떤 숫자를 예측하는 문제

예시) 내년도 경제 성장률은?

 

k-최근접 이웃 회귀

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

이웃 샘플들의 평균을 구해 새로운 샘플의 타깃값을 예측.

 

2. 데이터 준비

농어의 길이와 무게

http://bit.ly/perch_data

 

농어 데이터 산점도

import matplotlib.pyplot as plt

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차원 배열이어야 한다.

현재 perch_length1차원 배열임.

2차원으로 변경해야 함.

 

reshape()

넘파이 배열의 크기를 바꿀 수 있는 메서드

# 예시)
test_array = np.array([1, 2, 3, 4])
print(test_array.shape)
# 출력 결과 (4, )

test_array = test_array.reshape(2, 2)
print(test_array.shape)
# 출력 결과 (2, 2)

 

주의!

지정한 크기와 원본 배열의 원소 개수가 같아야 한다!

 

train_inputtest_input2차원 배열로 바꾸기

train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)
print(train_input.shape, test_input.shape)
# 출력 결과 (42, 1) (14, 1)

 

train_input의 크기는 (42, )

2차원 배열로 변경바꾸려면 train_input.reshape(42, 1)로 사용.

배열의 크기를 자동으로 지정하려면 크기에 -1을 지정하면 됨.

 

3. 결정계수(R²)

KneighborsRegressor()

사이킷런에서 k-최근접 이웃 회귀 알고리즘을 구현한 클래스

 

from sklearn.neighbors import KneighborsResgressor

knr = KneighborsRegressor()
knr.fit(train_input, train_target)
print(knr.score(test_input, test_target))
# 출력 결과 0.9928094061010639

 

결정계수(coefficient of determination, R²)

회귀를 평가하는 점수

 

타깃의 평균 정도를 예측하는 수준이라면 0엥 가까워지고,

예측에 아주 가까워지면 1에 가까운 값이 됨.

 

사이킷런의 score()는 출력하는 값이 높을 수록 좋은 것.

 

타깃과 예측한 값 사이의 차이를 구해보자.

from sklearn.metrics import mean_absolute_error

test_prediction = knr.predict(test_input)
mae = mean_absolute_error(test_target, test_prediction)
print(mae)    # 출력 결과 19.157142857142862 → 약 19g

 

4. 과대적합 vs 과소적합

print(knr.score(train_input, train_target))
# 출력 결과 0.9698823289099255

 

과대적합 overfitting

훈련 세트에서 점수가 좋았는데

테스트 세트에서 점수가 나쁜 경우

 

과소적합 underfitting

훈련 세트보다 테스트 세트의 점수가 높거나 두 점수 모두 너무 낮은 경우.

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

 

농어의 경우,

테스트 셋의 점수가 더 높으므로,

과소적합!

 

과소적합 해결 방법

모델을 좀더 복잡하게 만들기.

k-최근접 이웃 알고리즘을 복잡하게 만드는 방법은

이웃의 개수 k를 줄이는 것.

이웃의 개수를 줄이면 훈련 세트에 있는 국지적인 패턴에 민감해지고,

이웃의 개수를 늘리면 일반적인 패털을 따르게 됨.

 

knr.n_neighbors = 3    # 기본 k값은 5
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
# 출력 결과 0.9804899950518966

print(knr.score(test_input, test_target))
# 출력 결과 0.9746445996398761

과소적합 해결.