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

Что такое метрика 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 ImportanceTree models0 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)
  • Идеальна для категорических признаков
Что такое метрика Information Value? | PrepBro