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

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

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
2 Мб
Скачать
☆
21
классификацию. Var3 наиболее информативен, так как лучше всего разделяет
классы, тогда как var4 имеет значительное перекрытие и может быть менее
полезен. В некоторых признаках, особенно в var3, видно два пика в
распределении и возможные выбросы.
4. Преобразование данных:
4.1. Получите из датафрейма из п. 1.4 столбец с названием классов.
Используя LabelEncoder и OneHotEncoder получите различные
способы кодирования меток класса. В чем различия полученных
кодировок?
Для кодирования столбца датасета необходимо создать экземпляр класса LabelEncoder и применить к нему метод fit_transform, передав в качестве аргумента столбец с классами. Кодирование категориальных данных
показано в Листинге 4.1.1. Результат кодирования записей с индексами 0, 50,
100 представлен в Листинге 4.1.2. Листинг 4.1.1 – Реализация кодирования с помощью LabelEncoder.
from sklearn.preprocessing import LabelEncoder print(LabelEncoder().fit_transform(df['target'])[[0, 50, 100]])
Листинг 4.1.2 – Результат кодирования с помощью LabelEncoder.
[0 1 2]
Для кодирования столбца датасета необходимо создать экземпляр класса
OneHotEncoder и применить к нему метод fit_transform, передав в качестве аргумента столбец с классами. Кодирования категориальных данных
показано в Листинге 4.1.3. Результат кодирования записей с индексами 0, 50,
100 представлен в Листинге 4.1.4. Листинг 4.1.3 – Реализация кодирования с помощью OneHotEncoder.
from sklearn.preprocessing import OneHotEncoder
22
print(OneHotEncoder().fit_transform(df[['target']]).toarray()[[ 0, 50, 100]])
Листинг 4.1.4 – Результат кодирования с помощью OneHotEncoder.
[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
Кодировка, осуществляемая с помощью LabelEncoder, представляет
собой преобразования категориальных значений в числовые метки, при этом
каждому классу присваивается уникальный индекс. Например, Iris-setosa кодируется как 0, Iris-versicolor как 1, а Iris-virginica как 2. В отличие от этого, OneHotEncoder преобразует каждую категорию в отдельный бинарный
вектор, где единица обозначает принадлежность к конкретному классу, а
остальные значения остаются нулями.
4.2. Для датафрейма из п. 1.4, получите все столбцы признаков (столбцы
не содержащие метки классов). Преобразуйте полученные столбцы в
массив NumPy.
Для преобразования датафрейма в массив NumPy используем drop для отбрасывания столбца с метками и метод to_numpy для преобразования в массив. Реализация преобразования датафрейма в массив NumPy представлено в Листинге 4.2.1. Листинг 4.2.1 – Преобразование датафрейма в массив NumPy
data = df.drop('target', axis=1).to_numpy()
4.3. Для массива NumPy из п. 4.2 примените StandardScaler, MinMaxScaler, MaxAbsScaler и RobustScaler. Для каждого из
результатов постройте гистограммы по каждому признаку без
23
разделения по классам. В чем различия между такими
преобразованиями данных?
Сначала определяется функция histograms(X, title), которая принимает на
вход преобразованные данные и заголовок. Внутри этой функции данные
преобразуются в датафрейм. Затем создается график с четырьмя
подграфиками, и для каждого из них строится гистограмма с помощью
sns.histplot. В конце функции устанавливается общий заголовок, используется
plt.tight_layout() для корректного отображения графиков, а затем они
выводятся на экран. После определения функции она вызывается 4 раза с преобразованными данными с помощью StandardScaler, MinMaxScaler, MaxAbsScaler и RobustScaler. Реализация представлена в Листинге 4.3.1. Результат приведен на Рисунке 4.3.2, Рисунке 4.3.3, Рисунке 4.3.4, Рисунке
4.3.5.
Листинг 4.3.1 – Реализация отрисовки данных после преобразования с помощью StandardScaler, MinMaxScaler, MaxAbsScaler и RobustScaler.
from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler, RobustScaler
def histograms(X, title): df = pd.DataFrame(X, columns=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']) fig, axes = plt.subplots(1, 4, figsize=(20, 5)) for ax, column in zip(axes, df.columns): sns.histplot(data=df, x=column, bins=15, multiple='layer', ax=ax) fig.suptitle(title) plt.tight_layout() plt.show()
histograms(StandardScaler().fit_transform(data), 'StandardScaler') histograms(MinMaxScaler().fit_transform(data), 'MinMaxScaler') histograms(MaxAbsScaler().fit_transform(data), 'MaxAbsScaler') histograms(RobustScaler().fit_transform(data), 'RobustScaler')
24
Рисунок 4.3.2 – Распределения признаков после преобразования
StandardScaler
Рисунок 4.3.3 – Распределения признаков после преобразования
MinMaxScaler
Рисунок 4.3.4 – Распределения признаков после преобразования
MaxAbsScaler
25
Рисунок 4.3.5 – Распределения признаков после преобразования RobustScaler
StandardScaler преобразует данные так, чтобы их среднее значение стало
равным 0, а стандартное отклонение – 1. Это достигается путем вычитания
среднего значения и деления на стандартное отклонение. Данные
центрируются вокруг нуля и имеют единичную дисперсию. Гистограмма
будет симметричной относительно нуля, если исходное распределение было
близко к нормальному.
MinMaxScaler масштабирует данные до заданного диапазона (по
умолчанию [0, 1]). Это достигается путем вычитания минимального значения
и деления на разницу между максимальным и минимальным значениями. Все
значения признаков оказываются в диапазоне [0, 1]. Гистограмма сохраняет
форму исходного распределения, но сжимается или растягивается до нового
диапазона.
MaxAbsScaler масштабирует данные так, чтобы максимальное
абсолютное значение каждого признака стало равным 1. Это достигается
путем деления на максимальное абсолютное значение. Данные остаются в
диапазоне [-1, 1]. Гистограмма сохраняет форму исходного распределения, но масштабируется по оси значений.
26
RobustScaler масштабирует данные на основе робастных статистик:
использует медиану и межквартильный размах. Это делает метод устойчивым
к выбросам. Гистограмма сохраняет форму исходного распределения, но
выбросы меньше влияют на результат.
Вывод.
Был проведен анализ набора данных iris.csv, включающий изучение
данных, их визуализацию и преобразование с использованием библиотек Pandas, NumPy, Seaborn и Matplotlib. Были изучены статистические
характеристики данных, построены графики распределения признаков и
диаграммы рассеяния, что позволило оценить разделимость классов и наличие выбросов. Также было выявлено, что iris-setosa четко отделяется от других классов, особенно по petal length и petal width, что делает его легко классифицируемым. Iris-versicolor и Iris-virginica имеют частичное
пересечение, особенно по sepal length и sepal width, что усложняет их
разделение. Наиболее информативными признаками для классификации
являются длина и ширина лепестков, так как они лучше всего
дифференцируют классы. Еще были применены различные методы
масштабирования данных, такие как StandardScaler, MinMaxScaler,
MaxAbsScaler и RobustScaler.
Соседние файлы в папке Лабы по ОМО 2025