외로운 Nova의 작업실

지도 학습 - knn 알고리즘 이론 및 실습 본문

AI/machine-learning

지도 학습 - knn 알고리즘 이론 및 실습

Nova_ 2023. 10. 7. 20:28

- KNN 알고리즘

KNN 알고리즘은 K nearest Neighbor의 약어로 가장 가까운 k개의 이웃을 기준으로 분류하는 것을 말합니다. KNN에서 고려할 점은 최적의 K값을 찾는 것 입니다. K값에 따라서 결과가 달라질 수 있기 때문입니다.

 

- 실습

농구선수 포지션 추측 머신러닝 모델 만들기

 

먼저, pandas로 데이터셋을 불러옵니다.

import pandas as pd
df = pd.read_csv("../data/csv/basketball_stat.csv")
df.head()

<데이터 특징 추출>

데이터셋의 특징에는 Pos, 3P, 2P TRB, AST, STL, BLK가 있습니다. 아래는 각각 설명입니다.

Pos : 우리가 맞춰야할 포지션을 말합니다.

3P : 한 경기당 3점슛을 넣은 횟수

2P : 한 경기당 2점슛을 넣은 횟수

TRB : 한 경기당 리바운드 횟수

AST : 한 경기당 어시스트 횟수

STL : 한 경기당 스틸 횟수

BLK : 한 경기당 블로킹 횟수

 

각 특징에서 이제 포지션과 관계가 있는 특징을 추출해야합니다. Pos에는 SG(슈팅가드)와 C(센터)가 있습니다.

SG : 슈팅가드로 코트내에서 3점슛 등 장거리 슛을 함

C : 센터로 리바운드 및 블로킹하여 수비를 하고 공격찬스를 만들고 3점슛을 하기도함

 

따라서 포지션과 관계 있는 특징은 아래와 같습니다.

3P, TRB, BLK

 

각 특징에 따라 포지션별로 나눠지는지 특징 확인을 해보겠습니다.

 

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

sns.lmplot('STL', '2P', data=df, fit_reg=False, scatter_kws={'s':150}, markers=["o", "x"], hue="Pos")

plt.title('STL and 2P in 2d plane')

먼저 STL과 2P로 Pos를 구분해보면

이렇게 많이 겹쳐져있는 것을  확인할 수 있습니다.

 

이번에 BLK와 3P로 Pos를 구분해보면

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

sns.lmplot('BLK', '3P', data=df, fit_reg=False, scatter_kws={'s':150}, markers=["o", "x"], hue="Pos")

plt.title('BLK and 3P in 2d plane')

위 처럼 잘 나누어져 있는 것을 볼 수 있습니다.

 

<데이터 전처리>

이제 필요없는 데이터를 없애겠습니다.

df.drop(['2P', 'AST', 'STL'], axis=1, inplace=True)

 

<모델 구현 및 검증>

이제 모델을 구현해보겠습니다.

#테스트 데이터셋과 학습 데이터셋을 나누어줍니다.
#테스트 데이터셋은 마지막 성능 테스트할때 사용하며
#학습데이터셋은 학습 데이터와 검증 데이터로 나뉘어 사용됩니다.
#검증데이터로 최적의 모델을 찾아냅니다.
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

#cross_val_score함수로 knn에대해서 학습데이터셋을 가지고 K값을 변경하며 각각 K-폴드 교차검증을 10번합니다.
max_k_range = train.shape[0] // 2
k_list = []
for i in range(3, max_k_range,2):
    k_list.append(i)
    
cross_validation_scores=[]
x_train = train[['3P', 'BLK', 'TRB']]
y_train = train[['Pos']]

for k in k_list:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, x_train, y_train.values.ravel(), cv=10, scoring='accuracy')
    cross_validation_scores.append(scores.mean())
    
#이후 변경되는 K값을 기준으로 검증 결과값을 저장하고 시각화합니다.
cross_validation_scores
plt.plot(k_list, cross_validation_scores)
plt.xlabel('the number of k')
plt.ylabel('Accuracty')
plt.show()

검증결과 최적의 K값은 5인 것을 확인할 수 있습니다.

k =k_list[cross_validation_scores.index(max(cross_validation_scores))]
print("The best number of k : " + str(k))

 

<테스트>

이제 K가 5인 값을 가지고 테스트해보겠습니다.

from sklearn.metrics import accuracy_score

knn = KNeighborsClassifier(n_neighbors=5)

x_train = train[['3P', 'BLK', 'TRB']]
y_train = train[['Pos']]

knn.fit(x_train, y_train.values.ravel())

x_test = test[['3P', 'BLK', 'TRB']]
y_test = test[['Pos']]

pred = knn.predict(x_test)

print("accuracy : "+ str( accuracy_score(y_test.values.ravel(), pred)) )

정확도가 0.9임을알 수 있습니다.

 

아래 코드를 사용해서 각각 어떻게 결과가 나왓는지 알 수 있습니다.

comparison = pd.DataFrame({'prediction':pred, 'ground_truth':y_test.values.ravel()})
comparison

'AI > machine-learning' 카테고리의 다른 글

앙상블 기법  (0) 2023.11.03
지도 학습 - 나이브 베이즈  (0) 2023.11.02
지도 학습 - 의사결정 트리  (1) 2023.10.31
지도학습 - SVM 서포트 벡터 머신 이론 및 실습  (0) 2023.10.08
머신러닝 용어 정리  (1) 2023.10.07
Comments