def DrawPlot():
models = [] # список моделей
X, Y = PrepareData() # разбить полученные данные
# разбиение исходных данных X, Y на обучающую выборку (X_train, Y_train) и тестовую (X_validation, Y_validation)
# в соотношении 80:20. random_state отличный от None нужен для случайных, но воспроизводимых наборов данных
X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=0.20, random_state=99)
# добавление всех моделей в список:
models.append(('Многослойный персептрон', MLPClassifier(hidden_layer_sizes=(1000, 30, 10),
tol=0.001,
learning_rate_init=0.001,
random_state=99)))
models.append(('Решающее дерево', DecisionTreeClassifier(criterion='entropy',
max_features='auto',
max_depth=None,
random_state=99
)))
models.append(('Логистическая регрессия', LogisticRegression()))
models.append(('Случайный лес', RandomForestClassifier(n_estimators=10, criterion='entropy', max_features='auto', max_depth=None, random_state=99)))
models.append(('Метод k ближайших соседей', KNeighborsClassifier()))
results = [] # список результатов
names = [] # список названий моделей
scoring = 'accuracy' # выбранная метрика - точность распознавания
s = 'Сравнение моделей на валидации по 10 блокам: \n\n'
for name, model in models: # цикл по всем моделям списка
# кросс-валидация на 10 частях исходного набора данных
kfold = KFold(n_splits=10)
# обучение модели на на 10 частях с получением результата (оценки распознавания)
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results) # добавить результаты в список результатов
names.append(name) # добавить название модели в список названий моделей
s += name + ': ' + str(round(cv_results.mean() * 100, 2)) + '%\n' # вывести в строку среднее по всем разбиениям в виде процентов с округлением до двух знаков после запятой
T.insert(tk.END, s) # вставить в текстовое поле строку s с результатом
plt.figure(figsize=(15, 10)) # создание фигуры с заданными размерами
plt.title('Сравнение моделей на валидации по 10 блокам: ') # создание заголовка графика
sns.set_style(style='whitegrid')
initial = sns.boxplot(data=results, palette='Set1', notch=False) # построение графиков по данным
initial.set_xticklabels(['Многослойный персептрон', 'Решающее дерево', 'Логистическая регрессия', 'Случайный лес','Метод k ближайших соседей']) # вывод подписей
initial.legend()
plt.show() # показать график