본문 바로가기
ML/Machine Learning

ML) KNN 이웃 알고리즘 (지도학습)

by 후르륵짭짭 2020. 8. 8.
728x90
반응형

안녕하세요!! 후르륵짭짭 입니다.

처음으로 머신러닝 알고리즘에 대해서 알아보도록 하겠습니다.

사실 저도 초보자라,,,, 잘 모르지만 ㅎㅎㅎ 그래도 공부한 것을 공유한다 생각하고 

귀엽게 봐주셨으면 합니다 ㅎㅎㅎ

 

이번에 실험으로 사용될 데이터는 저번 시간에 뽑아낸 

농구선수의 데이터를 활용하겠습니다.

 

** KNN 이웃 알고리즘 이란 **

KNN 이웃 알고리즘은 가장 간단한 머신러닝 알고리즘 입니다. 

그냥 간단하게 새로운 데이터가 들어 왔을 때, 기존의 훈련 데이터셋에서 가장 가까운 친구들로 정해주는 겁니다.

이것이 K-NN(near Neighbors) 알고리즘 입니다.

KNN에는 회귀와 분류가 있는데, 저는 분류만 하도록 하겠습니다.

왜냐하면 회귀와 분류 모두 동일한 방식으로 사용되기 때문입니다.

 

** IMPORT 해주기 **

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

일단 이렇게 import 해주세요.

numpy는 데이터를 가져오거나 행렬이나 선형대수학에 필요한 라이브러리를 포함하고 있습니다.

matplotlib은 그래프를 표현해주는 라이브러리 입니다

model_selection은 훈련데이터와 테스트 데이터를 나눠주는 라이브러리 입니다.

 

** 데이터 그려보기 **

일단 matplotlib를 실습해보도록 하겠습니다.

x = [1,2,3,4,5,6,-1,-2,-3,-4,-5]
y = [1,2,3,4,5,6,-1,-2,-3,-4,-5]

plt.scatter( x[:6], y[:6], label = "plus", color="red")
plt.scatter( x[6:], y[6:], label = "minus", color="blue")
plt.scatter(-4,-2, label = "new", color ="g")
plt.scatter(-5,1, color ="g")

plt.xlabel('X')
plt.ylabel('Y')
plt.legend(loc = "best")

이렇게 코드를 적어주세요

plt.scatter는 2차원 데이터를 표로 보여주는 함수 입니다.

이때 매개 변수로 ( 일차원 가로 값 , 일차원 세로 값 , 데이터 이름 , 데이터 색 ) 

이렇게 가집니다. 이때 주의해야할 것이 scatter에 일차원 배열 값만 들어 갈 수 있다는 겁니다.

plt.xlabel = 표의 가로의 이름 / plt.ylabel =  표의 세로 이름 / plt.legend = 데이터 이름 표현

그러면 아래 처럼 결과가 나올 겁니다.

** 실제 데이터 표현하기 **

이제 실제 데이터를 표로 그려 보도록 하겠습니다.

input_file = "./NBA2K20_Result_remake_txt.txt"
data = np.loadtxt(input_file, delimiter=',', dtype='float32')

일단 위에 처럼 적어주세요.

(참고로, 데이터를 가져오기 위해서는 txt 파일 인코딩을 ANSI로 해줘야한다. 그리고 문자열은 지워줘야한다. )

data = np.loadtxt(파일 이름 , 분리 기준 , 숫자 타입) 이렇게 해줍니다.

Info , position = data[:,2:4] , data[:,1]

height = []
weight = []
for element in Info:
        height.append(element[0])
        weight.append(element[1])
        

plt.scatter( height[:100], weight[:100], label = "guard", color = "red")
plt.scatter( height[100:200], weight[100:200], label = "forword", color = "blue")
plt.scatter( height[200:300], weight[200:300], label = "center", color = "green")

plt.legend(loc = "best")
plt.xlabel('height')
plt.ylabel('weight')
plt.show()

그리고 Info와 position에 데이터를 넣어줍니다. 

데이터가 이렇게 되어 있기 때문에 data [ : , 2:4]로 해줬습니다. 

(참고로 " : "을 slice 라고 불리는데 아무것도 없으면 "처음 부터 끝까지"를 의미합니다. 

만약 2:4 로 되어 있다면 "위치 2 부터 위치 4전까지" 를 의미합니다. 데이터가 행과 열로 되어있기 때문에

data[열, 행] 이렇게 구성 됩니다. )

plt.scatter는 반복문에서는 사용 될 수 없어서 저렇게 하나씩 적어줘야합니다.

