Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ОМО 2025 / Baraeva_Elizaveta_lb4

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
753 Кб
Скачать
☆
21
grid_search = GridSearchCV(estimator=tree, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1) grid_search.fit(X_train, y_train) print(grid_search.best_params_)
Листинг 5.1.2 – Найденные гиперпараметры
{'criterion': 'gini', 'max_depth': 5, 'max_leaf_nodes': 10, 'min_samples_leaf': 3}
Оптимальные гиперпараметры для дерева решений включают: критерий разделения gini, максимальную глубину 5 уровней, ограничение в 10 листов и минимум 3 наблюдения в каждом листе. Эти настройки указывают на
умеренно сложную структуру дерева: глубина 5 и 10 листовых узлов
предотвращают переобучение, сохраняя при этом достаточную детализацию,
а требование 3 наблюдения в листе обеспечивает статистическую значимость решений.
5.2. Постройте изображение с границами принятия решения отметив на
них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
Построение аналогично п.2.2. Реализация приведена в Листинге 5.2.1. Диаграмма изображена на Рисунке 5.2.2. Листинг 5.2.1 – Реализация построения диаграммы рассеяния с границами принятия решений
tree = DecisionTreeClassifier(criterion='gini', max_depth=5, max_leaf_nodes=10, min_samples_leaf=3).fit(X_train, y_train)
x_min, x_max = X_scaled[:, 0].min() - 0.1, X_scaled[:, 0].max() + 0.1 y_min, y_max = X_scaled[:, 1].min() - 0.1, X_scaled[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = tree.predict(np.c_[xx.ravel(), yy.ravel()])
22
Z = Z.reshape(xx.shape)
plt.figure() plt.contourf(xx, yy, Z, alpha=0.5, cmap=ListedColormap(['#FFAAAA', '#AAFFAA'])) scatter = plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y, cmap=ListedColormap(['#FF0000', '#00FF00']), edgecolor="black") plt.legend(*scatter.legend_elements(), title="Класс") plt.xlabel("X1") plt.ylabel("X2") plt.grid() plt.show()
Рисунок 5.2.2 – Диаграмма рассеяния с границами принятия решений
Можно видеть, что границы зон имеют ступенчатую форму с четкими вертикальными и горизонтальными линиями. Как и у KNN с методом опорных векторов ошибки сконцентрированы в центральной области. Если
сравнить эти три метода, то решающие деревья справляются немного лучше,
чем, метод опорных векторов и примерно на ровне с KNN.
5.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
23
Расчет значений аналогичен п.2.4. Реализация представлена в Листинге
5.4.1. Результат представлен в Листинге 5.4.2. Листинг 5.4.1 – Расчет значений Precision, Recall, F1
y_pred = tree.predict(X_test) print(classification_report(y_test, y_pred, digits=4))
Листинг 5.4.2 – Результаты расчета
precision recall f1-score support
0 0.9828 0.9500 0.9661 60 1 0.9524 0.9836 0.9677 61
accuracy 0.9669 121 macro avg 0.9676 0.9668 0.9669 121 weighted avg 0.9674 0.9669 0.9669 121
Из результатов можно увидеть, что решающее дерево с подобранными
гиперпараметрами демонстрирует отличные результаты классификации с
общей точностью 96.69%. Для класса 0 наблюдается высокая точность предсказаний (98.28%) при полноте 95%, а для класса 1 – немного иное соотношение: Precision 95.24% при Recall 98.36%. F1-score для обоих классов практически идентичен (96.61% и 96.77%), что свидетельствует о
сбалансированности модели. Можно отметить, что дерево показывает разное
поведение для классов: лучше "ловит" класс 1 (Recall 98.36%), но точнее предсказывает класс 0 (Precision 98.28%). Средние показатели (около 96.7%)
соответствуют общей точности, подтверждая стабильность работы модели.
Ограничение глубины и листьев предотвратили переобучение, сохранив при
этом высокую предсказательную способность. Минимальное количество
наблюдений в листе обеспечило статистическую значимость решений. Выбранный критерий gini оптимально подошел для данной задачи, позволив дереву достичь точности, сопоставимой с методом опорных векторов
(96.69%), но с более простой структурой.
24
5.6. Визуализируйте полученное дерево решений. Сделайте выводы о
правилах в узлах дерева. Сопоставьте их с полученными границами
принятия решений.
Для построения дерева решений импортируем функцию plot_tree из библиотеки sklearn.tree. Передадим в функцию модель и параметр закрашивания. Реализация приведена в Листинге 5.6.1. График изображен на Рисунке 5.6.2. Листинг 5.6.1 – Реализация построения дерева решений
from sklearn.tree import plot_tree
plt.figure() plot_tree(tree, filled=True) plt.show()
Рисунок 5.2.2 – График дерева решений
Дерево решений строит иерархию правил, начиная с наиболее значимого
признака (в данном случае, x[0]) в корне дерева. Можно видеть, что модель использует два признака: x[0] и x[1]. Признак x[0] используется для
25
первичного разделения, а x[1] используется для дополнительного уточнения классов на следующих уровнях дерева.
В каждом узле происходит пороговое сравнение: например, в корене дерева x[0] ≤ -0.228. Эти пороги делят пространство признаков на области, где преобладает один из классов.
Критерий gini – это мера "загрязненности" узла. Чем ближе он к 0, тем чище узел (объекты одного класса). На каждом шаге дерево выбирает локально лучшее разбиение, а не глобально оптимальное.
В результате дерево формирует ступенчатую карту решений, где каждая
такая ступень соответствует одному условию в узле дерева. Ось X1 (x[0])
создаёт серию вертикальных разрезов, задающих «столбцы» принятия
решений. Ось X2 (x[1]) создаёт горизонтали, уточняющие классификацию внутри этих столбцов. Чем глубже узел, тем уже и локальнее соответствующая область на графике.
6. Выбор классификатора:
6.1. Постройте таблицу с метриками Precision, Recall, для полученных
результатов каждым классификатором.
Используя предыдущие пункты, составим таблицу с метриками. Результат представлен в Таблице 6.1.1. Таблица 6.1.1 – Метрики каждого классификатора
Классификатор
Precision (класс 0)
Precision (класс 1)
Recall (класс 0)
Recall (класс 1)
Accuracy KNN
0.9667
0.9672
0.9667
0.9672
0.9669
Логистическая
регрессия
0.9016
0.9167
0.9167
0.9016
0.9091
Метод опорных
0.9516
0.9831
0.9833
0.9508
0.9669
26
векторов
Решающее дерево
0.9828
0.9524
0.9500
0.9836
0.9669
6.2. Сделайте выводы о том, какие классификаторы лучше всего
подходят для вашего набора данных и почему.
Классификаторы демонстрируют близкие результаты по Accuracy для KNN, SVM и дерева (96.69%), в отличии от логистической регрессии (90.91%). KNN показывает идеальную сбалансированность метрик для обоих классов с Precision и Recall около 96.7%. SVM выделяется максимальным Recall для класса 0 (98.33%) и Precision для класса 1 (98.31%), что делает его
оптимальным для задач, где важно максимально полно выявлять объекты
класса 0 или минимизировать ошибочные отнесения к классу 1. Решающее
дерево демонстрирует обратную картину – наивысший Precision для класса 0 (98.28%) и Recall для класса 1 (98.36%), подходя для случаев, где важна
точность идентификации класса 0 и полнота охвата класса 1. Логистическая
регрессия существенно уступает другим методам по точности (90.91%), что объясняется линейным характером модели.
Выбор оптимального алгоритма зависит от прикладной задачи: KNN
обеспечивает баланс, SVM – лучшее выявление объектов класса 0, дерево –
точность предсказаний класса 0, а логистическая регрессия может
рассматриваться как базовый вариант. Все модели, кроме логистической
регрессии, достигают высокой точности, но с разными акцентами в работе с
классами. Это и будут классификаторы, лучше всего подходящие для набора данных.
27
Вывод.
В ходе лабораторной работы был проведен анализ различных методов
классификации на наборе данных. Были исследованы четыре основных классификатора: метод k-ближайших соседей, логистическая регрессия,
метод опорных векторов и решающие деревья. Для каждого метода
проводился подбор оптимальных параметров, анализ границ принятия
решений и расчет ключевых метрик качества.
KNN показал стабильно высокие результаты с точностью 96.69%, демонстрируя сбалансированность между классами. Логистическая регрессия из-за линейности, уступила другим методам с точностью в 90.91%. Метод опорных векторов с rbf-ядром проявил себя как наиболее эффективный для обнаружения объектов класса 0, достигнув Recall 98.33%. Решающие
деревья, в свою очередь, показали наилучшую точность предсказаний для
класса 0 (Precision 98.28%).
Сравнительный анализ метрик позволил понять, что выбор оптимального алгоритма зависит от прикладной задачи. SVM лучше для
случаев, когда важно минимизировать пропуск объектов класса 0, тогда как
решающие деревья предпочтительнее, когда требуется сочетание высокой
точности и понятности модели. KNN остается хорошим универсальным
вариантом для стандартных задач классификации. Результаты работы
наглядно продемонстрировали, что выбор метода должен определяться
требованиями к качеству классификации и особенностями решаемой задачи.
Соседние файлы в папке Лабы по ОМО 2025