Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ОМО 2025 / Baraeva_Elizaveta_lb4
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по лабораторной работе №4
по дисциплине «Основы машинного обучения»
Тема: Классификация
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Жангиров Т. Р.
Санкт-Петербург
2025

2
Цель работы.
Исследовать и сравнить методы классификации: kNN, логистическая
регрессия, метод опорных векторов, решающие деревья. Определить
оптимальные параметры для каждого алгоритма, обеспечивающие
максимальную точность и обобщающую способность. Оценить качество
моделей с помощью различных метрик и визуализации границ принятия
решений. Выявить наилучший алгоритм для конкретного набора данных.
Задание.
Вариант 3
1. Загрузка данных
1.1. Загрузите данные вашего варианта. Учтите, что метки классов
могут быть текстом.
1.2. Визуализируйте данные при помощи диаграммы рассеяния с
выделением различных классов.
1.3. Оцените сбалансированность классов.
1.4. Проведите предобработку данных при необходимости.
1.5. Разделите выборку на обучающую и тестовую. На обучающей
проводите обучение модели, на тестовой расчет значений метрик.
2. KNN
2.1. Проведите классификацию методом k ближайших соседей,
подобрав параметры: количество соседей, необходимость
взвешивания. Постройте графики зависимости точности
(Accuracy) в зависимости от количества соседей (по 1-й линии
для взвешенного и не взвешенного метода).

3
2.2. Постройте изображение с границами принятия решения отметив
на них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
2.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
3. Логистическая регрессия
3.1. Проведите классификацию методом логистической регрессии при
различных параметрах: без регуляризации, с l1 регуляризацией, c
l2 регуляризацией. Постройте столбчатую диаграмму
зависимости точности (Accuracy) от наличия регуляризации.
Дальнейшие пункты 3.* выполняйте для лучшего параметра.
3.2. Постройте изображение с границами принятия решения отметив
на них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
3.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
4. Метод опорных векторов
4.1. Проведите классификацию методом опорных векторах при
различных параметрах ядра: “linear”, “poly” (нужно выбрать
степень), “rbf”. Постройте столбчатую диаграмму зависимости
точности (Accuracy) от вида ядра. Дальнейшие пункты 4.*
выполняйте для лучшего параметра.
4.2. Постройте изображение с границами принятия решения отметив
на них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.

4
4.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
5. Решающие деревья
5.1. Проведите классификацию используя решающие деревья,
подобрав параметры, при которых получается лучшее обобщение
(максимальная глубина/максимальное количество
листьев/метрика загрязнения и т.д.).
5.2. Постройте изображение с границами принятия решения отметив
на них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.
5.4. Рассчитайте значения Precision, Recall, F1 для полученных
результатов.
5.6. Визуализируйте полученное дерево решений. Сделайте выводы о
правилах в узлах дерева. Сопоставьте их с полученными
границами принятия решений.
6. Выбор классификатора
6.1. Постройте таблицу с метриками Precision, Recall, для полученных
результатов каждым классификатором.
6.2. Сделайте выводы о том, какие классификаторы лучше всего
подходят для вашего набора данных и почему.
Выполнение работы.
1. Загрузка данных:
1.1. Загрузите данные вашего варианта. Учтите, что метки классов
могут быть текстом.

5
Для загрузки наборов необходимо использовать метод read_csv из
библиотеки Pandas. Вызвав метод head, можно проверить корректность
загруженных данных (по умолчанию он возвращает 5 первых строк).
Реализация приведена в Листинге 1.1.1. Результат представлен в Таблице
1.1.2.
Листинг 1.1.1 – Загрузка данных из файла и вызов метода head
import pandas as pd
df = pd.read_csv("lab4_5.csv")
print(df.head())
Таблица 1.1.2 – Результат вывода первых пяти записей датафрейма
X1
X2
Class
0
-0.442073
1.491221
ON
1
0.655868
0.623038
MO
2
0.374073
-0.822161
MO
3
0.793154
0.808877
MO
4
0.885889
0.683403
MO
1.2. Визуализируйте данные при помощи диаграммы рассеяния с
выделением различных классов.
Для начала подключим библиотеки Seaborn и Matplotlib. Создадим
объект plt.figure. Затем с помощью sns.scatterplot построим диаграммы
рассеяния. После зададим название осям, легенде и отобразим диаграмму.
Реализация представлена в Листинге 1.2.1. Диаграмма изображена на
Рисунке 1.2.2.
Листинг 1.2.1 – Реализация построения диаграммы рассеяния
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure()

