Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ОМО 2025 / Baraeva_Elizaveta_lb4
.pdf
11
Рисунок 2.2.2 – Диаграмма рассеяния с границами принятия решений
Классы в основном имеют четкие границы областей. Наблюдается
хорошая кластеризация: точки классов преимущественно расположены в
своей цветовой зоне, но не везде. Исключением являются небольшое
количество точек класса 1 в красной зоне и класса 0 в зеленой зоне, что
может указывать на шум в данных, наложение распределений признаков.
2.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
Для расчета значений будем использовать функцию classification_report
из sklearn.metrics. Реализация представлена в Листинге 2.4.1. Результат
представлен в Листинге 2.4.2.
Листинг 2.4.1 – Расчет значений Precision, Recall, F1
from sklearn.metrics import classification_report
y_pred = knn.predict(X_test)
print(classification_report(y_test, y_pred, digits=4))

12
Листинг 2.4.2 – Результаты расчета
precision recall f1-score support
0 0.9667 0.9667 0.9667 60
1 0.9672 0.9672 0.9672 61
accuracy 0.9669 121
macro avg 0.9669 0.9669 0.9669 121
weighted avg 0.9669 0.9669 0.9669 121
Из результатов можно увидеть, что модель демонстрирует высокую
точность с показателем accuracy равным 96.69%. Для обоих классов метрики
Precision, Recall и F1-score практически идентичны и составляют около
96.7%, что указывает на сбалансированность модели и отсутствие перекоса в
предсказаниях. Высокие значения Recall показывают, что модель правильно
находит большинство объектов каждого класса, а близкие значения Precision
говорят о минимальном количестве ошибочных предсказаний. Средние
значения (macro avg и weighted avg) также находятся на уровне 96.69%,
подтверждая сбалансированность модели и стабильность работы алгоритма
для всех классов.
3. Логистическая регрессия:
3.1. Проведите классификацию методом логистической регрессии при
различных параметрах: без регуляризации, с l1 регуляризацией, c l2
регуляризацией. Постройте столбчатую диаграмму зависимости
точности (Accuracy) от наличия регуляризации. Дальнейшие пункты
3.* выполняйте для лучшего параметра.
Сначала создаются 3 модели. Каждая модель обучается на
тренировочных данных, после чего вычисляется точность (accuracy) на
тестовом наборе. Далее результаты отображаются в виде столбчатой

13
диаграммы. Реализация приведена в Листинге 3.1.1. Диаграмма изображена
на Рисунке 3.1.2.
Листинг 3.1.1 – Реализация построения столбчатой диаграммы точности в
зависимости от вида регуляризации
from sklearn.linear_model import LogisticRegression
models = {
'Без регуляризации': LogisticRegression(penalty=None,
max_iter=1000),
'L1 регуляризация': LogisticRegression(penalty='l1',
solver='saga', max_iter=1000),
'L2 регуляризация': LogisticRegression(penalty='l2',
max_iter=1000)
}
accuracies = {}
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracies[name] = accuracy_score(y_test, y_pred)
plt.figure(figsize=(10, 6))
plt.bar(accuracies.keys(), accuracies.values())
plt.ylabel('Accuracy')
Рисунок 3.1.2 – Диаграмма точности в зависимости от вида регуляризации

14
Все три модели показали одинаковую точность, значит будем
использовать без регуляризации для упрощения.
3.2. Постройте изображение с границами принятия решения отметив на
них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
Построение аналогично п.2.2. Реализация приведена в Листинге 3.2.1.
Диаграмма изображена на Рисунке 3.2.2.
Листинг 3.2.1 – Реализация построения диаграммы рассеяния с границами
принятия решений
log_reg = LogisticRegression(penalty=None,
max_iter=1000).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 = log_reg.predict(np.c_[xx.ravel(), yy.ravel()])
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()

15
Рисунок 3.2.2 – Диаграмма рассеяния с границами принятия решений
Граница принятия решений представлена прямой линией, что
характерно для логистической регрессии. Данные демонстрируют не очень
хорошую разделимость по сравнению с KNN, но большинство точек
остаются в своей области.
3.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
Расчет значений аналогичен п.2.4. Реализация представлена в Листинге
3.4.1. Результат представлен в Листинге 3.4.2.
Листинг 3.4.1 – Расчет значений Precision, Recall, F1
y_pred = log_reg.predict(X_test)
print(classification_report(y_test, y_pred, digits=4))
Листинг 3.4.2 – Результаты расчета
precision recall f1-score support
0 0.9016 0.9167 0.9091 60
1 0.9167 0.9016 0.9091 61

