Використання z-оцінок для виявлення аномалій

Виявлення аномалій у Python

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

Що таке z-оцінки?

  • Z-оцінки показують:
    • на скільки СКВ відхиляється від середнього

Приклад:

  • У розподілі з $\mu=10$ та $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

Формула обчислення z-оцінок.

Виявлення аномалій у Python

Емпіричне правило та викиди

Емпіричне правило:

  • 68% — у межах однієї СКВ
  • 95% — у межах двох СКВ
  • 99,7% — у межах трьох СКВ

Викиди:

  • за межами трьох СКВ
  • лежать у хвостах (рожеві ділянки з боків)

Зображення емпіричного правила з Вікіпедії: нормальний розподіл із позначеними частками 68%, 95% і 99,7%.

1 Зображення зі сторінки Empirical Rule у Вікіпедії
Виявлення аномалій у Python

Z-оцінки в коді

from scipy.stats import zscore


scores = zscore(sales) scores[:5]
0    0.910601
1   -1.018440
2   -0.049238
3    0.849103
4   -0.695373
Виявлення аномалій у Python

Z-оцінки в коді

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Виявлення аномалій у Python

Z-оцінки в коді

outliers = sales[is_over_3]

print(len(outliers))
90
Виявлення аномалій у Python

Недоліки z-оцінок

  • Найкраще працює для нормально розподілених даних
  • Середнє та СКВ сильно чутливі до викидів
  • За надто багатьох викидів точність падає
Виявлення аномалій у Python

Median Absolute Deviation (MAD)

  • Вимірює розкид (варіабельність)
  • Стійкіший до викидів
  • Базується на медіані

Формула для обчислення Median Absolute Deviation.

Виявлення аномалій у Python

Оцінка MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Виявлення аномалій у Python

Вступ до PyOD

  • Модифіковані z-оцінки з MAD реалізовано в PyOD
  • PyOD — бібліотека Python для виявлення викидів:
    • понад 40 алгоритмів
    • синтаксис у стилі sklearn для всіх алгоритмів
Виявлення аномалій у Python

Модифіковані z-оцінки в коді

from pyod.models.mad import MAD

# threshold defaults to 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Виявлення аномалій у Python

Модифіковані z-оцінки в коді

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Виявлення аномалій у Python

Давайте потренуємось!

Виявлення аномалій у Python

Preparing Video For Download...