[혼자 공부하는 머신러닝 + 딥러닝] 6강_회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어보기

6강_회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어보기


k-최근접 이웃 회귀

  • k-최근접 이웃 분류 알고리즘
    • 예측하려는 샘플에 가장 가까운 샘플 k개를 선택
    • 그 다음 이 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측
  • k-최근접 이웃 회귀
    • 분류와 똑같이 예측하려는 샘플에 가장 가까운 샘플 k개를 선택 
    • 이웃한 샘플의 타깃은 어떤 클래스가 아니라 임의의 수치이기때문에 이들의 평균을 구함.


데이터 준비 

  • 산점도로 형태 확인 (matplotllib -> scatter() 함수 사용)
  • 훈련 세트와 테스트 세트 나누기 (sklearn -> train_test_split() 함수 사용)
    • sklearn 에 사용할 훈련 세트는 2차원 배열이어야 한다 (차원 바꿔주기)
      • reshape() 메서드 사용 : 배열의 크기를 바꿀 수 있음 (지정한 크기와 원소 배열의 원소 개수가 다르면 안됨)


sklearn에서 k-최근접 이웃 회귀 알고리즘을 구현한 클래스는 KNeighborsRegressor임



결정계수(R*2)



  • 식 
    • 각 샘플의 타깃과 예측한 값의 차이를 제곱하여 더함. 
    • 그 다음 타깃과 타깃 평균의 차이를 제곱하여 더한 값으로 나눔.
    • 만약 타깃의 평균 정도를 예측하는 수준이라면 결정계수는 0에 가까워지고, 예측이 타깃에 아주 가까워지면 1에 가까운 값이 됨. 
  • score() 메서드의 출력값의 의미
    • 값은 높을수록 좋은 것 (정확도나 결정계수)
    • 만약 score() 메서드가 에러율을 반환한다면 이를 음수로 만들어 실제로는 낮은 에러가  score() 메서드로 반환될 대는 높은 값이 되도록 바꿈. 
  • mean_absolute_error
    • 타깃과 예측의 절댓값 오차를 평균하여 반환함.


과대적합 vs 과소적합 

    • 훈련 세트와 테스트 세트의 점수를 비교했을 때 훈련 세트가 너무 높으면 과대적합, 그 반대이거나 두 점수가 모두 낮으면 과소적합임.
  • 모델을 훈련 세트에 훈련하면 훈련 세트에 잘 맞는 모델이 만들어짐.
  • 과대적합
    • 훈련 세트에서 점수가 굉장히 좋았는데 테스트 세트에서는 점수가 굉장히 나쁘다면 모델이 훈련세트에 과대적합 되었다고 말함.
    • 즉 훈련 세트에만 잘 맞는 모델이라 테스트 세트와 나중에 실전에 투입하여 새로운 샘플에 대한 예측을 만들 때 잘 동작하지 않을 것
  • 과소적합
    • 훈련 세트보다 테스트 세트의 점수가 높거나 두 점수가 모두 너무 낮은 경우
    • 즉 모델이 너무 단순하여 훈련 세트에 적절히 훈련되지 않은 경우 
    • 훈련세트가 전체 데이터를 대표한다고 가정하기 때문에 훈련 세트를 잘 학습하는 것이 중요함.
    • 과소적합이 일어나는 이유: 데이터가 작으면 테스트 세트가 훈련 세트의 특징을 따르지 못할 수 있음.
    • 과소적합 해결방법
      • 모델 복잡하게 만들기
      • 즉 훈련 세트에 더 잘 맞게 만들면 테스트 세트의 점수는 조금 낮아질 것
      • k-최근접 이웃 알고리즘으로 모델을 더 복잡하게 만드는 방법은 이웃의 개수 k를 줄이는 것. (훈련 세트에 있는 국지적인 패턴에 민감해짐)