16
accuracy 0.9091 121
macro avg 0.9092 0.9092 0.9091 121
weighted avg 0.9092 0.9091 0.9091 121
Из результатов можно увидеть, что модель логистической регрессии
показывает сбалансированные и хорошие результаты классификации с общей
точностью 90.91%. Для класса 0 Precision составляет 90.16% (9.84% неверно
предсказаны), Recall равен 91.67% (модель находит 91.67% истинных классов
0). Для класса 1 Precision немного выше – 91.67%, а вот Recall немного ниже
90.16%. Значения F1-score для обоих классов идентичны (90.91%), что
свидетельствует о хорошем балансе между точностью и полнотой
предсказаний. Средние значения (macro avg и weighted avg) находятся на
уровне 90.9%, подтверждая стабильность модели для обоих классов.
4. Метод опорных векторов:
4.1. Проведите классификацию методом опорных векторах при
различных параметрах ядра: “linear”, “poly” (нужно выбрать
степень), “rbf”. Постройте столбчатую диаграмму зависимости
точности (Accuracy) от вида ядра. Дальнейшие пункты 4.*
выполняйте для лучшего параметра.
Построение аналогично п.3.1. Реализация приведена в Листинге 4.1.1.
Диаграмма изображена на Рисунке 4.1.2.
Листинг 4.1.1 – Реализация построения столбчатой диаграммы точности в
зависимости от параметров ядра
from sklearn.svm import SVC
kernels = {
"linear": {"kernel": "linear"},
"poly": {"kernel": "poly", "degree": 3},
"rbf": {"kernel": "rbf"}

17
}
accuracy_scores = {}
for name, params in kernels.items():
model = SVC(**params).fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy_scores[name] = accuracy_score(y_test, y_pred)
plt.figure()
plt.bar(accuracy_scores.keys(), accuracy_scores.values())
plt.ylabel('Accuracy')
plt.show()
Рисунок 4.1.2 – Диаграмма точности в зависимости от параметров ядра
Ядро rbf показало наилучшую точность, значит будем использовать его.
4.2. Постройте изображение с границами принятия решения отметив на
них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
Построение аналогично п.2.2. Реализация приведена в Листинге 4.2.1.
Диаграмма изображена на Рисунке 4.2.2.

18
Листинг 4.2.1 – Реализация построения диаграммы рассеяния с границами
принятия решений
svc = SVC(kernel='rbf').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 = svc.predict(np.c_[xx.ravel(), yy.ravel()])
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()
Рисунок 4.2.2 – Диаграмма рассеяния с границами принятия решений

19
Классы в основном имеют четкие границы областей. Большинство точек
классов расположены в своей цветовой зоне, но не везде. Также как и в KNN
небольшое количество точек класса 1 в красной зоне и класса 0 в зеленой
зоне. Ошибки классификации может возникнуть из-за мест, где классы
сильно перекрываются. В целом rbf-ядро хорошо захватывает сложную
форму границы между классами.
4.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
Расчет значений аналогичен п.2.4. Реализация представлена в Листинге
4.4.1. Результат представлен в Листинге 4.4.2.
Листинг 4.4.1 – Расчет значений Precision, Recall, F1
y_pred = svc.predict(X_test)
print(classification_report(y_test, y_pred, digits=4))
Листинг 4.4.2 – Результаты расчета
precision recall f1-score support
0 0.9516 0.9833 0.9672 60
1 0.9831 0.9508 0.9667 61
accuracy 0.9669 121
macro avg 0.9673 0.9671 0.9669 121
weighted avg 0.9675 0.9669 0.9669 121
Из результатов можно увидеть, что модель SVM с brf-ядром показывает
отличные результаты классификации с общей точностью 96.69%. У класса 0:
Precision равный 95.16% показывает, что из всех предсказанных классов 0
верны 95.16%. Recall равный 98.33% показывает, что модель находит 98.33%
истинных классов 0. У класса 1: Precision равный 98.31% показывает, что из
всех предсказанных классов 1 верны 98.31%. Recall равный 95.08%
показывает, что модель находит 95.08% истинных классов 1. Значение F1 для

20
обоих классов стабильно высокое (около 96.7%), что свидетельствует об
оптимальном балансе между точностью и полнотой предсказаний. Средние
показатели (около 96.7%) полностью соответствуют общей точности,
подтверждая согласованную работу модели для всех классов.
5. Решающие деревья:
5.1. Проведите классификацию используя решающие деревья, подобрав
параметры, при которых получается лучшее обобщение
(максимальная глубина/максимальное количество листьев/метрика
загрязнения и т.д.).
Для подбора оптимальных гиперпараметров была импортирована
функция GridSearchCV из библиотеки sklearn.model_selection. Сначала
создается словарь param_grid с диапазонами значений для максимальной
глубины дерева, минимального числа объектов в листе, критерия разделения
и максимального числа листьев. Инициализируется базовый классификатор и
с помощью функции GridSearchCV ищутся оптимальные параметры. После
обучения на тренировочных данных выводится словарь best_params_ с
наилучшей найденной комбинацией гиперпараметров. Реализация приведена
в Листинге 5.1.1. Результат представлен в Листинге 5.1.2.
Листинг 5.1.1 – Поиск гиперпараметров для решающих деревьев
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
param_grid = {
'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, None],
'min_samples_leaf': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'criterion': ['gini', 'entropy'],
'max_leaf_nodes': [10, 20, 30, 40, 50, None]
}
tree = DecisionTreeClassifier(random_state=42)
Соседние файлы в папке Лабы по ОМО 2025
