[혼자 공부하는 머신러닝 + 딥러닝] 6강_회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어보기
6강_회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어보기
- 지도 학습의 한 종류인 회귀 문제를 이해하고 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))와 같은 모양)
댓글
댓글 쓰기