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

2
Цель работы.
Изучить подходы к предобработке данных, научится анализировать
набор данных, выявлять выбросы, анализировать пересечене классов,
интерпретировать полученные результаты, визуализировать данные,
используя библиотеки Pandas, Seaborn, NumPy, Sklearn.
Задание.
Вариант 1
1. Изучение набора данных iris.csv с использованием Pandas и Seaborn:
1.1. Загрузить данные из файла как Pandas DataFrame
1.2. Вызвав у датафрейма метод head, проверить корректность
загруженных данных
1.3. Вызвав у датафрейма метод describe, получить характеристики.
Опишите полученный результат.
1.4. Видоизмените полученный датафрейм таким образом, чтобы
метка классов были следующими: 0 - Iris-setosa, 1 - Iris-versicolor, 2
- Iris-virginica. Сохраните полученный датафрейм в отдельный
файл формата csv.
1.5. Визуально оцените набор данных, построив изображение,
содержащее графики ядерной оценки плотности каждого признака
(кроме признака названия/ номера класса), диаграмму рассеяния и
двумерную ядерную оценку плотности для каждых признаков.
Наблюдения разных классов должны быть выделены отдельным
цветом (рекомендуемая палитра ‘tab10’ или ‘Set1’). Опишите
полученный график, что на нем изображено, какие выводы о
данных можно сделать.

3
1.6. На одном изображении постройте гистограммы распределения
для каждого признака (для построения нескольких диаграмм на
одном изображении, необходимо создать subplot из matplotlib, и
для каждой диаграммы задать параметр ax, указав нужную ячейку.
Subplot возвращает два параметра: саму фигуру с изображением и
список ячеек. Например, изображение с 4 ячейками записанных в
ряд: fig, axs = plt.subplots(1,4). Указание ячейки в параметре
диаграммы делается следующим образом: ax=axs[0]). Затем
последовательно модифицируйте изображение:
1.6.1. Постройте гистограммы для разного количества столбцов:
5,10,15,20,30. Выберите на ваш взгляд такое количество
столбцов, который лучшие образом описывает форму
распределения признаков.
1.6.2. Сделайте на каждой гистограмме разделение по цвету
согласно классу. Проведите это в двух режимах, когда
гистограммы накладываются/суммируются и когда
пересекаются. Далее используйте режим с пересечением.
1.7. Постройте гистограммы, чтобы вместо столбцов изображались
ступеньки.
1.8. Добавьте на гистограммы график ядерной оценки плотности.
2. Изучение набора данных iris.csv с использованием NumPy:
2.1. Загрузите данные из файла как массив NumPy
2.2. Выведите первые 10 наблюдений набора данных.
2.3. Рассчитайте характеристики, полученные методом describe в п. 1.3
с использованием методов NumPy. Обращайте внимание на то, где
оценка смещенная, а где нет.

4
3. Изучение набора данных вашего варианта:
3.1. Оцените и опишите набор данных вашего варианта с
использованием методов, рассмотренных ранее. Сделайте выводы
о кол-во классов, наличию выбросов, пересечении классов, и т.д.
4. Преобразование данных:
4.1. Получите из датафрейма из п. 1.4 столбец с названием классов.
Используя LabelEncoder и OneHotEncoder получите различные
способы кодирования меток класса. В чем различия полученных
кодировок?
4.2. Для датафрейма из п. 1.4, получите все столбцы признаков
(столбцы не содержащие метки классов). Преобразуйте
полученные столбцы в массив NumPy.
4.3. Для массива NumPy из п. 4.2 примените StandardScaler,
MinMaxScaler, MaxAbsScaler и RobustScaler. Для каждого из
результатов постройте гистограммы по каждому признаку без
разделения по классам. В чем различия между такими
преобразованиями данных?
Выполнение работы.
1. Изучение набора данных iris.csv с использованием Pandas и Seaborn:
1.1. Загрузить данные из файла как Pandas DataFrame
Для загрузки датасета необходимо использовать метод read_csv из
библиотеки Pandas. В метод передаем название файла и параметр index_col
присваиваем 0 для удаления лишнего первого столбца. Реализация данного
функционала представлена в Листинге 1.1.1.
Листинг 1.1.1 – Загрузка данных из файла и удаление лишнего столбца

