[혼공머신] 3-1. k-최근접 이웃 회귀

성준혁·2023년 1월 6일
0

혼공머신

목록 보기
6/21
post-thumbnail

Intro.

김 팀장🗣️ "농어의 무게 데이터가 56개 빼고 다 날아갔어... 길이 데이터는 있는데, 혹시 이것만 보고 농어의 무게를 예측하는 모델을 만들어 줄 수 있을까? 무게가 측정되어있는 샘플 56개를 메일로 보내줄게."

1. 데이터 준비

농어 데이터 (길이, 무게)

  • 이번엔 파이썬 리스트 → 넘파이 변환하지 말고, 처음부터 넘파이로 가져옴.
  • 산점도로 그려보기

훈련세트와 테스트세트 분할

  • 전에 배운 train_test_split() 함수로 간편하게 분할
  • 그리고 사이킷런 입맛에 맞도록 2차원 배열로 크기 변경 by .reshape() 함수

2. 회귀 모델 만들기

알고리즘 준비

  • KNeighborsRegressor() : 사이킷런 패키지의 'k-최근접 이웃 회귀 알고리즘'으로, 이웃 수치들의 평균으로 타깃값을 판단함.
  • 🆚 'k-최근접 이웃 분류 알고리즘'은 타킷이 특정 클래스(도미 or 빙어)였다면,
    이번엔 타깃이 임의의 수치(무게=100)라는 차이가 있음.

모델 훈련 및 평가

  • 출력값 = '결정계수(R2R^2)'
  • 0~1 사이의 값을 가지며, 예측값이 타깃에 잘 들어맞을수록 1에 가까워진다.
  • 🆚 'k-최근접 이웃 분류 알고리즘'에서의 출력값은 '정확도'였음

평균 절댓값 오차

  • mean_absolute_error() : 회귀모델 평가 시 자주 쓰는 지표 중 하나
    해석 예시) '예측한 무게가 실제 무게들과 평균적으로 19g 정도 차이가 난다.'

3. 과대적합 vs 과소적합

문제의 원인

  • 원래 평가(score)하던 테스트세트 말고, 훈련세트로도 평가를 해보았더니 ...
  • R2R^2값이 더 낮게 나옴 = '훈련 세트로 적절히 훈련되지 못했다'는 의미 = 과소적합 !
    • 과대적합 : 훈련세트 R2R^2 > 테스트세트 R2R^2
      '훈련세트에만 잘 맞는 모델이라 새로운 샘플 예측하기 부적절할 수 있다'
    • 과소적합 : 훈련세트 R2R^2 < 테스트세트 R2R^2
      '모델이 너무 단순하여 훈련세트에 적절히 훈련되지 않았다'

해결 방안

  • 이웃의 개수(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이 커짐에 따라 모델이 단순해지는 것이 보인다!


🤔 Hmmmm...

118p. [1, 2, 3] 의 형태의 배열은 크기가 ( ,3)이 되어야하는 거 아닌가요? (3, )으로 하면 3행 1열이라는 뜻 아닌가요 ...?

그게 아니라, 튜플은 원소가 하나일 때 마지막에 콤마가 필요합니다.
1차원 배열은 하나의 숫자를 사용해 표현하며 파이썬은 이에 튜플을 사용합니다.⏯️ 그럼 (n,)로 되어있는 건 다 그냥 1차원 배열로 보면 되겠지..?

🤓 To wrap up...

농어의 길이 데이터를 이용해 농어의 무게를 예측해야하는 상황 → (분류가 아니라) 수치를 예측해야 하는 거니까 회귀 모델을 사용 → 전에 썼던 'k-최근접 이웃'의 원리를 활용한 KNeighborsRegressor 클래스를 사용 → 회귀 모델의 성능은 결정계수 또는 평균 절댓값 오차로 확인 가능 → 이번엔 훈련세트의 성능까지 확인해봤는데, 테스트세트보다 더 낮게 나옴 = 과소적합 → 이웃의 개수(n_neighbors)를 줄여서 해결!

이전까지는 분류만 가능한 간단한 모델이었는데, 오늘은 새로운 데이터를 예측할 수 있는 '회귀 모델'을 배웠다. 이전에 Kmooc랑 유튜브 뒤져가면서 '회귀분석'을 어느정도 이해해놨던 것이 도움이 돼서 기뻤다 ㅎㅎ '회귀선' '최소제곱법' 같은 기본 논리를 알고 보아야 이해가 쉬운 챕터인 것 같다. (결정계수도 마찬가지!) 예전에 '과적합'이라는 개념도 얼핏 들었었는데 그게 오늘 배운 과대/과소적합인 것 같다. 배움은 언제나 이렇게 알게 모르게 쌓여가는 것 같다. 더 열심히 하자!

profile
생각은 그만

0개의 댓글