회귀 문제 다루기

  • 회귀는 임의의 수치를 예측하는 문제 
  • k-최근접 이웃 회귀 모델은 분류와 동일하게 가장 먼저 가까운 k개의 이웃을 찾음.
  • 그 다음 이웃 샘플의 타깃값을 평균하여 이 샘플의 예측값으로 사용
  • 사이킷런은 회귀 모델의 점수로 결정계수 값 반환 (1이 짱)
    • 정량적 평가를 위해서는 절댓값 오차 사용할 수 있음
  • 모델을 훈련하고 나서 훈련 세트와 테스트 세트에 대해 모두 평가 점수 구할 수 있음.
  • 훈련 세트의 점수와 테스트 세트의 점수 차이가 크면 좋지 않으며 일반적으로 훈련 세트의 점수가 테스트 세트보다 조금 더 높음. 
  • 만약 테스트 세트의 점수가 너무 낮다면 모델이 훈련 세트에 과도하게 맞춰진 것이고 이를 과대적합이라고 함
    • 과대적합일 경우 모델을 덜 복잡하게 만들어야함. (k-최근접 이웃의 경우 k 값을 늘림)
  • 반대로 테스트 세트 점수가 너무 높거나 두 점수가 모두 낮으면 과소적합임. 
    • 과소 적합일 경우 모델을 더 복잡하게 만들어야 함. (k-최근접 이웃의 경우 k 값을 줄이는 것)


키워드로 끝내는 핵심 포인트 

  • 회귀
    • 회귀는 임의의 수치를 예측하는 문제.
    • 따라서 타깃값도 임의의 수치가 됨.
    • 두 변수 사이의 상관관계를 분석하는 방법
  • k-최근접 이웃 회귀
    • k-최근접 이웃 알고리즘을 사용해 회귀 문제를 품.
    • 가장 가까운 이웃 샘플을 찾고 이 샘플들의 타깃값을 평균하여 예측으로 삼음
  • 결정계수
    • 대표적인 회귀 문제의 성능 측정 도구 
    • 1에 가까울수록 좋고, 0에 가깝다면 성능이 나쁜 모델
  • 과대적합
    • 과대적합은 모델의 훈련 세트 성능이 테스트 세트 성능보다 훨씬 높을 때 일어남
    • 모델이 훈련 세트에 너무 집착해서 데이터에 내재된 거시적인 패턴을 감지하지 못함.
  • 과소적합
    • 훈련 세트와 테스트 세트 성능이 모두 동일하게 낮거나 테스트 세트 성능이 오히려 더 높을 때 일어남. 
    • 이런 경우 더 복잡한 모델을 사용해 훈련 세트에 잘 맞는 모델을 만들어야 함


핵심 패키지와 함수 

  • scikit-learn
    • KNeighborsRegressor
      • k-최근접 이웃 회귀 모델을 만드는 사이킷 런 클래스 
      • n_neighbors 매개변수로 이웃의 개수를 지정함. (기본값은 5)
      • 다른 매개변수는 KNeighborsClassifier 클래스와 거의 동일
    • mean_absolute_error()
      • 회귀 모델의 평균 절댓값 오차를 계산
      • 첫 번째 매개변수는 타깃, 두 번째 매개변수는 예측값을 전달.
      • 비슷한 함수로는 평균 제곱 오차를 계산하는 mean_squared_error()가 있음
      • 이 함수는 타깃과 예측을 뺀 값을 제곱한 다음 전체 샘플에 대해 평균한 값을 반환
  • numpy 
    • reshape
      • 배열의 크기를 바꾸는 메서드 
      • 바꾸고자 하는 배열의 크기를 매개변수로 전달 (전후 개수는 동일해야 함)
      • 넘파이는 종종 배열의 메서드와 동일한 함수를 별도로 제공함 (test_array.reshape(2,2) 와 np.reshape(test_array, (2,2))와 같은 모양)



댓글

이 블로그의 인기 게시물

[혼자 공부하는 머신러닝 + 딥러닝] 17강_인공 신경망: 간단한 인공 신경망 모델 만들기

[솔트룩스] 새싹 인공지능 응용 SW 개발자 양성과정 | 24일차 | 5. 머신러닝 (2)

[혼자 공부하는 머신러닝 + 딥러닝] 10강_확률적 경사 하강법 알아보기