Понимание данных
Прежде чем начать любой проект машинного обучения, например прогнозирование цен на дома, распознавание кошек и собак на изображениях или рекомендацию фильмов, которые вам могут понравиться, мы сначала должны столкнуться с одним из самых базовых и критически важных этапов:Понимание данных。
Мы можем представить понимание данных как процесс, в котором детектив тщательно изучает все улики и файлы перед расследованием дела. Если мы не понимаем контекст, достоверность и значение улик (данных), любые последующие рассуждения (моделирование) могут быть построены на неправильном фундаменте.
Понимание данных — это краеугольный камень всего процесса машинного обучения. Оно определяет, как мы позже очищаем данные, выбираем модели, и в конечном итоге влияет на успех или неудачу модели.
Что такое понимание данных?
Понимание данных, как следует из названия, означает глубокое понимание набора данных, который находится у вас в руках. Его основная цель — ответить на следующие вопросы:
- Какие данные у меня есть?(Структура и типы данных)
- Каково качество данных?(Являются ли данные чистыми, полными и надёжными?)
- Что говорят данные?(Какие закономерности, взаимосвязи и распределения скрыты в данных?)
Этот процесс не предполагает сложного кода и алгоритмов; он скорее направлен на понимание данных через наблюдение, статистику и визуализацию.
Основные шаги и инструменты
Мы будем использовать самую популярную библиотеку для обработки данныхPandasи библиотеку визуализацииMatplotlib/Seabornдля демонстрации.
Перед началом давайте установим следующие библиотеки зависимостей:
pip install pandas matplotlib seaborn
Описание основных библиотек анализа данных pandas:
- pandas
Основная библиотека для обработки данных, специализирующаяся на чтении/записи табличных данных, очистке, статистике; поддерживает чтение Excel/CSV и предоставляет таблицу DataFrame. - matplotlib
Низкоуровневая базовая библиотека для построения графиков, основа визуализации в Python; позволяет строить различные базовые графики, такие как линейные, столбчатые и точечные диаграммы, обладает высокой гибкостью, но код довольно многословен. - seaborn
Высокоуровневая библиотека для построения графиков на основе matplotlib, предназначенная для статистических диаграмм; имеет приятные цветовые схемы и позволяет строить графики распределения, тепловые карты и ящичные диаграммы одной строкой кода.
Шаг 1: Первое знакомство — загрузка и обзор
Сначала нам нужно загрузить данные в программу и быстро просмотреть их общий вид.
Для начала скачайте тестовые данные и поместите их в тот же каталог, что и тестовый код Python:
URL для скачивания тестовых данных:https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv
Если загрузка через сеть githubusercontent не удалась, можно напрямую нажать на ссылку для скачивания:/static.jyshare.com/download/iris.csv。
Пример
import matplotlib.pyplot as plt
import seaborn as sns
# 1. Загрузка данных (здесь в качестве примера используется классический набор данных Iris; вы также можете загрузить собственный CSV-файл)
# Загрузка из локального файла
df = pd.read_csv('iris.csv')
# Загрузка из сети
# url = "https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv"
# df = pd.read_csv(url)
# 2. Просмотр первых нескольких строк данных - первое впечатление
print("Первые 5 строк данных:")
print(df.head())
print("\n" + "="*50 + "\n")
# 3. Просмотр общей информации о данных: количество строк, количество столбцов, типы данных, использование памяти
print("Основная информация о наборе данных:")
print(df.info())
print("\n" + "="*50 + "\n")
# 4. Просмотр формы данных (сколько строк, сколько столбцов)
print(f"Форма набора данных: {df.shape}") # Вывод (строки, столбцы)
print(f"Всего {df.shape)
Объяснение кода:
df.head(): Словно пролистывая оглавление книги, быстро просмотрите первые несколько строк данных, чтобы понять, как выглядят данные.df.info(): Это "отчёт о медосмотре" данных. Он расскажет вам:- Название каждого столбца (
Column) - Количество непустых значений (
Non-Null Count), поэтому можно сразу узнать, есть ли пропущенные значения - Типы данных (
Dtype), такие какint64(integer),float64(float),object(текстовый или смешанный тип)
- Название каждого столбца (
df.shape: Непосредственно получить размеры таблицы данных.
После выполнения приведённого выше кода вывод будет примерно следующим:
数据的前5行: sepal_length sepal_width petal_length petal_width species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa ================================================== 数据集的基本信息: <class 'pandas.DataFrame'>
Шаг 2: Проверка качества — обнаружение пропущенных значений и аномалий
Данные редко бывают идеальными. К распространённым «болезням данных» относятсяпропущенные значения(некоторые позиции пусты) ивыбросы(некоторые числа аномально велики или аномально малы).
Пример
print("Количество пропущенных значений по каждому признаку:")
print(df.isnull().sum())
print("\n" + "="*50 + "\n")
# Если пропущенных значений много, можно рассчитать долю пропусков
missing_ratio = df.isnull().sum() / len(df) * 100
print("Доля пропущенных значений по признакам (%):")
print(missing_ratio)
print("\n" + "="*50 + "\n")
# 2. Проверьте статистическую сводку числовых признаков — это может помочь выявить выбросы
print("Статистическое описание числовых признаков:")
print(df.describe())
Объяснение кода:
df.isnull().sum(): Вычислить общее количество null-значений (NaN) в каждом столбце.df.describe(): Сгенерировать статистическую сводку числовых столбцов, включая:count: count (можно использовать для перепроверки пропущенных значений)mean: meanstd: стандартное отклонение (насколько сильно колеблются данные)min: минимальное значение25%,50%(медиана),75%: квартилиmax: максимальное значение- Наблюдая
minиmax, можно предварительно определить, есть ли выбросы(например, столбец возраста, содержащий 200 лет).
Шаг 3: Углубленное понимание - визуализация распределений и взаимосвязей
Текст и числа абстрактны, тогда как графики позволяют нам интуитивно "видеть" данные. Это самая интересная часть понимания данных.
Пример
sns.set(style="whitegrid")
# 1. Одномерное распределение - понять распределение каждого признака по отдельности
fig, axes = plt.subplots(2, 2, figsize=(12, 8)) # Создать холст 2x2
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
colors = ['skyblue', 'lightgreen', 'salmon', 'gold']
for i, (ax, feature, color) in enumerate(zip(axes.flat, features, colors)):
# Нарисовать гистограмму (распределение) и кривую оценки ядерной плотности
sns.histplot(df[feature], kde=True, ax=ax, color=color, bins=20)
ax.set_title(f'Распределение {feature}', fontsize=14)
ax.set_xlabel(feature)
ax.set_ylabel('Частота')
plt.tight_layout()
plt.show()
# 2. Ящичная диаграмма - просмотр распределения данных и выбросов (более наглядно)
plt.figure(figsize=(10, 6))
# Выбрать числовые столбцы для построения ящичной диаграммы
df_box = df.drop(columns=['species']) # Предположим, что 'species' — текстовый столбец меток, удалите его сначала
sns.boxplot(data=df_box)
plt.title('Ящичная диаграмма для каждого числового признака (просмотр распределения и выбросов)', fontsize=14)
plt.xticks(rotation=45)
plt.show()
# 3. Связи между переменными - матрица диаграмм рассеяния
print("\nПостроение матрицы диаграмм рассеяния взаимосвязей признаков... (Это поможет нам обнаружить связи между признаками.)")
# Используйте pairplot из Seaborn, параметр hue может окрашивать по категории (например, виды ириса)
sns.pairplot(df, hue='species', height=2.5)
plt.suptitle('Матрица диаграмм рассеяния взаимосвязей признаков (с окраской по видам)', y=1.02, fontsize=16)
plt.show()
# 4. Тепловая карта корреляций - количественная оценка линейных связей между признаками
plt.figure(figsize=(8, 6))
# Вычислить коэффициент корреляции между числовыми признаками
numeric_df = df.select_dtypes(include=['float64', 'int64'])
correlation_matrix = numeric_df.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0, square=True)
plt.title('Тепловая карта корреляций признаков', fontsize=14)
plt.show()
Пояснение к графику:
- Гистограмма: показывает, как распределены значения признака (например, длина лепестка). Сконцентрированы ли они в определённом интервале или разбросаны?
- Ящичная диаграмма:
- Линия в середине ящика обозначаетмедиану。
- Верхняя и нижняя границы ящика представляют25-й (Q1) и 75-й (Q3) процентили。
- «Усы», идущие вверх и вниз, обычно представляют разумный диапазон (от Q1 - 1.5 IQR до Q3 + 1.5 IQR).
- Отдельные точки, вероятно, являютсявыбросами!
- Матрица диаграмм рассеяния: позволяет одновременно увидеть взаимосвязь между любыми двумя признаками. Если точки образуют полосовидное распределение, они могут быть коррелированы.
- Тепловая карта корреляций: точно представляет степень линейной корреляции между двумя признаками с помощью цветов и чисел (от -1 до 1).
- 1: Идеальная положительная корреляция (одно увеличивается, другое также увеличивается)
- -1: Идеальная отрицательная корреляция (одна увеличивается, другая уменьшается)
- 0: Линейная связь отсутствует
Результат этапа понимания данных: отчёт об исследовании данных
После выполнения вышеуказанных шагов вы сможете составить чёткий отчёт о текущем наборе данных, например:
Другие расширенияОтчёт об исследовании набора данных Iris
Обзор данных: Всего 150 образцов, 5 признаков (4 числовых признака: длина и ширина чашелистика/лепестка; 1 категориальная метка: вид).
Качество данных: Пропущенных значений нет; все числовые признаки находятся в разумных биологических диапазонах; явных выбросов не обнаружено.
Выводы по данным:
- Длина лепестка (
petal_length) и ширина лепестка (petal_width) имеют чрезвычайно высокую корреляцию (>0.96), что может указывать на информационную избыточность.- Различные виды Iris чётко различаются по размеру лепестков, и на диаграмме рассеяния наблюдается чёткая кластеризация.
- Ширина чашелистика (
sepal_width) распределение приблизительно нормальное.