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

«Что показывает критерий информативности (Information Gain)?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Information Gain (IG, прирост информации) — это мера, используемая при построении деревьев решений (например, в алгоритмах ID3, C4.5). Она показывает, насколько эффективно тот или иной признак разделяет данные по целевым классам.

Суть: IG измеряет уменьшение энтропии (или неопределенности) в системе после того, как мы разделили набор данных по значениям данного признака. IG(T, a) = Entropy(T) - Σ_{v in Values(a)} (|T_v| / |T|) * Entropy(T_v) Где:

  • T — исходный набор данных.
  • a — признак, по которому происходит разбиение.
  • T_v — подмножество данных, где признак a имеет значение v.
  • Entropy(T) = - Σ_{c in Classes} p(c) * log2(p(c)) — мера неупорядоченности.

Интерпретация: Чем выше значение IG для признака, тем больше "информации" он дает для классификации, и тем выше он должен быть в дереве для оптимального разбиения.

Практический пример с scikit-learn: В DecisionTreeClassifier с критерием criterion='entropy' на каждом шаге выбирается признак с максимальным IG.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

# Загрузка данных
iris = load_iris()
X, y = iris.data, iris.target

# Обучение дерева с использованием энтропии (и, следовательно, IG)
clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=42)
clf.fit(X, y)

# Важность признаков (в данном контексте — усредненный IG по всем разбиениям)
print("Важность признаков (на основе IG):")
for name, importance in zip(iris.feature_names, clf.feature_importances_):
    print(f"  {name}: {importance:.3f}")

# Визуализация дерева (можно увидеть, по какому признаку и значению происходит первое разбиение)
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

Визуализация дерева наглядно покажет, что корневой узел (первое разбиение) соответствует признаку с наибольшим IG.