hyerimir 2024. 2. 3. 23:01

 

# KNN 알고리즘의 원리
# 새로운 데이터의 클래스를 해당 데이터와 가장 가까운 k개 데이터들의 클래스로 결정
# k의 선택은 학습의 난이도와 데이터의 개수에 따라 결정되며, 일반적으로는 훈련데이터 개수의 제곱근으로 설정
# 보통 짝수보다는 홀수로 설정

import pandas as pd
from sklearn.model_selection import train_test_split

credit = pd.read_csv('../data/credit_fianl.csv')
X = credit[credit.columns.difference(['credit.rating'])]
y = credit['credit.rating']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, stratify = y, random_state = 48)
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

clf = KNeighborsClassifier() # k = 5 가 default값
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

from sklearn.metrics import confusion_matrix, plot_roc_curve, roc_auc_score
confusion_matrix(y_test, y_pred)

plot_roc_curve(clf, X_test, y_test)

roc_auc_score(y_test, clf.predict_proba(X_test)[:,1])
# 최적의 k 찾기
k_range = range(1, 200)
k_scores = []

for k in k_range:
	knn = KNeighborsClassifier(k)
    knn.fit(X_train, y_train)
    scores = roc_auc_score(y_test, knn.predict_proba(X_test)[:, 1])
    k_scores.append(scores.mean())
    
import matplotlib.pyplot as plt
plt.plot(k_range, k_scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('roc_auc_score')
plt.show()

max(k_scores)
k_scores.index(max(k_scores))