5
import pandas as pd
df = pd.read_csv("iris.csv", index_col=0)
1.2. Вызвав у датафрейма метод head, проверить корректность
загруженных данных
Вызвав метод head, можно проверить корректность загруженных данных
(по умолчанию он возвращает 5 первых строк). Для этого выведем их.
Сравним их с исходными данными, которые хранились в файле. Реализация
приведена в Листинге 1.2.1, а результат в Таблице 1.2.2.
Листинг 1.2.1 – Вызов метода head
print(df.head())
Таблица 1.2.2 – Результат вывода первых пяти записей датафрейма
index
sepal length
(cm)
sepal width
(cm)
petal length
(cm)
petal width
(cm)
target
0
5.1
3.5
1.4
0.2
0
1
4.9
3.0
1.4
0.2
0 2 4.7
3.2
1.3
0.2
0 3 4.6
3.1
1.5
0.2
0 4 5.0
3.6
1.4
0.2
0
1.3. Вызвав у датафрейма метод describe, получить характеристики.
Опишите полученный результат.
Для получения характеристик датасета воспользуемся методом describe.
Он рассчитывает такие параметры, как количество значений (count), среднее
значение (mean), стандартное отклонение (std), минимальное (min) и
максимальное (max) значения, а также квартили (25%, 50%, 75%). Реализация
вызова представлена в Листинге 1.3.1, результат – в Таблице 1.3.2.

6
Листинг 1.3.1 – Реализация вызова метода describe для анализа датасета
print(df.describe())
Таблица 1.3.2 – Результат вызова метода describe
sepal length
(cm)
sepal width
(cm)
petal length
(cm)
petal width
(cm)
target
count
150.000000
150.000000
150.000000
150.000000
150.000000
mean
5.843333
3.057333
3.758000
1.199333
1.000000
std
0.828066
0.435866
1.765298
0.762238
0.819232
min
4.300000
2.000000
1.000000
0.100000
0.000000
25%
5.100000
2.800000
1.600000
0.300000
0.000000
50%
5.800000
3.000000
4.350000
1.300000
1.000000
75%
6.400000
3.300000
5.100000
1.800000
2.000000
max
7.900000
4.400000
6.900000
2.500000
2.000000
Метод показывает основные статистические характеристики набора
данных. Всего 150 наблюдений. Средние значения признаков: длина
чашелистика – 5,84 см, ширина – 3,06 см, длина лепестка – 3,76 см, ширина –
1,2 см. Разброс данных описывается стандартным отклонением, например,
наименьшее 0,44. Минимальные и максимальные значения позволяют
оценить диапазон каждого признака. Например, длина чашелистика
варьируется от 4,3 до 7,9 см. Квартильные значения (25%, 50%, 75%)
помогают понять, как данные распределены. Поле target указывает на три
класса ирисов (0, 1, 2).
1.4. Видоизмените полученный датафрейм таким образом, чтобы метка
классов были следующими: 0 - Iris-setosa, 1 - Iris-versicolor, 2 - Iris-

7
virginica. Сохраните полученный датафрейм в отдельный файл
формата csv.
Для замены меток воспользуемся методом replace. В него передается
массив старых меток и массив новых. Из датафрейма берется столбец target и
к нему применяется этот метод, и старый столбец заменяется на новый. Далее
сохраняем измененный датафрейм в новый файл "new_iris.csv". Параметр
index=False исключает индексы строк из сохраненного файла. Используем
метод iloc и выведем строки с индексами 0, 50, 100, чтобы убедиться, что
преобразование выполнено правильно. Эти индексы соответствуют первому
экземпляру каждого класса (Setosa, Versicolor, Virginica). Реализация
представлена в Листинге 1.4.1. Результат приведен в Таблице 1.4.2.
Листинге 1.4.1 – Реализация замены данных, её проверка и сохранение
df["target"] = df["target"].replace([0, 1, 2], ["Iris-setosa",
"Iris-versicolor", "Iris-virginica"])
df.to_csv("new_iris.csv", index=False)
print(df.iloc[[0, 50, 100]])
Таблица 1.4.2 – Результат замены данных
sepal length
(cm)
sepal width
(cm)
petal length
(cm)
petal width
(cm)
target
0
5.1
3.5
1.4
0.2
Iris-setosa
50
7.0
3.2
4.7
1.4
Iris-versicolor
100
6.3
3.3
6.0
2.5
Iris-virginica
1.5. Визуально оцените набор данных, построив изображение,
содержащее графики ядерной оценки плотности каждого признака
(кроме признака названия/ номера класса), диаграмму рассеяния и
двумерную ядерную оценку плотности для каждых признаков.
Наблюдения разных классов должны быть выделены отдельным

