Kolmogorov-Smirnov-statistik (KS) er en af de vigtigste målinger, der bruges til validering af prædiktive modeller. Den er meget anvendt i BFSI-domænet. Hvis du er en del af et risiko- eller marketinganalyseteam, der arbejder på et projekt i banksektoren, må du have hørt om denne metrik.
Hvad er KS-statistik?
Det står for Kolmogorov-Smirnov, som er opkaldt efter Andrey Kolmogorov og Nikolai Smirnov. Den sammenligner de to kumulative fordelinger og returnerer den maksimale forskel mellem dem. Det er en ikke-parametrisk test, hvilket betyder, at du ikke behøver at teste nogen antagelse i forbindelse med datafordelingen. I KS-testen angiver nulhypotesen, at begge kumulative fordelinger er ens. Afvisning af nulhypotesen betyder, at de kumulative fordelinger er forskellige.
I datalogi sammenligner den den kumulative fordeling af hændelser og ikke-hændelser, og KS er, hvor der er en maksimal forskel mellem de to fordelinger. Med enkle ord hjælper det os med at forstå, hvor godt vores prædiktive model er i stand til at skelne mellem hændelser og ikke-hændelser.
Sæt, at du opbygger en tilbøjelighedsmodel, hvor målet er at identificere potentielle kunder, der sandsynligvis vil købe et bestemt produkt. I dette tilfælde er den afhængige (mål)variabel i binær form, som kun har to udfald: 0 (ikke-begivenhed) eller 1 (begivenhed). Ved “begivenhed” forstås personer, der har købt produktet. “Non-event” henviser til personer, der ikke har købt produktet. KS-statistikken måler, om modellen er i stand til at skelne mellem prospekter og ikke-prospekter.
To måder at måle KS-statistikken på
Denne metode er den mest almindelige måde at beregne KS-statistikken på til validering af binære prædiktive modeller. Se nedenstående trin.
- Du skal have to variabler, før du kan beregne KS. Den ene er den afhængige variabel, som skal være binær. Den anden er forudsagt sandsynlighedsscore, som er genereret fra statistisk model.
- Opret deciler baseret på forudsagte sandsynlighedssøjler, hvilket betyder at opdele sandsynligheden i 10 dele. Første decil skal indeholde den højeste sandsynlighedsscore.
- Beregn den kumulative % af hændelser og ikke-hændelser i hver decil og beregn derefter forskellen mellem disse to kumulative fordelinger.
- KS er der, hvor forskellen er størst
- Hvis KS er i de tre øverste deciler og scorer over 40, anses den for at være en god forudsigelsesmodel. Samtidig er det vigtigt at validere modellen ved også at kontrollere andre præstationsmetrikker for at bekræfte, at modellen ikke lider af et overtilpasningsproblem.
Python : KS Statistics Decile Method
Jeg har forberedt en eksempeldata til eksempel. Datasættet indeholder to kolonner kaldet y og p.y
er en afhængig variabel.p
henviser til forudsagt sandsynlighed.
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
henviser til pandas dataframe, som indeholder både afhængige variable og sandsynlighedsscore. -
target
henviser til kolonnens navn på den afhængige variabel -
prob
henviser til kolonnens navn på den forudsagte sandsynlighed
Den returnerer oplysninger om hver decil i tabelformat og udskriver også KS-score under tabellen. Den genererer også tabellen i et nyt dataframe.
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
Ved hjælp afscipy
pythonbibliotek kan vi beregne KS-statistik for to stikprøver. Den har to parametre – data1 og data2. I data1 indtaster vi alle de sandsynlighedsscorer, der svarer til ikke-events. I data2 vil den tage sandsynlighedsscorer mod begivenheder.
from scipy.stats import ks_2sampdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")ks_2samp(df.loc, df.loc)
Den returnerer KS-score 0,6033 og p-værdi mindre end 0,01, hvilket betyder, at vi kan forkaste nulhypotesen og konkludere, at fordelingen af begivenheder og ikke-begivenheder er forskellig.
OutputKs_2sampResult(statistic=0.6033333333333333, pvalue=1.1227180680661939e-29)
KS-score af metode 2 er lidt anderledes end metode 1, da den anden beregnes på række-niveau, og den første beregnes efter konvertering af data i ti dele.