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

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

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
753 Кб
Скачать
☆
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Основы машинного обучения»
Тема: Классификация
Студентка гр. 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