import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
import numpy as np
import pandas as pd
# 1. 데이터 준비
col_names = ['sepal-length', 'sepal-width','petal-length', 'petal-width','Class']
# csv 파일에서 DataFrame을 생성
iris = pd.read_csv('c:\\data\\iris2.csv', encoding='UTF-8', header=None, names=col_names)
#print(dataset)
X = iris.iloc[:, :-1].to_numpy()
y = iris['Class'].to_numpy()
from sklearn import preprocessing
X=preprocessing.StandardScaler().fit(X).transform(X)
# 데이터 분류
from sklearn.model_selection import train_test_split
# 훈련 데이터 70, 테스트 데이터 30으로 나눈다.
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size =0.2, random_state = 10)
# 설명 : test_size=0.3 으로 했기 때문에 훈련과 테스트가 7대 3비율로 나뉩니다.
# random_state = 10 은 seed 값으로 설정하는 부분입니다.
# 어느자리에서든 동일한 정확도를 보기 위해서 입니다.
#print(X_train.shape)
#print(y_train.shape)
#print(y_train)
# 학습/예측(Training/Pradiction)
from sklearn.neighbors import KNeighborsClassifier
# k-NN 분류기를 생성
classifier = KNeighborsClassifier(n_neighbors=14) # knn 모델 생성
# 분류기 학습
classifier.fit(X_train, y_train) # 훈련 데이터와 훈련 데이터의 라벨로 훈련을 한다.
# 예측
y_pred= classifier.predict(X_test) # 테스트 데이터를 예측한다.
# 모델 평가 -- 작은 이원교차표 출력
from sklearn.metrics import confusion_matrix
conf_matrix= confusion_matrix(y_test, y_pred)
#print(conf_matrix)
# 민감도, 재현율, 정확도, F1 스코어를 확인한다.
from sklearn.metrics import classification_report
report = classification_report(y_test, y_pred)
#print(report)
# 정확도 확인하는 코드
from sklearn.metrics import accuracy_score
accuracy = accuracy_score( y_test, y_pred)
print(accuracy)
import numpy as np
errors = []
for i in range(1, 31):
knn = KNeighborsClassifier(n_neighbors = i)
knn.fit(X_train, y_train)
pred_i = knn.predict(X_test)
errors.append(np.mean(pred_i != y_test))
for k,i in enumerate(errors):
if i == 0:
print(k,i)
k 를 14로 지정할시 정확도가 1이 나옵니다.