AI Development/머신러닝

k-최근접 이웃 알고리즘 1 (모델 만들기)

drinkgalaxy 2025. 11. 16. 19:23

도미와 빙어를 특성을 기준으로 이진 분류 해보자

도미 데이터 준비

리스트에서 첫 번째 도미의 길이는 25.4cm, 무게는 242.0g이다.

이렇게 각 도미의 특징을 길이와 무게로 표현한 것을 특성(feature)라고 부른다.*특성은 데이터의 특징이다.

 

이 데이터를 그래프 위에 산점도(그래프에 점으로 표시)로 그려 시각화해보자.

이렇게 산점도가 일직선에 가까운 형태로 나타나는 경우를 선형적이다 라고 말한다.

빙어 데이터 준비

이제는 2개의 산점도를 한 그래프에 그려보도록 하자.

빙어는 도미와 비슷하게 길이와 무게가 비례하지만 늘어나는 정도가 조금 다르다.

빙어는 길이가 늘어나더라도 무게가 많이 늘진 않는다. 따라서 빙어의 산점도도 선형적이지만 무게가 길이에 영향을 덜 받는다고 볼 수 있다. 

 

머신러닝 프로그램 시작 k-최근접 이웃(k-Nearest Neighbors) 알고리즘

k-최근접 이웃 알고리즘을 사용하기 전 도미와 빙어 데이터를 하나의 데이터로 합친다.

다음처럼 두 리스트를 더해 하나의 리스트로 만들어준다.

 

사이킷런(scikit-learn) 머신러닝 패키지를 사용하려면 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트를 만들어야 한다.

- zip() 함수: 나열된 리스트 각각에서 하나씩 원소를 꺼내 반환한다.

이런 리스트를 2차원 리스트라고 부른다.

 

이제 생선 49개의 길이와 무게를 모두 준비했으니, 마지막으로 정답 데이터를 준비해준다.

ex) 첫 번째 생선은 도미이고, 두 번째 생선도 도미라는 식으로 각각 l, w가 어떤 생선인지에 대한 답을 만드는 것이다.

- 참고로 머신러닝에서 2개를 구분하는 경우, 찾으려는 대상을 1로 놓고 그 외에는 0으로 놓는다.

- 위 예에서도 도미를 찾는 대상으로 정의했기 때문에 도미를 1로 놓고 빙어를 0으로 놓았다.

 

이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 임포트한다.

객체를 만들고 이 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킨다.

이런 과정을 머신러닝에서는 훈련(training)이라고 부른다. 사이킷런에서는 fit() 메서드가 이런 역할을 한다.

 

- score(): 모델이 얼마나 잘 훈련되었는지 평가하는 메서드. 0~1 사이의 값을 반환함.이 값을 정확도(accuracy)라고 부른다.

새로운 데이터를 도미로 판단

- predict(): 새로운 데이터의 정답을 예측하는 함수이다.

 

k-최근접 이웃 알고리즘을 위해 준비해야 할 일은, 데이터를 모두 가지고 있는게 전부이다.

단점은 데이터가 아주 많은 경우엔 사용하기 어렵다.

 

fit() 메서드에 전달한 데이터를 모두 저장하고 있다가, 새로운 데이터가 등장하면 가장 가까운 데이터를 참고해서 도미인지 빙어인지 구분하기 때문이다. 

즉, k-최근접 이웃 알고리즘은 주변에서 가장 가까운 n개의 데이터를 보고 다수결의 원칙에 따라 데이터를 예측한다.