2023. 8. 25. 01:57ㆍ컴퓨터/데이터활용
dataset 출처 : https://raw.githubusercontent.com/wikibook/machine-learning/master/data/csv/basketball_stat.csv
Player | Pos | 3P | 2P | TRB | AST | STL | BLK |
Alex Abrines | SG | 1.4 | 0.6 | 1.3 | 0.6 | 0.5 | 0.1 |
--- | --- | --- | --- | --- | --- | --- | --- |
Lou Williams | SG | 2.0 | 3.3 | 2.5 | 3.0 | 1.0 | 0.2 |
형의 데이터세트에서 3P, 2P, TRB, AST, STL, BLK의 값에 따라 Pos를 유추하려고 합니다.
import matplotlib.pyplot as plt
import seaborn as sns
sns.lmplot(x='STL', y='2P', data=df, fit_reg=True,
scatter_kws={"s":150},
markers=["o",'x'],
hue="Pos")
df에 데이터셋을 넣어주고 STL(스틸)과 2P(2점슛)의 관계를 lmplot로 나타내 주었습니다.
마찬가지로 BLK, TRB와 3점슛의 관계를 시각화 할 수 있습니다.
3점슛으로만 구성하기 위해 필요없는 열을 제거해 줍니다.
df.drop(['2P', 'AST', 'STL'], axis=1, inplace=True) #axis=1 ->행 삭제
df.head()
#데이터 나누기
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)
print(train.shape[0]) #shape -> (행의 수 ,열의 수 )
print(test.shape[0])
sklearn의 model_selection에서 훈련용 데이터와 테스트용 데이처를 8:2로 나누어줍니다.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
max_k_range = train.shape[0]//2 #k 최댓값 지정
k_list=[]
for i in range(3, max_k_range, 2): #k를 홀수로 맞추기 위해 2씩 뛰어넘기
k_list.append(i)
cross_validation_scores = []
x_train = train[['3P', 'BLK', 'TRB']]
y_train = train[['Pos']]
k의 값의 리스트를 만들어줍니다(k_list)
k의 최댓값을 39로 잡아주고 홀수로 만들어 주기 위해 2씩 뛰어 넘어줍니다.
feature data x_train과 레이블데이터 y_train을 만들어줍니다.
***x_train
3P BLK TRB
61 1.8 1.7 5.4
24 0.0 0.8 6.5
80 1.2 0.4 2.9
81 1.2 0.4 3.9
67 1.1 0.1 2.1
.. ... ... ...
39 1.9 0.2 2.8
64 2.4 0.2 3.5
96 0.8 0.7 4.5
53 0.0 1.7 13.8
38 0.2 0.6 1.6
***y_train
Pos
61 C
24 C
80 SG
81 SG
67 SG
.. ..
39 SG
64 SG
96 SG
53 C
38 C
[80 rows x 1 columns]
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())
***scores
[1. 0.75 0.875 0.875 1. 0.875 0.875 1. 1. 0.75 ] #k==3
[1. 1. 0.875 0.875 1. 0.875 0.875 1. 1. 0.75 ] #k==5
[1. 1. 0.875 0.875 1. 0.875 0.875 1. 1. 0.75 ] #k==7
[0.875 1. 0.875 0.875 1. 0.875 0.875 1. 1. 0.75 ] #k==9
[1. 1. 0.875 0.875 1. 0.75 0.875 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.875 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.875 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.875 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.75 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.75 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.75 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.75 1. 1. 0.75 ]
[1. 0.875 0.875 0.875 1. 0.75 0.75 1. 1. 0.75 ]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.75 ]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.75 ]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.875]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.875]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.875]
[1. 0.875 0.875 0.75 0.875 0.75 0.625 1. 0.875 0.875] #k==39
***scikit-learn 교차검증 API(cross_val_score()) (어렵군...)
설정요소
def cross_val_score(
estimator,
X,
y=None,
*,
groups=None,
scoring=None,
cv=None,
n_jobs=None,
verbose=0,
fit_params=None,
pre_dispatch="2*n_jobs",
error_score=np.nan,
):
- estimator (분류 알고리즘인지 회귀 알고리즘인지)
- X (feature dataset)
- Y(레이블 dataset)
- scoring(예측평가지표 accurancy,..etc)
- cv(교차 검증 폴드 수)
이후 설정값을 배열로 반환해 줍니다.
***cv=10으로 설정되어 있기 때문에 해당 셀만 실행할 경우 폴드가 중첩되어 cross_validation_scores의 개수가 늘어날 수 있습니다.
***y_train.values.ravel()
y_train.values는
[['C']
['C']
['SG']
['SG']
['SG']
['SG']
['C']
꼴로 나오기 때문에
y_train.values.ravel()을 통해 리스트 인 리스트를 제거해줍니다.
['C' 'C' 'SG' 'SG' 'SG' 'SG' 'C' 'SG' 'S
plt.plot(k_list, cross_validation_scores)
plt.xlabel("the number of k")
plt.ylabel("Accuracy")
plt.show()
cvs = cross_validation_scores
k = k_list[cvs.index(max(cross_validation_scores))]
print("The best number of k: "+str(k))