0Pricing
Learn AI with Python · Урок

Анализ распределения признаков и целевой переменной

Анализ связей между признаками и целевой переменной, обнаружение дисбаланса классов и взаимной информации.

«Анализ распределения признаков и целевой переменной» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Зачем анализировать признаки относительно целевой переменной

Целевая переменная — это переменная, которую Вы хотите прогнозировать. Цель EDA при построении модели — выяснить, какие признаки действительно связаны с этой переменной.

В этом уроке рассматриваются графики зависимости признаков от целевой переменной, измерение информативности с помощью взаимной информации, обнаружение дисбаланса классов и устранение асимметрии с помощью преобразований.

Признак и целевая переменная — числовая целевая переменная

Для числовой целевой переменной диаграмма рассеяния зависимости feature от target показывает, содержит ли признак полезный сигнал.

Явная тенденция означает, что признак предсказывающий; бесформенное облако, скорее всего, говорит об обратном.

import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(x="rooms", y="price", data=df, alpha=0.4)
plt.show()

Признак и целевая переменная — категориальная целевая переменная

Если целевая переменная — это метка класса, сравните распределение признака внутри каждого класса. Перекрывающиеся графики KDE означают, что признак плохо разделяет классы; хорошо разделённые кривые говорят о его полезности.

sns.kdeplot(data=df, x="balance", hue="churned", common_norm=False, fill=True)
plt.title("Balance by churn status")
plt.show()

Сравнение распределений классов с помощью диаграмм размаха

Сгруппированные диаграммы размаха — ещё один способ увидеть зависимость между признаком и классом: поместите класс целевой переменной на ось x, а признак — на ось y.

Различающиеся медианы классов показывают, что признак помогает их различать.

sns.boxplot(x="churned", y="tenure", data=df)
plt.show()

Обнаружение дисбаланса классов

Дисбаланс классов возникает, когда один класс целевой переменной значительно превосходит другой по численности (например, 95% — не мошенничество, 5% — мошенничество). Он вводит показатель точности в заблуждение и смещает модели в сторону преобладающего класса.

Проверьте его с помощью простого подсчёта значений целевой переменной.

print(df["churned"].value_counts())
# 0    9200
# 1     800

value_counts(normalize=True) для долей

Исходные количества могут скрывать серьёзность дисбаланса. normalize=True преобразует количества в доли, поэтому их можно сразу читать как проценты.

print(df["churned"].value_counts(normalize=True))
# 0    0.92
# 1    0.08   -> only 8% positive class

Почему дисбаланс важен

Если отрицательных примеров 92%, модель, которая всегда предсказывает «нет», получит точность 92%, оставаясь бесполезной. Поэтому важно проверять дисбаланс на раннем этапе.

Возможные решения: повторная выборка (увеличение выборки меньшинства или уменьшение выборки большинства), веса классов или такие метрики, как точность, полнота и F1, вместо точности.

Взаимная информация — измерение информативности

Взаимная информация измеряет, насколько знание признака уменьшает неопределённость относительно целевой переменной. В отличие от корреляции, она также выявляет нелинейные зависимости.

Для целевых переменных-классов scikit-learn предоставляет mutual_info_classif.

from sklearn.feature_selection import mutual_info_classif

X = df[["balance", "tenure", "rooms"]]
y = df["churned"]
mi = mutual_info_classif(X, y, random_state=42)
print(dict(zip(X.columns, mi)))

Ранжирование признаков по взаимной информации

Если поместить оценки MI в отсортированный Series, получится быстрый рейтинг важности признаков. Чем выше MI, тем информативнее признак относительно целевой переменной.

Это отличный предварительный фильтр перед обучением любой модели.

import pandas as pd
from sklearn.feature_selection import mutual_info_classif

mi = mutual_info_classif(X, y, random_state=42)
scores = pd.Series(mi, index=X.columns).sort_values(ascending=False)
print(scores)

Логарифмическое преобразование признаков с асимметрией

Признаки с правосторонней асимметрией (доходы, количества, цены) часто работают лучше после логарифмического преобразования, которое сжимает длинный хвост и делает форму более симметричной.

Используйте np.log1p (логарифм от 1 + x), чтобы безопасно обрабатывать нулевые значения.

import numpy as np

df["income_log"] = np.log1p(df["income"])
print(df["income"].skew(), "->", df["income_log"].skew())

До и после: визуализация преобразования

Всегда проверяйте, помогло ли преобразование, строя графики до и после него. Логарифмическая версия должна быть ближе к симметричной колоколообразной форме.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 2)
df["income"].hist(ax=ax[0]); ax[0].set_title("Raw")
np.log1p(df["income"]).hist(ax=ax[1]); ax[1].set_title("log1p")
plt.show()

Быстрая проверка: исправление асимметрии признака

Признак имеет выраженную правостороннюю асимметрию и содержит несколько нулевых значений.

Итоги: анализ признаков и целевой переменной

Вы научились связывать признаки с целевой переменной прогнозирования:

  • Диаграммы рассеяния, графики KDE и диаграммы размаха для обнаружения связи признака с целевой переменной
  • value_counts(normalize=True) для обнаружения и количественной оценки дисбаланса классов
  • mutual_info_classif для ранжирования признаков по информативности, включая нелинейные связи
  • np.log1p для уменьшения правосторонней асимметрии признаков

На этом исследовательский анализ данных завершён. Далее: получение данных из веб-интерфейсов.

Часто задаваемые вопросы

Урок «Анализ распределения признаков и целевой переменной» бесплатный?

Да — полный текст урока «Анализ распределения признаков и целевой переменной» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Анализ распределения признаков и целевой переменной»?

Анализ связей между признаками и целевой переменной, обнаружение дисбаланса классов и взаимной информации. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Анализ распределения признаков и целевой переменной»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Рабочий процесс EDA и профилирование данных
  2. Одномерный анализ
  3. Двумерный и многомерный анализ
  4. Анализ распределения признаков и целевой переменной
← Назад к Learn AI with Python