Calculate KS Statistic with Python

Statystyka Kołmogorowa-Smirnowa (KS) jest jedną z najważniejszych metryk używanych do walidacji modeli predykcyjnych. Jest ona szeroko stosowana w domenie BFSI. Jeśli jesteś częścią zespołu analityki ryzyka lub marketingu pracującego nad projektem w bankowości, na pewno słyszałeś o tej metryce.

Co to jest KS Statistics?

To skrót od Kolmogorov-Smirnov, który jest nazwany po Andrey Kolmogorov i Nikolai Smirnov. Porównuje ona dwa rozkłady kumulatywne i zwraca maksymalną różnicę między nimi. Jest to test nieparametryczny, co oznacza, że nie trzeba testować żadnych założeń związanych z rozkładem danych. W teście KS hipoteza zerowa stwierdza, że oba rozkłady skumulowane są podobne. Odrzucenie hipotezy zerowej oznacza, że rozkłady skumulowane są różne.

W data science, porównuje rozkłady skumulowane zdarzeń i nie-zdarzeń, a KS jest tam, gdzie jest maksymalna różnica między tymi dwoma rozkładami. W prostych słowach, pomaga nam to zrozumieć, jak dobrze nasz model predykcyjny jest w stanie odróżnić zdarzenia od nie-zdarzeń.

Załóżmy, że budujesz model skłonności, w którym celem jest zidentyfikowanie potencjalnych klientów, którzy prawdopodobnie kupią konkretny produkt. W tym przypadku zmienna zależna (docelowa) jest w formie binarnej, która ma tylko dwa wyniki: 0 (brak zdarzenia) lub 1 (zdarzenie). „Zdarzenie” oznacza osoby, które zakupiły produkt. „Nie-wydarzenie” odnosi się do osób, które nie kupiły produktu. Statystyka KS mierzy, czy model jest w stanie odróżnić prospektów od nieprospektów.

Dwa sposoby mierzenia statystyki KS

Metoda 1: Metoda Decyli

Ta metoda jest najczęstszym sposobem obliczania statystyki KS dla walidacji binarnego modelu predykcyjnego. Zobacz kroki poniżej.

  1. Musisz mieć dwie zmienne przed obliczeniem KS. Jedną z nich jest zmienna zależna, która powinna być binarna. Drugą jest wynik przewidywanego prawdopodobieństwa, który jest generowany z modelu statystycznego.
  2. Stwórz decyle w oparciu o kolumny przewidywanego prawdopodobieństwa, co oznacza podział prawdopodobieństwa na 10 części. Pierwszy decyl powinien zawierać najwyższy wynik prawdopodobieństwa.
  3. Oblicz skumulowany % zdarzeń i nie-zdarzeń w każdym decylu, a następnie oblicz różnicę między tymi dwoma skumulowanymi rozkładami.
  4. KS jest tam, gdzie różnica jest maksymalna
  5. Jeśli KS jest w górnym 3 decylu i wynik powyżej 40, jest uważany za dobry model predykcyjny. Jednocześnie ważne jest, aby zwalidować model poprzez sprawdzenie innych wskaźników wydajności, aby potwierdzić, że model nie cierpi na problem przepasowania.

KS Python

Python : KS Statistics Decile Method

Import danych i wymagane biblioteki

Przygotowałem przykładowe dane dla przykładu. Zbiór danych zawiera dwie kolumny o nazwach y i p.yjest zmienną zależną.podnosi się do przewidywanego prawdopodobieństwa.

import pandas as pdimport numpy as npdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")
Funkcja Pythona dla statystyki KS
def ks(data=None,target=None, prob=None): data = 1 - data data = pd.qcut(data, 10) grouped = data.groupby('bucket', as_index = False) kstable = pd.DataFrame() kstable = grouped.min() kstable = grouped.max() kstable = grouped.sum() kstable = grouped.sum() kstable = kstable.sort_values(by="min_prob", ascending=False).reset_index(drop = True) kstable = (kstable.events / data.sum()).apply('{0:.2%}'.format) kstable = (kstable.nonevents / data.sum()).apply('{0:.2%}'.format) kstable=(kstable.events / data.sum()).cumsum() kstable=(kstable.nonevents / data.sum()).cumsum() kstable = np.round(kstable-kstable, 3) * 100 #Formating kstable= kstable.apply('{0:.2%}'.format) kstable= kstable.apply('{0:.2%}'.format) kstable.index = range(1,11) kstable.index.rename('Decile', inplace=True) pd.set_option('display.max_columns', 9) print(kstable) #Display KS from colorama import Fore print(Fore.RED + "KS is " + str(max(kstable))+"%"+ " at decile " + str((kstable.index==max(kstable)]))) return(kstable)
Jak używać funkcji
mydf = ks(data=df,target="y", prob="p")
  1. data odnosi się do pandas dataframe, która zawiera zarówno zmienną zależną, jak i wyniki prawdopodobieństwa.
  2. target odnosi się do nazwy kolumny zmiennej zależnej
  3. prob odnosi się do nazwy kolumny przewidywanego prawdopodobieństwa
Wyjście

Zwraca informacje o każdym decylu w formacie tabelarycznym, a także drukuje wynik KS poniżej tabeli. Generuje również tabelę w nowej ramce danych.

 min_prob max_prob events nonevents event_rate nonevent_rate \Decile 1 0.298894 0.975404 49 51 49.00% 5.67% 2 0.135598 0.298687 19 81 19.00% 9.00% 3 0.082170 0.135089 14 86 14.00% 9.56% 4 0.050369 0.082003 10 90 10.00% 10.00% 5 0.029415 0.050337 5 95 5.00% 10.56% 6 0.018343 0.029384 1 99 1.00% 11.00% 7 0.011504 0.018291 1 99 1.00% 11.00% 8 0.006976 0.011364 1 99 1.00% 11.00% 9 0.002929 0.006964 0 100 0.00% 11.11% 10 0.000073 0.002918 0 100 0.00% 11.11% cum_eventrate cum_noneventrate KS Decile 1 49.00% 5.67% 43.3 2 68.00% 14.67% 53.3 3 82.00% 24.22% 57.8 4 92.00% 34.22% 57.8 5 97.00% 44.78% 52.2 6 98.00% 55.78% 42.2 7 99.00% 66.78% 32.2 8 100.00% 77.78% 22.2 9 100.00% 88.89% 11.1 10 100.00% 100.00% 0.0 KS is 57.8% at decile 3
Metoda 2 : KS Two Sample Test

Przez użyciescipybiblioteki Pythona, możemy obliczyć dwie próbki statystyki KS. Ma ona dwa parametry – dane1 i dane2. W data1, wprowadzimy wszystkie wyniki prawdopodobieństwa odpowiadające nie-zdarzeniom. W danych2, weźmiemy wyniki prawdopodobieństwa w stosunku do zdarzeń.

from scipy.stats import ks_2sampdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")ks_2samp(df.loc, df.loc)

Zwraca wynik KS 0.6033 i p-wartość mniejszą niż 0.01, co oznacza, że możemy odrzucić hipotezę zerową i stwierdzić, że dystrybucja zdarzeń i nie-zdarzeń jest różna.

OutputKs_2sampResult(statistic=0.6033333333333333, pvalue=1.1227180680661939e-29)
Ważna uwaga

Wynik KS dla metody 2 różni się nieco od metody 1, ponieważ druga jest obliczana na poziomie wiersza, a pierwsza jest obliczana po przekształceniu danych na dziesięć części.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.