8
цветом (рекомендуемая палитра ‘tab10’ или ‘Set1’). Опишите
полученный график, что на нем изображено, какие выводы о данных
можно сделать.
Для начала подключим библиотеки Seaborn и Matplotlib. Создадим
объект sns.PairGrid, который организует сетку для парных графиков, где
данные разделяются. Параметр hue="target" разделяет данные по классам,
palette="Set10" задает цветовую палитру, diag_sharey=False отключает
общую ось Y для диагональных графиков, чтобы каждый из них имел свою
шкалу. Выше диагонали строятся диаграммы рассеяния с помощью
g.map_upper(sns.scatterplot), которые показывают взаимосвязи между парами
признаков. Ниже диагонали отображаются графики двумерной оценки
ядерной плотности с использованием g.map_lower(sns.kdeplot), что позволяет
визуализировать совместное распределение пар признаков. На диагонали
размещаются графики одномерной оценки ядерной плотности с помощью
g.map_diag(sns.kdeplot), которая отображает распределение каждого признака
в отдельности. Также добавим легенду. Реализация приведена в Листинге
1.5.1. Графики изображены на Рисунке 1.5.2.
Листинг 1.5.1 – Реализация построения графиков оценки ядерной плотности
каждого признака, диаграмм рассеивания и двумерной оценки ядерной
плотности
g = sns.PairGrid(df, hue="target", palette="tab10",
diag_sharey=False)
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.kdeplot)
g.add_legend()
plt.show()

9
Рисунок 1.5.2 – Графики ядерной оценки плотности, диаграмма
рассеяния и двумерная ядерная оценка плотности для каждых признаков
На графиках изображена диаграмма рассеяния для различных пар
признаков, где каждая точка представляет собой один объект из набора
данных; ядерная оценка плотности для каждого признака по отдельности;
двумерная ядерная оценка плотности для парных признаков, показывающая,
где находятся скопления точек разных классов.
Из графиков можно увидеть, что Iris-setosa чётко отделяется от двух
других классов по всем параметрам, особенно по petal length и petal width.
Это говорит о том, что данный класс можно легко классифицировать,
используя эти параметры. Также Iris-versicolor и Iris-virginica частично
пересекаются, особенно по параметрам sepal length и sepal width, что
затрудняет их разделение по этим параметрам. Но по длине и ширине

10
лепестка (petal length, petal width) их различие становится более заметным,
хотя небольшое перекрытие остаётся.
1.6. На одном изображении постройте гистограммы распределения для
каждого признака (для построения нескольких диаграмм на одном
изображении, необходимо создать subplot из matplotlib, и для каждой
диаграммы задать параметр ax, указав нужную ячейку. Subplot
возвращает два параметра: саму фигуру с изображением и список
ячеек. Например, изображение с 4 ячейками записанных в ряд: fig,
axs = plt.subplots(1,4). Указание ячейки в параметре диаграммы
делается следующим образом: ax=axs[0]). Затем последовательно
модифицируйте изображение:
Сначала создаётся график с четырьмя подграфиками в один ряд. Затем с
помощью цикла перебираются столбцы (кроме последнего), и для каждого из
них строится гистограмма. Она создаётся методом hist, где задаётся
количество столбцов (bins=20) и чёрные границы столбцов
(edgecolor='black'). Каждая гистограмма получает заголовок, подпись осей X
и Y. После цикла вызывается plt.tight_layout(), чтобы корректно разместить
графики, а затем plt.show() отображает результат. Реализация приведена в
Листинге 1.6.1. График гистограммы представлен на Рисунке 1.6.2.
Листинг 1.6.1 – Реализация рисования гистограммы распределения для
каждого признака
fig, axs = plt.subplots(1, 4, figsize=(20, 5))
for i, column in enumerate(df.columns[:-1]):
df[column].hist(ax=axs[i], bins=20, edgecolor='black')
axs[i].set_title(f'Распределение для {column}')
axs[i].set_xlabel(column)
axs[i].set_ylabel('Count')
plt.tight_layout()
Соседние файлы в папке Лабы по ОМО 2025
