bskyvision$

[ubuntu+python] kNN(k-Nearest Neighbors)으로 붓꽃 품종 예측

코딩/python
@2020-01-18 01:11:20

이번 시간에는 kNN을 이용해서 붓꽃의 품종을 예측하는 코드를 소개해드리도록 하겠습니다. kNN은 한국어로 k-최근접이웃으로 번역되기도 합니다. kNN의 작동원리는 매우 간단합니다. 새로운 데이터가 있는데 그 데이터의 클래스를 모른다면, 훈련 데이터셋에서 그 새로운 데이터와 가장 비슷하게 생긴 놈을 찾아서 걔랑 같은 유형이라고 라벨링해버리는 것입니다. kNN에 대한 이론적인 내용은 이전 포스팅을 참고해주세요.^^

 

유유상종의 진리를 이용한 분류 모델, kNN(k-Nearest Neighbors)  

 

오늘 예제 코드를 실행하기 위해서는 scikit-learn(사이킷런) 라이브러리와 NumPy 라이브러리가 필요합니다. 마찬가지로 각자 운영체제에 맞게 설치해주시면 됩니다.^^ 사이킷런은 안드레아스 뮐러라는 분이 주도해서 만든 머신러닝 라이브러리입니다. 꽤 쓸만하다고 합니다. 그리고 항상 느끼는 바이지만 역시 다운로드 및 설치는 리눅스가 윈도우에 비해 훨씬 편합니다.

 

붓꽃 품종에는 setosa, versicolor, virginica와 같은 세 개의 종이 있다고 합니다. 붓꽃의 꽃잎의 폭과 길이, 꽃받침의 폭과 길이를 측정한 것을 가지고 어느 붓꽃 품종에 속하는지를 예측하는 예제입니다. 간단히 말해서 4개의 특성(feature)과 3개의 클래스(class)가 있는 문제입니다.

 

150개의 샘플을 포함하고 있는 붓꽃 데이터셋에서 랜덤하게 선택한 75%를 훈련셋으로 나머지 25%를 테스트셋으로 해서 예측 정확도를 평가해보도록 하겠습니다. 

 

이것을 수행해주는 코드는 다음과 같습니다. 중요한 부분에는 한글로 주석을 달아놓았으니 참고하시기 바랍니다. 

import numpy as np

from sklearn.datasets import load_iris
iris_dataset = load_iris() # 붓꽃 데이터셋을 적재합니다. 

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)
# 데이터셋을 랜덤하게 75%의 훈련셋과 25%의 테스트셋으로 분리합니다.  

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) 

knn.fit(X_train, y_train) # kNN 분류기를 훈련셋으로 훈련시킵니다. 

y_pred = knn.predict(X_test) # 테스트셋의 라벨값을 예측합니다. 

print("prediction accuracy: {:.2f}".format(np.mean(y_pred == y_test)))

 

이 코드를 실행하면, 다음과 같은 결과가 출력됩니다. 

 

 

예측 정확도가 0.97이라고 하니 꽤 높죠? 150개 중에 25%가 테스트셋이니까, 38개의 테스트셋의 클래스중 97%의 클래스를 맞췄다는 것입니다. 거의 한, 두 개 빼고는 다 제대로 예측해낸 것입니다. 

 

오늘은 kNN을 이용해서 붓꽃의 품종을 예측하는 문제에 대해 다뤄봤습니다. 사실 이 문제는 머신러닝 분야에서 아주 유명하고도 오래된 예제입니다. ㅎㅎ 

 

항상 질문과 지적은 환영합니다.^^ 담에 또 찾아뵙겠습니다! 

댓글

[1] [···] [103] [104] [105] [106] [107] [108] [109] [110] [111]