파이썬/ai

[ai, python]KNN에서의 overFitting UnderFitting

hojung 2022. 4. 11.
728x90
반응형

1. KNN에 대한 overview

나는 지난번과 동일하게 kneighbors nearest라는 모델을 사용해서 학습을 시키고 있다. 

사실 ai모델이라는 것은 거창한 것이 아니라 그저 수학적 모델을 기반으로 더 많은 데이터와 더 많은 예외 사항을 컴퓨터에게 알려주어 컴퓨터에게 다음부터는 이것도 고려해서 결과를 내! 라고 알려주는 일련의 과정이다. 

 

그 중 내가 지금 사용하는 KNN이라는 모델은 아주 간단한 모델인데 쉽게 말해 모든 데이터들을 그래프 평면 상에 그렸을 때 나와 가장 가까운 점들에 의해 나의 집합이 결정된다는 것이다. 

예시를 들면 다음과 같은 그래프에서 주황색 세모와 가장 가까운 점들은 초록 마름모 점들이다. 이 때 가장 가까운 점들의 개수, 즉 몇 개의 이웃을 우리는 고려할 것인가는 우리가 고려할 수 있다. 이 가장 가까운 점들을 파악했을 때 1이라는 집합에 속한 점이 4개 2라는 집합에 속하는 점은 1개라고 하면 우리가 구하고자 하는 주황색 세모의 점의 집합은 1이 되는 것이다. 

KNN에는 우리가 몇 개의 이웃을 고려할 것인가를 설정할 수 있기 때문에 이 이웃의 개수에 따른 문제가 존재한다. 

고려하는 이웃이 무작정 많다고 좋은 것도 아니고 적다고 좋은 것도 아니다. 우리가 끊임없이 컴퓨터에게 새로운 데이터를 넣고 고려하는 이웃의 수를 변경하고 하는 이유는 고려해야 하는 적당한 개수를 더 잘 찾기 위함이며 아직 정해지지 않은 상태이기 때문이다. ai학습이라는게 처음부터 우수한 성능을 내는 파라미터의 값이 정해져있기 보다는 우리가 무식하게 변경해보고 새로운 데이터를 넣어보고 하는 과정에서 최상의 값을 찾아내는 과정이기 때문에 논리 연산을 처리하는 cpu보다는 무식한 작업을 병렬로 어마무시한 속도로 처리할 수 있는 GPU 가 더 적합한 것이다. 

 


2. KNN에서의 overfitting과 underfitting문제 

앞선 포스팅에서 사용했던 도미와 빙어의 무게, 길이 데이터를 통해 knn모델을 학습시켜보겠다. 학습시키는 방법은 kneighborsClassifier를 설정해주고 fit이라는 api를 사용해서 우리가 준비한 데이터 셋을 넣어주는 것을 하는 과정이다. 

그 후 n의 값을 for문을 통해 변경 시켜주면서 n의 개수에 따른 정확도를 살펴보려고 한다. 

그 결과 n이 20일 때는 100% 정답을 맞추지 못하였다. 

 

이번에는 평균과 표준편차로 정규화 된 데이터를 넣어 살펴보도록 하겠다. 정규화 하는 과정은 값 - 평균 / 표준편차의 연산과정이다. 

정규화를 시켜준 후 학습을 시켰을 때에는 꽤 많은 n 값에서 정확도가 100%가 아닌 것을 확인할 수 있다. 이러한 n의 개수에 따른 정확도는 전체 데이터 셋의 개수 데이터의 비율 등 많은 요소들에 의해 달라지기 떄문에 우린 반복학습을 하며 정확도를 올려야한다. 

다음은 knn의 학습 모델을 n = 2 와 30으로 했을 떄 score를 평가해보았다. 

n = 2일 떄는 100%의 정확도가 나왔지만 n= 30일 떄는 약 70 퍼센트의 정확도가 나왔다. 물론 이 곳에서는 특별한 outlier가 존재하지 않고 데이터 셋의 개수가 작아 n = 2인 경우에는 문제가 발생하지 않았지만 더 많은 요소들이 고려되다보면 n =30처럼 많은 neighbor들을 고려했을 때 처럼 n = 2처럼 적은 neighbor수를 고려했을 경우도 문제가 발생할 수 있다. 

파이썬의 mglearn 라이브러리를 pip을 통해 설치해주고 다음을 그래프로 그려내면 다음과 같다. 

 

pip install mglearn

확인해보면 30의 neighbor를 고려했을 경우에는 아예 classification이 되지 않은 모습을 볼 수 있다. 너무 많이 고려해서 생기는 문제 이것을 overfitting이라고 한다. 

 

728x90
반응형

댓글