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

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

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

Сначала определяется функция 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')

Рисунок 4.3.2 – Распределения признаков после преобразования StandardScaler

Рисунок 4.3.3 – Распределения признаков после преобразования MinMaxScaler

Рисунок 4.3.4 – Распределения признаков после преобразования MaxAbsScaler

Рисунок 4.3.5 – Распределения признаков после преобразования RobustScaler

StandardScaler преобразует данные так, чтобы их среднее значение стало равным 0, а стандартное отклонение – 1. Это достигается путем вычитания среднего значения и деления на стандартное отклонение. Данные центрируются вокруг нуля и имеют единичную дисперсию. Гистограмма будет симметричной относительно нуля, если исходное распределение было близко к нормальному.

MinMaxScaler масштабирует данные до заданного диапазона (по умолчанию [0, 1]). Это достигается путем вычитания минимального значения и деления на разницу между максимальным и минимальным значениями. Все значения признаков оказываются в диапазоне [0, 1]. Гистограмма сохраняет форму исходного распределения, но сжимается или растягивается до нового диапазона.

MaxAbsScaler масштабирует данные так, чтобы максимальное абсолютное значение каждого признака стало равным 1. Это достигается путем деления на максимальное абсолютное значение. Данные остаются в диапазоне [-1, 1]. Гистограмма сохраняет форму исходного распределения, но масштабируется по оси значений.

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.

26

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