Beregn KS-statistik med Python

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å

Metode 1 : Decilmetoden

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.

  1. 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.
  2. Opret deciler baseret på forudsagte sandsynlighedssøjler, hvilket betyder at opdele sandsynligheden i 10 dele. Første decil skal indeholde den højeste sandsynlighedsscore.
  3. Beregn den kumulative % af hændelser og ikke-hændelser i hver decil og beregn derefter forskellen mellem disse to kumulative fordelinger.
  4. KS er der, hvor forskellen er størst
  5. 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.

KS Python

Python : KS Statistics Decile Method

Import Data and Required Libraries

Jeg har forberedt en eksempeldata til eksempel. Datasættet indeholder to kolonner kaldet y og p.yer en afhængig variabel.phenviser til forudsagt sandsynlighed.

import pandas as pdimport numpy as npdf = pd.read_csv("https://raw.githubusercontent.com/deepanshu88/data/master/data.csv")
Python-funktion til KS-statistik
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)
Sådan bruges funktionen
mydf = ks(data=df,target="y", prob="p")
  1. data henviser til pandas dataframe, som indeholder både afhængige variable og sandsynlighedsscore.
  2. target henviser til kolonnens navn på den afhængige variabel
  3. prob henviser til kolonnens navn på den forudsagte sandsynlighed
Output

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
Metode 2 : KS Two Sample Test

Ved hjælp afscipypythonbibliotek 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)
Vigtig bemærkning

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.