[혼자 공부하는 머신러닝+딥러닝] 3-1. k-최근접 이웃 회귀
Intro.
김 팀장🗣️ "농어의 무게 데이터가 56개 빼고 다 날아갔어... 길이 데이터는 있는데, 혹시 이것만 보고 농어의 무게를 예측하는 모델을 만들어 줄 수 있을까? 무게가 측정되어있는 샘플 56개를 메일로 보내줄게."
1. 데이터 준비
농어 데이터 (길이, 무게)
- 이번엔 파이썬 리스트 → 넘파이 변환하지 말고, 처음부터 넘파이로 가져옴.
- 산점도로 그려보기
훈련세트와 테스트세트 분할
- 전에 배운 `train_test_split()` 함수로 간편하게 분할
- 그리고 사이킷런 입맛에 맞도록 2차원 배열로 크기 변경 by `.reshape()` 함수
2. 회귀 모델 만들기
알고리즘 준비
- `KNeighborsRegressor()` : 사이킷런 패키지의 'k-최근접 이웃 회귀 알고리즘'으로, 이웃 수치들의 평균으로 타깃값을 판단함.
- 🆚 'k-최근접 이웃 분류 알고리즘'은 타킷이 특정 클래스(도미 or 빙어)였던 반면, 이번엔 타깃이 임의의 수치값(무게=100)이라는 차이가 있음.
모델 훈련 및 평가
- `score`로 평가했을 때 출력값 = '결정 계수()'
- 0~1 사이의 값을 가지며, 예측값이 타깃에 잘 들어맞을수록 1에 가까워진다.
- 🆚 'k-최근접 이웃 분류 알고리즘'에서의 평가 출력값은 '정확도'였음
평균 절댓값 오차
- `mean_absolute_error()` : 회귀모델 평가 시 자주 쓰는 (또 다른) 지표 중 하나
- 해석 예시) '예측한 무게가 실제 무게들과 평균적으로 19g 정도 차이가 난다.'
- 해석 예시) '예측한 무게가 실제 무게들과 평균적으로 19g 정도 차이가 난다.'
3. 과대적합 vs 과소적합
문제 발견
- 원래 평가(score)하던 테스트세트 말고, 훈련세트로도 평가를 해보았더니 ...
- 값이 더 낮게 나옴 = '훈련 세트로 적절히 훈련되지 못했다'는 의미 = 과소적합 !
- 과대적합 : 훈련세트 > 테스트세트
'훈련세트에만 잘 맞는 모델이라 새로운 샘플 예측하기 부적절할 수 있다' - 과소적합 : 훈련세트 < 테스트세트
'모델이 너무 단순하여 훈련세트에 적절히 훈련되지 않았다'
- 과대적합 : 훈련세트 > 테스트세트
해결 방안
- 이웃의 개수(k)를 줄일수록 과대적합에 가까워지고, 늘릴수록 과소적합에 가까워짐!
성공적인 회귀모델 완성!
➕플러스 알파
➊ reshape()
- 넘파이 배열의 크기를 조정할 수 있는 메소드.
test_array = np.array( [1,2,3,4] ) # 크기가 (4, )인 배열을
test_array = test_array.reshape(2,2) # (2,2) 크기로 바꾸면
--------------------------------------------------------
[[1 2] # 이렇게 배열이 달라짐
[3 4]]
- 크기를 `-1`로 지정하면, 나머지 원소 개수로 알아서 채워주는 간편 기능도 있다.
ex) 위 예시에서 (2,2)가 아니라 (2,-1)로 해도 같은 결과가 나옴 - 지정한 크기가 원소의 개수와 맞아야 사용할 수 있다.
ex) 위 예시에서 (2,3)을 하면 크기가 달라서 오류 발생
➋ 확인문제 2번 풀이
- `plot()` : x축과 y축의 값을 전달받아, 선 그래프를 그리는 함수
- 결과 보면, 확실히 n이 커짐에 따라 모델이 단순해지는 것이 보인다!
- 결과 보면, 확실히 n이 커짐에 따라 모델이 단순해지는 것이 보인다!
🤔 Hmmmm...
118p. [1, 2, 3] 의 형태의 배열은 크기가 ( ,3)이 되어야하는 거 아닌가요? (3, )으로 하면 3행 1열이라는 뜻 아닌가요 ...?
그게 아니라, 튜플은 원소가 하나일 때 마지막에 콤마가 필요합니다.1차원 배열은 하나의 숫자를 사용해 표현하며 파이썬은 이에 튜플을 사용합니다.⏯️ 그럼 (n,)로 되어있는 건 다 그냥 1차원 배열로 보면 되겠지..? 맞음! 🆗
🤓 To wrap up...
농어의 길이 데이터를 이용해 농어의 무게를 예측해야하는 상황 → (분류가 아니라) 수치를 예측해야 하는 거니까 회귀 모델을 사용 → 전에 썼던 'k-최근접 이웃'의 원리를 활용한 KNeighborsRegressor 클래스를 사용 → 회귀 모델의 성능은 결정계수 또는 평균 절댓값 오차로 확인 가능 → 이번엔 훈련세트의 성능까지 확인해봤는데, 테스트세트보다 더 낮게 나옴 = 과소적합 → 이웃의 개수(`n_neighbors`)를 줄여서 해결!
이전까지는 분류만 가능한 간단한 모델이었는데, 오늘은 새로운 데이터를 예측할 수 있는 '회귀 모델'을 배웠다. 이전에 Kmooc랑 유튜브 강의 뒤져가면서 '회귀분석'을 어느정도 이해해놨던 것이 도움이 돼서 기뻤다 ㅎㅎ '회귀선' '최소제곱법' 같은 기본 논리를 알고 보아야 이해가 쉬운 챕터인 것 같다. (결정계수도 마찬가지!) 예전에 '과적합'이라는 개념도 얼핏 들었었는데 그게 오늘 배운 과대/과소적합인 것 같다. 배움은 언제나 이렇게 알게 모르게 쌓여가는 것 같다. 더 열심히 하자!
*본 포스팅은 이전에 Velog(https://velog.io/@simon919)에서 작성했던 글을 Tistory로 옮긴 것입니다.