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
Ta metoda jest najczęstszym sposobem obliczania statystyki KS dla walidacji binarnego modelu predykcyjnego. Zobacz kroki poniżej.
- 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.
- 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.
- Oblicz skumulowany % zdarzeń i nie-zdarzeń w każdym decylu, a następnie oblicz różnicę między tymi dwoma skumulowanymi rozkładami.
- KS jest tam, gdzie różnica jest maksymalna
- 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.
Python : KS Statistics Decile Method
Przygotowałem przykładowe dane dla przykładu. Zbiór danych zawiera dwie kolumny o nazwach y i p.y
jest zmienną zależną.p
odnosi się do przewidywanego prawdopodobieństwa.
import pandas as pdimport numpy as npdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")
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)
mydf = ks(data=df,target="y", prob="p")
-
data
odnosi się do pandas dataframe, która zawiera zarówno zmienną zależną, jak i wyniki prawdopodobieństwa. -
target
odnosi się do nazwy kolumny zmiennej zależnej -
prob
odnosi się do nazwy kolumny przewidywanego prawdopodobieństwa
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
Przez użyciescipy
biblioteki 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)
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.