from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn import metrics
import matplotlib.pyplot as plt
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=11, test_size=0.20)
#metodo1
k_range = range(1, 30)
scores = {}
scores_list = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k) #Creating the Model
knn.fit(X=X_train, y=y_train) #Training the Model
y_pred = knn.predict(X_test)
scores[k] = metrics.accuracy_score(y_test, y_pred)
scores_list.append(metrics.accuracy_score(y_test, y_pred))
print(f'Acurácia Máxima = {max(scores_list):.2f} com \nK = {scores_list.index(max(scores_list)) + 1}')
#Atenção: k não começa em zero mas o indice da lista sim!
#aqui o valor encontrado de k foi k =5 com Acurácia Máxima de 0.97
#metodo2
neighbors = range(1, 30)
cv_scores = []
n_splits = 20
kfold = KFold(n_splits=n_splits, shuffle=True)#random_state=11
for k in neighbors:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(estimator=knn, X=iris.data, y=iris.target, cv=kfold,
scoring='accuracy') # X-train y_train
cv_scores.append(scores.mean())
print(f'cv scores = {cv_scores}')
cv_scores = [round(valor, 2) for valor in cv_scores]
acc_max = round(max(cv_scores), 2)
print(f'Acurácia Máxima = {acc_max:.2f} com \nK = {cv_scores.index(acc_max) + 1}')
##aqui o valor encontrado de k foi k =14 com Acurácia Máxima de 0.98
ZnJvbSBza2xlYXJuLmRhdGFzZXRzIGltcG9ydCBsb2FkX2lyaXMKZnJvbSBza2xlYXJuLm1vZGVsX3NlbGVjdGlvbiBpbXBvcnQgdHJhaW5fdGVzdF9zcGxpdApmcm9tIHNrbGVhcm4ubmVpZ2hib3JzIGltcG9ydCBLTmVpZ2hib3JzQ2xhc3NpZmllcgpmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCBLRm9sZApmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCBjcm9zc192YWxfc2NvcmUKZnJvbSBza2xlYXJuIGltcG9ydCBtZXRyaWNzCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCmlyaXMgPSBsb2FkX2lyaXMoKQoKWF90cmFpbiwgWF90ZXN0LCB5X3RyYWluLCB5X3Rlc3QgPSB0cmFpbl90ZXN0X3NwbGl0KGlyaXMuZGF0YSwgaXJpcy50YXJnZXQsIHJhbmRvbV9zdGF0ZT0xMSwgdGVzdF9zaXplPTAuMjApCgogICAgICAgICNtZXRvZG8xCmtfcmFuZ2UgPSByYW5nZSgxLCAzMCkKc2NvcmVzID0ge30Kc2NvcmVzX2xpc3QgPSBbXQpmb3IgayBpbiBrX3JhbmdlOgogICAgICAgIGtubiA9IEtOZWlnaGJvcnNDbGFzc2lmaWVyKG5fbmVpZ2hib3JzPWspICNDcmVhdGluZyB0aGUgTW9kZWwKICAgICAgICBrbm4uZml0KFg9WF90cmFpbiwgeT15X3RyYWluKSAjVHJhaW5pbmcgdGhlIE1vZGVsCiAgICAgICAgeV9wcmVkID0ga25uLnByZWRpY3QoWF90ZXN0KQogICAgICAgIHNjb3Jlc1trXSA9IG1ldHJpY3MuYWNjdXJhY3lfc2NvcmUoeV90ZXN0LCB5X3ByZWQpCiAgICAgICAgc2NvcmVzX2xpc3QuYXBwZW5kKG1ldHJpY3MuYWNjdXJhY3lfc2NvcmUoeV90ZXN0LCB5X3ByZWQpKQoKcHJpbnQoZidBY3Vyw6FjaWEgTcOheGltYSA9IHttYXgoc2NvcmVzX2xpc3QpOi4yZn0gY29tICBcbksgPSB7c2NvcmVzX2xpc3QuaW5kZXgobWF4KHNjb3Jlc19saXN0KSkgKyAxfScpCiAgICAgICAgI0F0ZW7Dp8OjbzogayBuw6NvIGNvbWXDp2EgZW0gemVybyBtYXMgbyBpbmRpY2UgZGEgbGlzdGEgc2ltIQogICAgI2FxdWkgbyB2YWxvciBlbmNvbnRyYWRvIGRlIGsgZm9pIGsgPTUgY29tIEFjdXLDoWNpYSBNw6F4aW1hIGRlIDAuOTcgCgoKCiAgICAgICAgI21ldG9kbzIKbmVpZ2hib3JzID0gcmFuZ2UoMSwgMzApCmN2X3Njb3JlcyA9IFtdICAgCgpuX3NwbGl0cyA9IDIwCmtmb2xkID0gS0ZvbGQobl9zcGxpdHM9bl9zcGxpdHMsICBzaHVmZmxlPVRydWUpI3JhbmRvbV9zdGF0ZT0xMQoKZm9yIGsgaW4gbmVpZ2hib3JzOgogICAgICAgIGtubiA9IEtOZWlnaGJvcnNDbGFzc2lmaWVyKG5fbmVpZ2hib3JzPWspCiAgICAgICAgc2NvcmVzID0gY3Jvc3NfdmFsX3Njb3JlKGVzdGltYXRvcj1rbm4sIFg9aXJpcy5kYXRhLCB5PWlyaXMudGFyZ2V0LCBjdj1rZm9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3Jpbmc9J2FjY3VyYWN5JykgIyBYLXRyYWluIHlfdHJhaW4KICAgICAgICBjdl9zY29yZXMuYXBwZW5kKHNjb3Jlcy5tZWFuKCkpCgoKcHJpbnQoZidjdiBzY29yZXMgPSB7Y3Zfc2NvcmVzfScpCgpjdl9zY29yZXMgPSBbcm91bmQodmFsb3IsIDIpIGZvciB2YWxvciBpbiBjdl9zY29yZXNdCmFjY19tYXggPSByb3VuZChtYXgoY3Zfc2NvcmVzKSwgMikKCnByaW50KGYnQWN1csOhY2lhIE3DoXhpbWEgPSB7YWNjX21heDouMmZ9IGNvbSAgXG5LID0ge2N2X3Njb3Jlcy5pbmRleChhY2NfbWF4KSArIDF9JykKIyNhcXVpIG8gdmFsb3IgZW5jb250cmFkbyBkZSBrIGZvaSBrID0xNCBjb20gQWN1csOhY2lhIE3DoXhpbWEgZGUgMC45OCA=
Acurácia Máxima = 0.97 com
K = 5
cv scores = [0.9616071428571429, 0.9455357142857144, 0.9598214285714286, 0.9607142857142857, 0.9625, 0.9669642857142857, 0.9660714285714287, 0.9598214285714286, 0.9598214285714286, 0.9598214285714286, 0.9669642857142857, 0.9660714285714287, 0.9598214285714286, 0.9723214285714287, 0.9732142857142858, 0.9642857142857144, 0.9794642857142858, 0.9732142857142858, 0.9794642857142858, 0.9732142857142858, 0.9669642857142857, 0.9607142857142857, 0.9732142857142858, 0.9607142857142857, 0.9607142857142857, 0.9491071428571429, 0.9589285714285716, 0.9455357142857144, 0.9482142857142858]
Acurácia Máxima = 0.98 com
K = 17