또한 각 포지션 마다 100개 씩 정해져 있기 때문에 100개씩 해줬습니다.

위에 처럼 코드를 적어주면 

이렇게 표로 결과가 나옵니다.

 

** KNN 알고리즘 실습 **

이제 KKN을 실습 해보도록 하겠습니다.

x_train, x_test, y_train, y_test = train_test_split(Info, position, random_state=0)

일단 이렇게 선수의 정보가 담긴 Info 와 선수 포지션이 담긴 position 을 train_test_split 에 넣어줍니다.

train_test_split(데이터 , 데이터 결과 , 고정값) 이렇게 되어서 훈련 데이터와 테스트 데이터를 나눠줍니다.

x는 데이터(Info)를 의미하고 y는 결과(position)를 담습니다.

 

Knn = KNeighborsClassifier(n_neighbors=10)
Knn.fit(x_train, y_train)

print("정확도 : ",Knn.score(x_test,y_test))
//결과
//정확도 :  0.9066666666666666

이제 Knn에 대해서 알아보도록 하겠습니다. 

KNeighborsClassifier()는 KNN알고리즘을 담고 있는 객체 입니다.

KNN은 새로운 데이터를 K 개의 이웃과 가까운 데이터로 지정해줍니다.

따라서 n_neighbors 는 바로 K 를 의미합니다.

마지막에 Knn.fit(훈련 데이터 , 훈련 결과)를 넣어주면 머신러닝이 훈련을 하게 됩니다.

(참고로, 이 훈련하는 알고리즘은 어떻게 만들었는지 궁금한 상태 입니다 ㅎㅎㅎ)

이제 Knn.score(테스트 데이터, 테스트 결과)를 넣어주면 정확도가 나옵니다.

 

하지만 이웃의 갯수를 몇개를 하느냐에 따라 결과 값이 달라질 수 있습니다.

따라서 아래 와 같이 코드를 적어준다면 하나의 선 그래프를 볼 수 있습니다.

train_accuracy = []
test_accuracy = []

for cnt_neighbor in range(1,15):
    Knn = KNeighborsClassifier(n_neighbors=cnt_neighbor)
    Knn.fit(x_train,y_train)
    
    train_accuracy.append(Knn.score(x_train,y_train))
    test_accuracy.append(Knn.score(x_test,y_test))

plt.plot(range(1,15) , train_accuracy , label = "train accuracy", color = "blue")
plt.plot(range(1,15) , test_accuracy , label = "test accuracy", color = "red")
plt.xlabel("cnt_neighbor")
plt.ylabel("accuracy")
plt.legend()

만약에 입력한 결과 값을 직접 확인 해보고 싶을 경우에는 predict 메소드를 사용해서 

하나씩 아니면 배열 자체를 확인 할 수 있습니다.

plt.scatter( height[:100], weight[:100], label = "guard", color = "red")
plt.scatter( height[100:200], weight[100:200], label = "forword", color = "blue")
plt.scatter( height[200:300], weight[200:300], label = "center", color = "green")

plt.scatter(174, 65, label = "me", color = "yellow")

plt.legend(loc = "best")
plt.xlabel('height')
plt.ylabel('weight')
plt.show()

print("결과 : ",Knn.predict([[174,65]]))

이렇게 저는 포인트 가드라는 예측이 되져 ㅎㅎㅎㅎ

NBA 선수들에 비해서 완전 호빗이져 ㅎㅎㅎㅎ

 

** 정리 **

KNN 알고리즘은 이해하기 쉬운 모델이라는 겁니다!! ㅎㅎ

그냥 K 개에 인접한 것을 보고 확인하는 거니깐요 ㅎㅎㅎ 그런데 은근히 정확하기도 합니다.

쉽고 정확하기 때문에 나름 좋다고 생각하지만,,, 치명적인 단점이 있습니다.

지금 처럼 키와 몸무게 처럼 특성이 2개나 4개 이렇게,,, 작을 경우에는 좋지만 

많을 경우에는 정말 치명적으로 안 좋습니다.

그리고 심지어 느려지기 까지 합니다....

그래서 실제로는 많이 사용되지 않는 다고 합니다.

 

지금까지 머신러닝 첫 알고리즘인 KNN 이웃 알고리즘에 대해서 알아봤습니다.

호기심으로 공부하는 것이라 아직 전문적으로 설명을 못했지만

아 이런게 있구나 싶게 넘어 갔으면 좋겠습니다.

감사합니다

모두 즐코코코 하세요!!

728x90
반응형

댓글