-
지도학습 | 알고리즘 - KNN 분류Machine Learning/ML with Python Library 2024. 2. 5. 23:19
KNN, K-Nearest Neighbors 알고리즘은 가장 간단한 알고리즘이다. 훈련 데이터셋을 저장하는것이 모델을 만드는 과정의 전부이다. 예측은 간단하다. 가장 가까운 데이터 포인트, 즉, 최근접 이웃(Nearest Neighbor)를 찾는다.
가장 간단한 KNN 알고리즘은, 가장 가까운 훈련데이터 포인트를 최근접 이웃으로 찾아 예측에 사용하는 것이다.
mglearn.plots.plot_knn_classification(n_neighbors=1)
forge 데이터셋에 대한 1-NN 이웃 모델의 예측 위 예시에서는 데이터 포인트 3개를 추가했고, 별표로 표시했다. 그리고 추가한 각 데이터 포인트에서 가장 가까운 Training 데이터 포인트를 연결했다.
1개 뿐만 아니라 K개를 선택할 수 있고, 그렇기 때문에 K-NN 이라고 불려진다. 둘 이상의 최근접 이웃을 선택할 때는 레이블을 정하기 위해서 투표를 진행하는데, 테스트 포인트 하나에 대해 클래스 0에 속한 이웃이 몇개인지, 그리고 클래스 1에 속한 이웃이 몇개인지를 세고, 이웃이 더 많은 클래스를 레이블로 지정한다. 즉, 이웃들에게서 가장 많이 나타나는 클래스가 테스트 데이터의 클래스 예측값이 되는것이다. 3-NN 예시를 보자.
forge 데이터셋에 대한 3-NN 모델 예측 예시를 살펴보자. 주변 최근접 모두 0인 테스트 데이터(파랑)는 0으로, 주변 최근접 3개중 2개가 1인(주황) 나머지 두개의 테스트 셋은 레이블이 1로 지정되었다. 이 그림은 이진 분류 문제이지만, 클래스가 다수인 데이터셋도 같은 방법을 적용할 수 있다.
자, 그럼 scikit-learn을 사용해서 k-NN 알고리즘을 적용해보자. 성능 평가를 위해서 Training 데이터와 Test 데이터세트로 나눴다.
from sklearn.model_selection import train_test_split x, y = mglearn.datasets.make_forge() x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0) print("x_train\n", x_train, "\nx_test\n", x_test, "\ny_train\n", y_train, "\ny_test\n", y_test)
x_train
[[ 8.92229526 -0.63993225] [ 8.7337095 2.49162431] [ 9.32298256 5.09840649] [ 7.99815287 4.8525051 ] [11.0329545 -0.16816717] [ 9.17748385 5.09283177] [11.563957 1.3389402 ] [ 9.15072323 5.49832246] [ 8.34810316 5.13415623] [11.93027136 4.64866327] [ 8.1062269 4.28695977] [ 8.67494727 4.47573059] [ 9.67284681 -0.20283165] [ 9.50169345 1.93824624] [ 8.69289001 1.54322016] [ 9.96346605 4.59676542] [ 9.50048972 -0.26430318] [ 9.25694192 5.13284858] [ 8.68937095 1.48709629]]
x_test
[[11.54155807 5.21116083] [10.06393839 0.99078055] [ 9.49123469 4.33224792] [ 8.18378052 1.29564214] [ 8.30988863 4.80623966] [10.24028948 2.45544401] [ 8.34468785 1.63824349]]
y_train
[0 0 1 1 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0]
y_test
[1 0 1 0 1 1 0]이제 KNeighborsClassifier를 Import하고 오브젝트를 만들자. K는 3으로 지정했다.
from sklearn.neighbors import KNeighborsClassifier clf = KNeighborsClassifier(n_neighbors=3) # Train KNN Model clf.fit(x_train, y_train) # Prediction print("Prediction Test Set:", clf.predict(x_test)) print("Test Set:", y_test) print("Accuracy: {:.2f}".format(clf.score(x_test, y_test)))
Prediction Test Set: [1 0 1 0 1 0 0]
Test Set: [1 0 1 0 1 1 0]
Accuracy: 0.86KNeighborsClassifier 오브젝트를 만들고 3-NN으로 설정한 후, fit 함수를 이용해서 KNN 모델을 트레이닝 했다. 이후, predict 함수를 이용해서 x_test를 인풋으로 한 값을 예측했고, 실제 결과 값이 들어있는 y_test와 비교를 하기위해 score함수를 사용했다. 7개의 결과중 1개를 제외하고 모든 값을 맞췄다. 0.86%의 예측률을 보였다. 즉, 이 KNN의 정확도는 0.86이었다.
Reference
https://www.yes24.com/Product/Goods/42806875
파이썬 라이브러리를 활용한 머신러닝 - 예스24
사이킷런 핵심 개발자에게 배우는 머신러닝 이론과 구현 현업에서 머신러닝을 연구하고 인공지능 서비스를 개발하기 위해 꼭 학위를 받을 필요는 없다. 사이킷런(scikit-learn)과 같은 훌륭한 머신
www.yes24.com
https://colab.research.google.com/drive/1fzSiPpwbTUplw6G0PJSpGaVBWx5CEMIZ?usp=sharing
_02_supervised_machine_learning.ipynb
Colaboratory notebook
colab.research.google.com
'Machine Learning > ML with Python Library' 카테고리의 다른 글
지도학습 | K-NN Regression (최근접 이웃 회귀) (1) 2024.03.24 지도학습 | 알고리즘 - KNN KNeighborsClassifier 분석 (1) 2024.02.07 지도학습 | 알고리즘 - 데이터셋 (1) 2024.02.04 지도학습 | 일반화, 과대적합, 과소적합 (0) 2024.02.04 지도학습 | 분류와 회귀 (0) 2024.01.29