6
sns.scatterplot(data=df, x="X1", y="X2", hue="Class")
plt.xlabel("X1")
plt.ylabel("X2")
plt.legend(title="Класс")
plt.show()
Рисунок 1.2.2 – Диаграмма рассеяния датафрейма
1.3. Оцените сбалансированность классов.
Для оценки сбалансированности классов выведем количество объектов
каждого класса. Реализация представлена в Листинге 1.3.1. Результат
представлен в Листинге 1.3.2.
Листинг 1.3.1 – Оценка сбалансированности классов
print(df['Class'].value_counts())
Листинг 1.3.2 – Количество объектов каждого класса
Class
ON 201
MO 200

7
Классы сбалансированы отлично: 201 объект класса ON и 200 объектов
класса MO. Это означает, что дополнительная балансировка не требуется.
1.4. Проведите предобработку данных при необходимости.
Стандартизируем числовые признаки, чтобы ускорить обучение и
улучшить сходимость модели. Также закодируем категориальные метки
классов, так как алгоритмы требуют числовой формат. Реализация
представлена в Листинге 1.4.1.
Листинг 1.4.1 – Стандартизация данных
from sklearn.preprocessing import LabelEncoder, StandardScaler
label_encoder = LabelEncoder()
df['Class'] = label_encoder.fit_transform(df['Class'])
X = df[['X1', 'X2']]
y = df['Class']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
1.5. Разделите выборку на обучающую и тестовую. На обучающей
проводите обучение модели, на тестовой расчет значений метрик.
Сначала импортируем train_test_split из sklearn.model_selection для
разделения данных на обучающую и тестовую выборки. Далее с помощью
этой функции осуществляется разделение данных на тестовую и обучающую
выборки. Реализация приведена в Листинге 1.5.1.
Листинг 1.5.1 – Разделение выборки на обучающую и тестовую
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_scaled,
y, test_size=0.3, random_state=42, stratify=y)

8
2. KNN:
2.1. Проведите классификацию методом k ближайших соседей,
подобрав параметры: количество соседей, необходимость
взвешивания. Постройте графики зависимости точности (Accuracy)
в зависимости от количества соседей (по 1-й линии для
взвешенного и не взвешенного метода).
Сначала для каждого значения k создаются и обучаются две модели KNN
(uniform и distance), вычисляется точность предсказаний на тестовых данных,
результаты сохраняются в списки. Затем строится график зависимости
точности от количества соседей для обоих моделей с легендой, добавляются
подписи осей, сетка и отображается график. Реализация приведена в
Листинге 2.1.1. График изображен на Рисунке 2.1.2.
Листинг 2.1.1 – Проведение классификации с подбором параметров
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
neighbors = np.arange(1, 11)
uniform, distance = [], []
for k in neighbors:
knn_uniform = KNeighborsClassifier(n_neighbors=k,
weights='uniform')
knn_uniform.fit(X_train, y_train)
pred_uniform = knn_uniform.predict(X_test)
uniform.append(accuracy_score(y_test, pred_uniform))
knn_distance = KNeighborsClassifier(n_neighbors=k,
weights='distance')
knn_distance.fit(X_train, y_train)
pred_distance = knn_distance.predict(X_test)
distance.append(accuracy_score(y_test, pred_distance))
plt.figure()
plt.plot(neighbors, uniform, marker='o', label='Без
взвешивания')
plt.plot(neighbors, distance, marker='s', label='С
взвешиванием')

9
plt.xlabel('Neighbours Count')
plt.ylabel('Accuracy')
plt.legend()
plt.grid()
plt.show()
Рисунок 2.1.2 – График точности в зависимости от числа соседей
Наибольшая точность достигается при взвешенном с количеством
соседей равным 7, 8, 9, 10 и при без взвешивания с количеством соседей
равным 5, 6, 7, 9.
После анализа всех вариантов оптимальным выбором можно считать
модель с 5 соседями и выключенным взвешиванием. Этот вариант сохраняет
высокую точность, упрощают модель (без взвешивания), уменьшают влияние
шумов и выбросов.
2.2. Постройте изображение с границами принятия решения отметив на
них точки классов разным цветом. Сделайте выводы о качестве
классификации на основе полученного изображения.

10
Сначала создается и обучается модель KNN, затем создаются границы
графика и область принятия решений. Область принятия решений строится с
помощью plt.contourf, а диаграмма с помощью plt.scatter. Добавляется
легенда с названиями классов, подписи осей и сетка. Реализация приведена в
Листинге 2.2.1. Диаграмма изображена на Рисунке 2.2.2.
Листинг 2.2.1 – Реализация построения диаграммы рассеяния с границами
принятия решений
from matplotlib.colors import ListedColormap
knn = KNeighborsClassifier(n_neighbors=5,
weights='uniform').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 = knn.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()
Соседние файлы в папке Лабы по ОМО 2025
