지도학습 알고리즘은 분류와 회귀로 나뉜다. KNN으로 회귀문제를 해결해보자.
KNN으로 회귀문제(새로운 샘플의 값을 예측)를 해결하는 방법은 이웃 샘플의 타깃값의 평균을 구하는 것이다.
# 훈련 데이터를 준비한다
import numpy as np
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])
농어의 길이 데이터를 사용하여(특성 데이터), 무게(타깃 데이터)를 예측해보자.
scatter plot으로 데이터의 분포를 확인한다.
이전과 달리 특성 데이터가 하나 뿐이므로,
xlabel에는 특성데이터 ylabel에는 타깃데이터를 설정하여 산점도를 그린다.
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
)
sklearn의 입력(input)데이터는 2차원 배열이어야 한다.
현재 perch_lenth는 1차원 배열이므로 이를 사용해 만든 train_input과 test_input도 1차원 배열이다.
해당 1차원 배열을 (n,1)형태의 2차원 배열로 변환한다.
기존에는 2개의 특성을 사용했으므로 자연스럽게 2차원 배열을 사용했지만,
이번에는 특성이 1개이므로 reshape()메서드를 사용하여 수동으로 변환해준다.
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)
# 회귀모델의 결정계수(R^2) 확인하기
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
knr.fit(train_input, train_target)
print(knr.score(test_input, test_target))
0.992809406101064
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 정도의 오차값을 보이는 것을 확인할 수 있다.
이번에는 훈련 모델의 평균 절댓값 오차를 계산해본다.
print(knr.score(train_input, train_target))
0.9698823289099254
훈련 세트를 사용한 점수가 낮고, 테스트 세트를 사용한 점수가 높은 것을 알 수 있다.
두 값은 비슷한 것이 좋다.
훈련 세트에서 점수가 높으면 과대적합, 반대는 과소적합이라 한다.
이 경우에는 과소적합에 해당한다.
과소적합의 해결을 위해 모델을 좀 더 복잡하게 만들어보자.
이 경우, KNN모델에서는 k의 개수를 줄이면 된다.
# 이웃의 개수 k를 3으로 설정하고 모델을 다시 fit한다.
knr.n_neighbors = 3
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
print(knr.score(test_input, test_target))
0.9804899950518966 0.9746459963987609
훈련 세트와 테스트 세트에서의 점수가 비슷해진 것을 알 수 있다.
과소적합 문제가 해결되었다.
'혼자 공부하는 머신러닝 딥러닝' 카테고리의 다른 글
선형회귀와 다항회귀 (0) | 2024.12.12 |
---|---|
데이터 전처리 (2) | 2024.12.09 |
훈련 세트와 테스트 세트 추출하기 (0) | 2024.12.03 |
사이킷런 KNN모델로 데이터 분류하기 (0) | 2024.11.27 |