최근접 이웃 분류

이번 포스트에서는 최근접 이웃 분류(일명 knn)에 관해 간단하게 알아보도록 하겠습니다. 최근접 이웃 분류란 해당 데이터 포인트에서 가장 가까운 곳에 위치한 데이터 포인트의 라벨을 예상값으로 하는 알고리즘입니다. Scikit-learn을 이용하여 교차 검증을 거쳐 최근접 이웃 분류를 해보도록 하겠습니다.

우선 import 부터 선언하겠습니다.

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

우리가 사용할 데이터셋은 ‘씨앗 데이터셋’입니다.

참고:: https://www.dropbox.com/s/9xmhhvi6gm5dwo0/iris.txt?dl=0

씨앗 데이터셋은 7개의 Feature와 1개의 Label을 가진 210종의 씨앗을 모아둔 데이터셋입니다.

with open("C:₩₩~~~₩₩seeds.tsv", 'r') as f:
    entire_file = list(line.split() for line in f)

entire_file = np.array(entire_file)
print(np.shape(entire_file))     # (210, 8)

사용하기 좋게 Feature와 Label을 Numpy 배열에 나눠 담는 작업을 합니다. 여기서 주의할 점은 KNN에 들어갈 Label은 꼭 1차원 배열이어야 한다는 것입니다. 아래 코드에서 reshape하지 않고 사용했더니 정확도가 30% 가량이 나왔습니다.(나온 것도 신기…)

features = entire_file[:, :-1]

labels = entire_file[:, [-1]]
labels = np.reshape(labels, -1)

KNN 분류기를 생성합니다. 생성 시 n_neighbors를 인자로 전달하게 되는데 이는 ‘몇 명의 이웃’을 보고 예상값을 전달해줄지 결정해주는 인자입니다. 이 값이 1이라면 가장 가까운 1명의 이웃을 보고 예상값을 반환해줍니다. 이 값이 10이라면 가장 가까운 10명의 이웃의 Label을 살펴보고 빈도수가 가장 높은 Label을 반환해줍니다.

classifier = KNeighborsClassifier(n_neighbors=10)

교차 검증을 하고자 하니 데이터를 학습용과 검증용으로 나눌 필요가 있습니다. Scikit-learn에서는 이를 편리하게 하는 모듈을 제공합니다. kf에는 훈련용 데이터와 검증용 데이터가 불 배열 형태로 List에 담겨있습니다.

from sklearn.cross_validation import KFold
kf = KFold(len(features), n_folds=3, shuffle=True)

교차 검증의 중첩 당 정확도를 구한 뒤 한번에 합하기 위해 List를 만듭니다.

means = []

kf에서 훈련용 데이터와 검증용 데이터를 꺼내와 가장 적합한(fit) KNN 모델을 찾고 정확도를 측정합니다.

for training, testing in kf:
    classifier.fit(features[training], labels[training])
    prediction = classifier.predict(features[testing])
    curmean = np.mean(prediction == labels[testing])
    means.append(curmean)
    
print("전체 정확도: {:.1%}".format(np.mean(means)))

* 출력값
전체 정확도: 90.5%

 


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다