- •Изучение набора данных iris.Csv с использованием Pandas и Seaborn:
- •Загрузить данные из файла как Pandas DataFrame
- •1.2. Вызвав у датафрейма метод head, проверить корректность загруженных данных
- •1.3. Вызвав у датафрейма метод describe, получить характеристики. Опишите полученный результат.
- •1.6.1. Постройте гистограммы для разного количества столбцов: 5,10,15,20,30. Выберите на ваш взгляд такое количество столбцов, который лучшие образом описывает форму распределения признаков.
- •1.7. Постройте гистограммы, чтобы вместо столбцов изображались ступеньки.
- •2.2. Выведите первые 10 наблюдений набора данных.
- •2.3. Рассчитайте характеристики, полученные методом describe в п. 1.3 с использованием методов NumPy. Обращайте внимание на то, где оценка смещенная, а где нет.
- •1.8. Добавьте на гистограммы график ядерной оценки плотности.
- •2. Изучение набора данных iris.Csv с использованием NumPy:
- •2.1. Загрузите данные из файла как массив NumPy
- •3. Изучение набора данных вашего варианта:
- •3.1. Оцените и опишите набор данных вашего варианта с использованием методов, рассмотренных ранее. Сделайте выводы о кол-во классов, наличию выбросов, пересечении классов, и т.Д.
- •4. Преобразование данных:
- •4.1. Получите из датафрейма из п. 1.4 столбец с названием классов. Используя LabelEncoder и OneHotEncoder получите различные способы кодирования меток класса. В чем различия полученных кодировок?
- •4.2. Для датафрейма из п. 1.4, получите все столбцы признаков (столбцы не содержащие метки классов). Преобразуйте полученные столбцы в массив NumPy.
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.
