← Назад к вопросам
Что такое метрика Information Value?
2.2 Middle🔥 112 комментариев
#Метрики и оценка моделей#Статистика и A/B тестирование
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Information Value (IV) — метрика значимости признака
Information Value — это метрика, которая оценивает способность признака разделять классы в бинарной классификации. Основана на информационной теории (Kullback-Leibler divergence).
Формула
IV = Σ (Distribution of Goods - Distribution of Bads) × ln(Distribution of Goods / Distribution of Bads)
Где:
- Distribution of Goods (% положительных образцов в бине)
- Distribution of Bads (% отрицательных образцов в бине)
- Summing по всем бинам (категориям признака)
Интерпретация
IV < 0.02 → Не имеет значения
IV 0.02-0.1 → Слабое значение
IV 0.1-0.3 → Среднее значение
IV > 0.3 → Сильное значение
IV > 0.5 → Подозрительно высокое (может быть data leakage)
Пример расчёта
import pandas as pd
import numpy as np
def calculate_iv(df, feature, target):
"""
Вычисляет Information Value для признака
df: DataFrame
feature: название столбца признака
target: название столбца целевой переменной (0/1)
"""
# Создаём таблицу
temp_df = pd.DataFrame({
'feature': df[feature],
'target': df[target]
})
# Для категорических признаков
if temp_df['feature'].dtype == 'object':
freq_table = temp_df.groupby('feature')['target'].agg(
['sum', 'count'] # sum(target) = goods, count - sum = bads
)
else:
# Для непрерывных: создаём бины (quintiles)
temp_df['bins'] = pd.qcut(temp_df['feature'],
q=5,
duplicates='drop')
freq_table = temp_df.groupby('bins')['target'].agg(
['sum', 'count']
)
freq_table.columns = ['goods', 'count']
freq_table['bads'] = freq_table['count'] - freq_table['goods']
# Вычисляем распределения
total_goods = freq_table['goods'].sum()
total_bads = freq_table['bads'].sum()
freq_table['goods_dist'] = freq_table['goods'] / total_goods
freq_table['bads_dist'] = freq_table['bads'] / total_bads
# IV
freq_table['woe'] = np.log(
freq_table['goods_dist'] / freq_table['bads_dist']
)
freq_table['iv'] = (
freq_table['goods_dist'] - freq_table['bads_dist']
) * freq_table['woe']
return freq_table, freq_table['iv'].sum()
# Пример
np.random.seed(42)
df = pd.DataFrame({
'age': np.random.randint(20, 80, 1000),
'income': np.random.choice(['Low', 'Medium', 'High'], 1000),
'loan_default': np.random.binomial(1, 0.1, 1000)
})
# Вычисляем IV
freq_age, iv_age = calculate_iv(df, 'age', 'loan_default')
print(f"\nAge IV: {iv_age:.4f}") # слабое значение
freq_income, iv_income = calculate_iv(df, 'income', 'loan_default')
print(f"Income IV: {iv_income:.4f}")
print("\nAge frequency table:")
print(freq_age)
Результат:
Age IV: 0.0342 → Слабое значение
Income IV: 0.1245 → Среднее значение
Связь с Weight of Evidence (WOE)
WOE = ln(Distribution of Goods / Distribution of Bads)
IV = Σ (Distribution of Goods - Distribution of Bads) × WOE
# WOE интерпретация
if woe > 0: # больше положительных в этом бине
print("Хороший предиктор положительного класса")
elif woe < 0: # больше отрицательных в этом бине
print("Хороший предиктор отрицательного класса")
else:
print("Нейтральный")
Практический пример: Credit Scoring
import pandas as pd
# Данные заемщиков
df = pd.DataFrame({
'age': [25, 35, 45, 55, 65, 25, 35, 45, 55, 65],
'income_bracket': ['Low', 'Low', 'Med', 'Med', 'High',
'Low', 'Med', 'High', 'High', 'High'],
'default': [1, 1, 0, 0, 0, 1, 0, 0, 0, 0]
})
# IV для income_bracket
temp = df.groupby('income_bracket')['default'].agg(
['sum', 'count']
)
temp.columns = ['goods', 'total']
temp['bads'] = temp['total'] - temp['goods']
temp['goods_dist'] = temp['goods'] / temp['goods'].sum()
temp['bads_dist'] = temp['bads'] / temp['bads'].sum()
temp['woe'] = np.log(temp['goods_dist'] / temp['bads_dist'])
temp['iv'] = (temp['goods_dist'] - temp['bads_dist']) * temp['woe']
iv_total = temp['iv'].sum()
print(f"Income Bracket IV: {iv_total:.4f}")
print("\nTable:")
print(temp)
# Результат:
# goods total bads goods_dist bads_dist woe iv
# Low 2 4 2 0.666667 0.666667 0.000000 0.000000
# Med 1 3 2 0.333333 0.666667 -0.693147 0.111325
# High 0 3 3 0.000000 1.000000 -inf inf
Использование IV для feature selection
def calculate_iv_for_all_features(df, target_col):
"""
Вычисляет IV для всех признаков
"""
iv_dict = {}
for col in df.columns:
if col == target_col:
continue
try:
_, iv = calculate_iv(df, col, target_col)
iv_dict[col] = iv
except:
iv_dict[col] = 0
# Сортируем по IV
return sorted(iv_dict.items(), key=lambda x: x[1], reverse=True)
# Используем
iv_scores = calculate_iv_for_all_features(df, 'loan_default')
print("Feature Importance by IV:")
for feature, iv in iv_scores:
print(f"{feature:20s}: {iv:.4f}")
# Селектим признаки с IV > 0.1
selected_features = [f for f, iv in iv_scores if iv > 0.1]
print(f"\nSelected features: {selected_features}")
IV vs другие метрики
| Метрика | Use Case | Интерпретация |
|---|---|---|
| IV | Категорические признаки | Выше = более важен |
| Correlation | Линейная связь | -1 to 1 |
| Feature Importance | Tree models | 0 to 1 (relative) |
| Cramér's V | Категорический связь | 0 to 1 |
Когда использовать IV
# ✓ Хорошо для:
# 1. Credit scoring и risk models
risk_model = LogisticRegression()
selected_cols = [f for f, iv in iv_scores if iv > 0.05]
risk_model.fit(df[selected_cols], df['default'])
# 2. Feature selection в бинарной классификации
best_features = [f for f, iv in iv_scores if iv > 0.1]
# 3. Интерпретируемость (WOE легче объяснить)
# ✗ Плохо для:
# 1. Много классов (multiclass)
# 2. Регрессия
# 3. Уже нормализованные признаки
Потенциальные проблемы
# 1. Data leakage: очень высокий IV (> 0.5)
# Может быть информация из будущего
# 2. Редкие категории
# IV может быть искажен экстремальными значениями
# 3. Зависимость от binning
# Для непрерывных признаков результат зависит от binning метода
# Решение: используй несколько методов binning
Резюме
Information Value:
- Оценивает способность признака разделять классы
- Основана на Kullback-Leibler divergence
- IV > 0.3 — сильное значение
- Часто используется в credit scoring
- Связана с Weight of Evidence (WOE)
- Идеальна для категорических признаков