Не отображается график в 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 шт):
В самое начало блокнота добавьте "магическую" команду:
%matplotlib
После этого вывод графики пойдёт в блокнот Юпетера.
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))


