← Назад к вопросам

Что показывает критерий информативности?

2.0 Middle🔥 122 комментариев
#Машинное обучение

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Критерий информативности: глубокий разбор

Это фундаментальное понятие в ML и информационной теории. Объясню с нуля.

Определение

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

Другими словами: какое количество информации о целевой переменной содержит этот признак?

Главная идея: Энтропия

Центральная концепция - энтропия (мера неопределённости).

Без информации (классы равномерны):
- 50% класс A, 50% класс B
- Энтропия = максимальная (1.0)
- Неуверенность максимальна

С информацией (классы разделены):
- 95% класс A, 5% класс B
- Энтропия = минимальная (близко к 0)
- Мы знаем, что вероятнее всего класс A

Формула энтропии:

H = -Σ(p_i * log2(p_i))

где p_i = доля класса i

Пример:

До разделения признаком:
- Класс 1: 50%, Класс 2: 50%
- H = -(0.5*log2(0.5) + 0.5*log2(0.5)) = 1.0

После разделения признаком (например, age > 30):
- Левая часть: 90% Класс 1, 10% Класс 2 → H = 0.47
- Правая часть: 10% Класс 1, 90% Класс 2 → H = 0.47

Информационный выигрыш = 1.0 - (средняя энтропия) = большой!
Этот признак информативен.

Меры информативности

1. Information Gain (Информационный выигрыш)

Используется в деревьях решений.

IG = H(parent) - weighted_average(H(children))

Что показывает: на сколько снижается неопределённость после разделения по этому признаку?

Пример в коде:

from sklearn.tree import DecisionTreeClassifier
import numpy as np

X = np.array([[30, 1], [25, 1], [45, 0], [50, 0]])
y = np.array([1, 1, 0, 0])

dt = DecisionTreeClassifier(max_depth=1)
dt.fit(X, y)

# feature_importances_ показывает информационный выигрыш
print(dt.feature_importances_)  
# [0.7, 0.3] - первый признак важнее

2. Gain Ratio (Коэффициент выигрыша)

Учитывает количество разделений (intrinsic value).

Проблема Information Gain: признак с 100 уникальными значениями всегда выигрывает (переобучение).

Решение: разделить на intrinsic value.

Gain Ratio = IG / split_info

3. Gini Impurity (Примесь Джини)

Используется в CART (другой тип деревьев).

Gini = 1 - Σ(p_i)²

Примеры:

- Чистый класс (100% одного) → Gini = 0 (идеально)
- Смешанный (50/50) → Gini = 0.5 (максимально плохо)

4. Chi-Square для категориальных признаков

Проверяет, есть ли статистическая зависимость между признаком и классом.

from sklearn.feature_selection import chi2
from sklearn.preprocessing import LabelEncoder

X = ...  # категориальные признаки
y = ...  # целевая переменная

chi2_scores, p_values = chi2(X, y)

for i, (score, p_val) in enumerate(zip(chi2_scores, p_values)):
    if p_val < 0.05:  # статистически значимо
        print(f"Признак {i} информативен (p={p_val:.3f})")

5. Mutual Information (Взаимная информация)

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

MI(X, Y) = H(X) + H(Y) - H(X, Y)

Если X и Y независимы → MI = 0 Если X и Y идентичны → MI = H(X)

6. Корреляция (для численных признаков)

Пирсонова корреляция показывает линейную зависимость.

import pandas as pd

df = pd.DataFrame({
    'age': [25, 30, 35, 40],
    'purchased': [0, 0, 1, 1]
})

corr = df['age'].corr(df['purchased'])
print(f"Корреляция: {corr:.2f}")  # близко к 1 = информативна

Практический пример: Выбор признаков

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder

# Данные: предсказываем покупку
df = pd.DataFrame({
    'age': [25, 30, 35, 40, 28, 32],
    'income': [30000, 50000, 80000, 100000, 45000, 75000],
    'color_preference': ['red', 'blue', 'red', 'blue', 'red', 'blue'],
    'shoe_size': [42, 43, 44, 45, 42, 43],
    'purchased': [0, 0, 1, 1, 0, 1]
})

# Random Forest даёт feature importance
rf = RandomForestClassifier(n_estimators=100)
rf.fit(df[['age', 'income', 'shoe_size']], df['purchased'])

print("Feature Importance:")
for feat, imp in zip(['age', 'income', 'shoe_size'], rf.feature_importances_):
    print(f"{feat}: {imp:.3f}")

# Результат:
# age: 0.400
# income: 0.500  <- самый информативный
# shoe_size: 0.100  <- почти нет информации

# Вывод: shoe_size можно удалить

Интерпретация

Высокая информативность признака означает:

  1. Признак сильно коррелирует с целевой переменной
  2. Признак разделяет классы хорошо
  3. Удаление этого признака значительно ухудшит модель
  4. Этот признак должен быть в финальной модели

Низкая информативность означает:

  1. Признак почти не влияет на целевую переменную
  2. Удаление этого признака не повлияет на качество
  3. Признак может быть шумом
  4. Лучше удалить для уменьшения переобучения

Почему это важно?

1. Feature Selection (выбор признаков)

Не все признаки одинаково полезны. Удаление неинформативных признаков:

  • Улучшает обобщаемость модели (меньше переобучение)
  • Снижает размерность (быстрее обучение)
  • Упрощает интерпретируемость

2. Understanding Data

Высокая информативность признака - это сигнал:

  • "Этот признак действительно влияет на результат"
  • "Нам стоит его лучше понимать"

3. Model Selection

Если информативные признаки очень немного:

  • Может быть, это очень сложная задача
  • Нужны новые признаки (feature engineering)
  • Может быть, задача нерешаема

Практический совет

В своей практике я использую эту иерархию:

  1. Для деревьев → Information Gain / Gini

    • Встроено в sklearn
    • Автоматически используется при обучении
  2. Для линейных моделей → Корреляция

    • Быстро вычислить
    • Хорошо интерпретировать
  3. Для категориальных признаков → Chi-Square

    • Статистически обоснованно
    • Работает для категорий
  4. Для сложных зависимостей → Mutual Information

    • Ловит нелинейные связи
    • Дороже вычислительно

Заключение

Критерий информативности - это инструмент для понимания, какие признаки действительно помогают предсказывать целевую переменную. Высокая информативность = высокий потенциал улучшить модель. Низкая информативность = шум, лучше удалить.