Не отображается график в jupyter

В функцию train_grid_search передаётся выборка, создаётся объект GridSearchCV, который переберет соседей от одного до 20. он обучается и функция возвращает значение ключа mean_test_score у атрибута cv_results_ в классе GridSearchCV. нужно построить график средней зависимости качества от количества соседей. Проблема в том, что мой график никак не отображается, перезапускал ядро, прописывал %matplotlib inline, но ничего из этого не помогло. в чём моя ошибка?

import sklearn
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier


X, y = make_moons(n_samples = 1000, noise = 0.5, random_state = 10)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.5, random_state = 10, shuffle=True)
sns.scatterplot(x = X[:, 0], y = X[:, 1], c = y)

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error

searcher = GridSearchCV(KNeighborsClassifier(), param_grid = {
'n_neighbors' : [i for i in range(1,21)],                                                              
'weights' : ['uniform', 'distance'], 'p' : [1,2,3]
},
cv = KFold(n_splits=5, random_state=10, shuffle=True))

searcher.fit(X_train, y_train)
accuracy = mean_squared_error(y_test, searcher.predict(X_test))

#####################################
# часть задания, относящаяся к вопросу:

def train_grid_search(X, y):
    def_searcher = GridSearchCV(KNeighborsClassifier(), param_grid = 
                                {'n_neighbors' : [i for i in range(1,21)]})

    def_searcher.fit(X_train,y_train)
    return def_searcher.cv_results_['mean_test_score']

mean_test_scores = []
for i in range(1000):
    X, y = make_moons(n_samples = 1000, noise = 0.5)
    mean_test_score = train_grid_search(X, y)
    mean_test_scores.append(mean_test_score)

mean_test_scores = np.array(mean_test_scores)
plt.plot(np.arange(1, 21), np.mean(mean_test_scores, axis = 0))
# график не выводится, сообщения об ошибке тоже нет

Ответы (2 шт):

Автор решения: Sergey

В самое начало блокнота добавьте "магическую" команду:

%matplotlib

После этого вывод графики пойдёт в блокнот Юпетера.

→ Ссылка
Автор решения: CrazyElf
from sklearn.model_selection import train_test_split,
                                                   ^^^

Синтаксическая ошибка. Уберите запятую в конце, иначе код не запустится.

sns.scatterplot(x = X[:, 0], y = X[:, 1], c = y)

Ошибка - переменная sns не описана, добавьте в код импорт:

import seaborn as sns

Далее.

for i in range(1000):

Вы дожидались, пока это всё выполнится? У вас код просто не завершается, возможно. Я сократил до 10 итераций, тогда хоть можно посмотреть результат за разумное время, а 1000 итераций будут выполняться минут 10 в Google Colab, а разницы особой в результатах не будет, судя по всему:

for i in range(10):

Ну и ещё одна ошибка связана первым графиком. У вас второй график рисуется прямо на первом графике и из-за этого он "сплющивается" - у первого графика не подходящие для второго графика масштабы:

введите сюда описание изображения

Второй график надо рисовать на отдельной картинке, для этого нужно добавить перед её рисованием plt.figure():

mean_test_scores = np.array(mean_test_scores)
plt.figure() # <- добавлено
plt.plot(np.arange(1, 21), np.mean(mean_test_scores, axis = 0))

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка