
1. k-최근접 이웃 회귀
분류
샘플을 몇개의 클래스 중 하나로 분류하는 문제
예시) 이것은 도미인가, 빙어인가?
회귀
임의의 어떤 숫자를 예측하는 문제
예시) 내년도 경제 성장률은?
k-최근접 이웃 회귀
예측하려는 샘플에 가장 가까운 샘플 k개를 선택.
이웃 샘플들의 평균을 구해 새로운 샘플의 타깃값을 예측.
2. 데이터 준비
농어의 길이와 무게
농어 데이터 산점도
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_length는 1차원 배열임.
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_input과 test_input을 2차원 배열로 바꾸기
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²)
회귀를 평가하는 점수
타깃의 평균 정도를 예측하는 수준이라면 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
과소적합 해결.
'머신러닝 > 혼공머신' 카테고리의 다른 글
혼공머신 | Chap 03-3. 특성 공학과 규제 (0) | 2022.08.24 |
---|---|
혼공머신 | Chap 03-2. 선형 회귀 (0) | 2022.08.23 |
혼공머신 | Chap 02-2. 데이터 전처리 (0) | 2022.08.17 |
혼공머신 | Chap 02-1. 훈련 세트와 테스트 세트 (0) | 2022.08.11 |
혼공머신 | Chap 1-03. 마켓과 머신러닝 (0) | 2022.08.08 |