Impacto del número de vecinos

Analicemos el impacto del número de vecinos escogido en el "score" del modelo. Ahora vamos a considerar el dataset Iris completo:

iris = sns.load_dataset("Iris")
iris["label"] = iris.species.astype("category").cat.codes
X = iris.drop(["species", "label"], axis = 1)
y = iris.label

Dividimos el dataset:

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

Ahora entrenemos 10 modelos, con k tomando valores en el rango [1, 11):

train_scores = []
test_scores = []
for k in range(1, 11):
    model = KNeighborsClassifier(n_neighbors = k)
    model.fit(X_train.values, y_train)
    train_scores.append(model.score(X_train.values, y_train))
    test_scores.append(model.score(X_test.values, y_test))

Visualicemos el resultado:

fig, ax = plt.subplots(figsize = (8, 4.8))
ax.plot(range(1, 11), train_scores, label = "Train dataset")
ax.plot(range(1, 11), test_scores, label = "Test dataset")
ax.set_xticks(range(1, 11), labels = range(1, 11))
ax.grid(color = "#EEEEEE", zorder = 0)
ax.set_ylim(0, 1)
ax.legend()
plt.show()
Impacto del número de vecinos

Obtenemos valores muy elevados tanto para el dataset de entrenamiento como para el de validación, debido a que el número de muestras no es muy elevado y a que las clases de este dataset están fuertemente relacionadas desde un punto de vista espacial.