Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по ОМО 2025 / Baraeva_Elizaveta_lb4.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
814 Кб
Скачать
☆

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №4

по дисциплине «Основы машинного обучения»

Тема: Классификация

Студентка гр. 2383

Бараева Е. Н.

Преподаватель

Жангиров Т. Р.

Санкт-Петербург

2025

Цель работы.

Исследовать и сравнить методы классификации: kNN, логистическая регрессия, метод опорных векторов, решающие деревья. Определить оптимальные параметры для каждого алгоритма, обеспечивающие максимальную точность и обобщающую способность. Оценить качество моделей с помощью различных метрик и визуализации границ принятия решений. Выявить наилучший алгоритм для конкретного набора данных.

Задание.

Вариант 3

  1. Загрузка данных

    1. Загрузите данные вашего варианта. Учтите, что метки классов могут быть текстом.

    2. Визуализируйте данные при помощи диаграммы рассеяния с выделением различных классов.

    3. Оцените сбалансированность классов.

    4. Проведите предобработку данных при необходимости.

    5. Разделите выборку на обучающую и тестовую. На обучающей проводите обучение модели, на тестовой расчет значений метрик.

  2. KNN

    1. Проведите классификацию методом k ближайших соседей, подобрав параметры: количество соседей, необходимость взвешивания. Постройте графики зависимости точности (Accuracy) в зависимости от количества соседей (по 1-й линии для взвешенного и не взвешенного метода).

    2. Постройте изображение с границами принятия решения отметив на них точки классов разным цветом. Сделайте выводы о качестве классификации на основе полученного изображения.

    1. Рассчитайте значения Precision, Recall, F1 для полученных результатов.

  1. Логистическая регрессия

    1. Проведите классификацию методом логистической регрессии при различных параметрах: без регуляризации, с l1 регуляризацией, c l2 регуляризацией. Постройте столбчатую диаграмму зависимости точности (Accuracy) от наличия регуляризации. Дальнейшие пункты 3.* выполняйте для лучшего параметра.

    2. Постройте изображение с границами принятия решения отметив на них точки классов разным цветом. Сделайте выводы о качестве классификации на основе полученного изображения.

    1. Рассчитайте значения Precision, Recall, F1 для полученных результатов.

  1. Метод опорных векторов

    1. Проведите классификацию методом опорных векторах при различных параметрах ядра: “linear”, “poly” (нужно выбрать степень), “rbf”. Постройте столбчатую диаграмму зависимости точности (Accuracy) от вида ядра. Дальнейшие пункты 4.* выполняйте для лучшего параметра.

    2. Постройте изображение с границами принятия решения отметив на них точки классов разным цветом. Сделайте выводы о качестве классификации на основе полученного изображения.

    1. Рассчитайте значения Precision, Recall, F1 для полученных результатов.

  1. Решающие деревья

    1. Проведите классификацию используя решающие деревья, подобрав параметры, при которых получается лучшее обобщение (максимальная глубина/максимальное количество листьев/метрика загрязнения и т.д.).

    2. Постройте изображение с границами принятия решения отметив на них точки классов разным цветом. Сделайте выводы о качестве классификации на основе полученного изображения.

    1. Рассчитайте значения Precision, Recall, F1 для полученных результатов.

    1. Визуализируйте полученное дерево решений. Сделайте выводы о правилах в узлах дерева. Сопоставьте их с полученными границами принятия решений.

  1. Выбор классификатора

    1. Постройте таблицу с метриками Precision, Recall, для полученных результатов каждым классификатором.

    2. Сделайте выводы о том, какие классификаторы лучше всего подходят для вашего набора данных и почему.

Выполнение работы.

  1. Загрузка данных:

    1. Загрузите данные вашего варианта. Учтите, что метки классов могут быть текстом.

Для загрузки наборов необходимо использовать метод 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. Визуализируйте данные при помощи диаграммы рассеяния с выделением различных классов.

Для начала подключим библиотеки 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()

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. Оцените сбалансированность классов.

Для оценки сбалансированности классов выведем количество объектов каждого класса. Реализация представлена в Листинге 1.3.1. Результат представлен в Листинге 1.3.2.

Листинг 1.3.1 – Оценка сбалансированности классов

print(df['Class'].value_counts())

Листинг 1.3.2 – Количество объектов каждого класса

Class

ON 201

MO 200

Классы сбалансированы отлично: 201 объект класса ON и 200 объектов класса MO. Это означает, что дополнительная балансировка не требуется.

    1. Проведите предобработку данных при необходимости.

Стандартизируем числовые признаки, чтобы ускорить обучение и улучшить сходимость модели. Также закодируем категориальные метки классов, так как алгоритмы требуют числовой формат. Реализация представлена в Листинге 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. Разделите выборку на обучающую и тестовую. На обучающей проводите обучение модели, на тестовой расчет значений метрик.

Сначала импортируем 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)

  1. KNN:

  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='С взвешиванием')

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 соседями и выключенным взвешиванием. Этот вариант сохраняет высокую точность, упрощают модель (без взвешивания), уменьшают влияние шумов и выбросов.

Соседние файлы в папке Лабы по ОМО 2025