카테고리 없음

[혼자 공부하는 머신러닝+딥러닝] 03-1 k-최근접 이웃 회귀

oneaney 2023. 11. 4. 22:36

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