외로운 Nova의 작업실
지도 학습 - knn 알고리즘 이론 및 실습 본문
- 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 |