single
Індекс стабільності популяції (PSI)
Свайпніть щоб показати меню
Population Stability Index (PSI) — це широко використовувана метрика для кількісної оцінки того, наскільки розподіл змінної змінився між двома вибірками — зазвичай базовою ("expected") та новою ("actual") популяцією. PSI часто застосовується у кредитному скорингу та моніторингу моделей для виявлення дрейфу ознак, який може вплинути на продуктивність моделі.
Як працює PSI
-
Бінування:
- Розділення значень ознаки в обох вибірках на дискретні інтервали (біни).
- Біни можуть визначатися за квантилями, однаковою шириною або на основі експертних знань.
- Завжди використовуйте однакові межі бінів для обох вибірок для коректного порівняння.
-
Порівняння:
- Для кожного біну обчислюється частка спостережень у базовій та новій вибірках.
- Для кожного біну розраховується:
(expected proportion - actual proportion) * ln(expected proportion / actual proportion)
-
Сумування:
- Сума результатів по всіх бінах дає загальний PSI для цієї ознаки.
Інтерпретація значень PSI
- PSI < 0.1: Відсутні суттєві зміни;
- PSI 0.1–0.25: Помірний дрейф;
- PSI > 0.25: Значний дрейф — можливо, потрібна перевірка або перенавчання моделі.
Використовуйте PSI для моніторингу ознак і швидкого виявлення змін у розподілі, які можуть вплинути на надійність вашої моделі.
1234567891011121314151617181920212223import numpy as np import pandas as pd def calculate_psi(expected, actual, bins=10): # Bin both distributions using the same bin edges bin_edges = np.histogram_bin_edges(np.concatenate([expected, actual]), bins=bins) expected_counts, _ = np.histogram(expected, bins=bin_edges) actual_counts, _ = np.histogram(actual, bins=bin_edges) # Convert counts to proportions, add small value to avoid division by zero expected_percents = expected_counts / len(expected) + 1e-8 actual_percents = actual_counts / len(actual) + 1e-8 # Calculate PSI for each bin psi_values = (expected_percents - actual_percents) * np.log(expected_percents / actual_percents) psi = np.sum(psi_values) return psi # Create synthetic data: expected (baseline) and actual (drifted) np.random.seed(0) expected_data = np.random.normal(loc=0, scale=1, size=1000) actual_data = np.random.normal(loc=0.5, scale=1.2, size=1000) psi_value = calculate_psi(expected_data, actual_data, bins=10) print("PSI for feature:", psi_value)
Можна розширити обчислення PSI на кілька ознак, розраховуючи PSI-значення для кожної ознаки окремо, порівнюючи їх розподіли між базовим і новим наборами даних. Це дозволяє відстежувати дрейф по всьому набору ознак. Після отримання PSI для всіх ознак їх можна інтерпретувати за встановленими порогами: ознаки з PSI вище 0.25 могли змінитися настільки, що це вплине на модель, а ті, що знаходяться між 0.1 і 0.25, слід контролювати на предмет помірного дрейфу. Ознаки зі значенням нижче 0.1 вважаються стабільними. Такий підхід допомагає швидко визначити, які частини вашого пайплайну даних можуть потребувати додаткового аналізу або оновлення моделі.
Проведіть, щоб почати кодувати
Вам надано дві вибірки числових ознак, що представляють референтний та новий датасет. Ваше завдання — обчислити Population Stability Index (PSI) для оцінки того, наскільки розподіл нових даних відрізняється від референтного.
Кроки:
- Створення рівновіддалених бінів (за замовчуванням 10).
- Обчислення пропорцій гістограми для кожного датасету за допомогою
np.histogram(..., density=True)або аналогічного методу. - Для кожного біну обчислити:
- Остаточний PSI — це сума всіх значень по бінах.
- Обробка крайових випадків, коли ймовірності дорівнюють нулю (використовуйте мале значення epsilon = 1e-6).
- Вивести як значення PSI по кожному біну, так і загальний PSI-складник.
Рішення
Дякуємо за ваш відгук!
single
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат