Použití z-skóre pro detekci anomálií

Detekce anomálií v Pythonu

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

Co jsou z-skóre?

  • Z-skóre udává:
    • počet STD od průměru

Příklad:

  • V rozdělení s $\mu=10$ a $\sigma=3$:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

Vzorec pro výpočet z-skóre.

Detekce anomálií v Pythonu

Empirické pravidlo a odlehlé hodnoty

Empirické pravidlo:

  • 68 % leží v jednom STD
  • 95 % leží ve dvou STD
  • 99,7 % leží ve třech STD

Odlehlé hodnoty:

  • mimo hranici tří STD
  • nacházejí se v chvostech (růžové oblasti)

Obrázek empirického pravidla z Wikipedie zobrazující normální rozdělení s vyznačenými oblastmi 68 %, 95 % a 99,7 %.

1 Obrázek ze stránky Empirical Rule na Wikipedii
Detekce anomálií v Pythonu

Z-skóre v kódu

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
Detekce anomálií v Pythonu

Z-skóre v kódu

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Detekce anomálií v Pythonu

Z-skóre v kódu

outliers = sales[is_over_3]

print(len(outliers))
90
Detekce anomálií v Pythonu

Nevýhody z-skóre

  • Funguje nejlépe s normálně rozloženými daty
  • Průměr a STD jsou silně ovlivněny odlehlými hodnotami
  • Výkon klesá při příliš mnoha odlehlých hodnotách
Detekce anomálií v Pythonu

Mediánová absolutní odchylka (MAD)

  • Měří rozptyl (variabilitu)
  • Odolnější vůči odlehlým hodnotám
  • Základem je medián

Vzorec pro výpočet skóre mediánové absolutní odchylky.

Detekce anomálií v Pythonu

Skóre MAD

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Detekce anomálií v Pythonu

Úvod do PyOD

  • Modifikovaná z-skóre s MAD jsou implementována v PyOD
  • PyOD – knihovna pro detekci odlehlých hodnot v Pythonu:
    • nabízí více než 40 algoritmů
    • všechny algoritmy mají syntaxi podobnou sklearn
Detekce anomálií v Pythonu

Modifikovaná z-skóre v kódu

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)
Detekce anomálií v Pythonu

Modifikovaná z-skóre v kódu

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Detekce anomálií v Pythonu

Pojďme cvičit!

Detekce anomálií v Pythonu

Preparing Video For Download...