[혼자 공부하는 머신러닝+딥러닝] 03-1 k-최근접 이웃 회귀
03-1 k-최근접 이웃 회귀
예측하려는 샘플에 가장 가까운 샘플 k개를 선택
이 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측
ex) 샘플 x의 가장 가까운 샘플 3개를 선택=>2개 네모 1개 세모 => 샘플 x의 클래스는 네모
문제 : 농어의 길이 높이 두께 측정 데이터를 통해 무게 예측하기
해결 : k- 최근접 이웃회귀를 통해 머신러닝 만들기
데이터 준비
사이킷런의 train_test_split() 함수를 사용해 훈련세트와 테스트 세트로 나누기
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)
결정계수(R^2)
KNeighborsClassifier와 비슷
객체를 생성하고 fit() 메서드로 회귀 모델 훈련
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
# k-최근접 이웃 회귀 모델을 훈련합니다
knr.fit(train_input, train_target)
테스트 세트의 점수 확인
점수:
분류의 경우) 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율(=정확도)
정답을 맞힌 개수의 비율
회귀의 경우) 이 점수를 결정계수라고 부름 (=결정계수 계산식에 따름)
만약 타깃의 평균 정도를 예측하는 수준이라면 결정계수는 0에 가까워지고
예측이 타깃에 아주 가까워지면 1에 가까운 값이 됨
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 정도 타깃값과 다르다는 것을 알 수 있다
과대적합 VS 과소적합
과대적합
만약 훈련 세트에서 점수가 좋았는데 테스트 세트에서는 점수가 나쁘다면 모델이 훈련세트
과대적합 되었다고 함
과소적합
훈련세트보다 테스트세트의 점수가 높거나 두 점수가 모두 너무 낮은 경우 모델이 훈련세트에
과소적합 되었다고 함(= 모델이 너무 단순하여 적절히 훈련되지 않은 경우)
문제: 앞서 평가한 훈련세트 점수 < 테스트 세트 점수
=> 과소적합
해결: 모델을 복잡하게 만들기
k 값을 줄이기
# 이웃의 갯수를 3으로 설정합니다
knr.n_neighbors = 3
# 모델을 다시 훈련합니다
knr.fit(train_input, train_target)
print(knr.score(train_input, train_target))
#0.9804899950518966
print(knr.score(test_input, test_target))
#0.9746459963987609