Tage nehmen Menschen mehr Kredite als je zuvor. Für alle, die sein eigenes Haus bauen möchten, sind Wohnheimdarlehen verfügbar und wenn Sie eine Immobilie besitzen, erhalten Sie einen Immobilienkredit. Es gibt auch Landwirtschaftskredite, Bildungsdarlehen, Wirtschaftskredite, Goldkredite und viele mehr.
Zusätzlich zu diesen haben wir zum Kauf von Artikeln wie Fernsehern, Kühlschränken, Möbeln und Mobiltelefonen auch EMI -Optionen.
Aber erhält jeder seinen Kreditantrag genehmigt?
Banken geben nicht jeder Particular person Kredite, die sich bewerben. Es gibt einen Prozess, den sie verfolgen, um Kredite zu genehmigen.
Wir wissen, dass maschinelles Lernen und Datenwissenschaft jetzt in Branchen angewendet werden, und Banken nutzen sie ebenfalls.
Wenn ein Kunde ein Darlehen beantragt, müssen die Banken die Wahrscheinlichkeit, dass der Kunde pünktlich zurückzahlt, wissen.
Zu diesem Zweck verwenden Banken Vorhersagemodelle, die hauptsächlich auf logistischer Regression oder anderen Methoden für maschinelles Lernen basieren.
Wir wissen bereits, dass jeder Antragsteller durch die Anwendung dieser Methoden eine Wahrscheinlichkeit zugewiesen wird.
Dies ist ein Klassifizierungsmodell, und wir müssen Müllfrüchte und Nichtaussetzer klassifizieren.
Defaulter: Kunden, die ihr Darlehen nicht zurückzahlen (Misszahlungen verpassen oder nicht mehr insgesamt zahlen).
Nicht-Defauters: Kunden, die ihre Kredite pünktlich zurückzahlen.
Wir sind schon Diskussion Genauigkeit und ROC-auc Bewertung der Klassifizierungsmodelle.
In diesem Artikel werden wir die diskutieren Kolmogorov-Smirnov-Statistik (KS-Statistik) Dies wird verwendet, um Klassifizierungsmodelle insbesondere im Bankensektor zu bewerten.
Um die KS -Statistik zu verstehen, werden wir den deutschen Kreditdatensatz verwenden.
Dieser Datensatz enthält Informationen zu 1000 Kreditantragstellern, die 20 Funktionen beschreiben, wie z. B. Kontostatus, Darlehensdauer, Kreditbetrag, Beschäftigung, Wohnungsbau und persönlichen Standing usw.
Die Zielvariable gibt an, ob der Antragsteller nicht steigende (dargestellt durch 1) oder Defaulter (dargestellt durch 2).
Sie finden die Informationen zum Datensatz Hier.
Jetzt müssen wir ein Klassifizierungsmodell erstellen, um die Bewerber zu klassifizieren. Da es sich um ein Binärklassifizierungsproblem handelt, werden wir auf diesem Datensatz eine logistische Regression anwenden.
Code:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# Load dataset
file_path = "C:/german.information"
information = pd.read_csv(file_path, sep=" ", header=None)
# Rename columns
columns = (f"col_{i}" for i in vary(1, 21)) + ("goal")
information.columns = columns
# Options and goal
X = pd.get_dummies(information.drop(columns=("goal")), drop_first=True)
y = information("goal") # preserve as 1 and a couple of
# Prepare-test cut up
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# Prepare logistic regression
mannequin = LogisticRegression(max_iter=10000)
mannequin.match(X_train, y_train)
# Predicted possibilities
y_pred_proba = mannequin.predict_proba(X_test)
# Outcomes DataFrame
outcomes = pd.DataFrame({
"Precise": y_test.values,
"Pred_Prob_Class2": y_pred_proba(:, 1)
})
print(outcomes.head())
Wir wissen bereits, dass wir, wenn wir eine logistische Regression anwenden, vorhergesagte Wahrscheinlichkeiten erhalten.

Um zu verstehen, wie die KS -Statistik berechnet wird, betrachten wir eine Stichprobe von 10 Punkten aus dieser Ausgabe.

Hier beträgt die höchste vorhergesagte Wahrscheinlichkeit 0,92, was bedeutet, dass dieser Antragsteller zu 92% besteht, dass dieser Antragsteller in Verzug gerät.
Lassen Sie uns nun mit der kS -Statistikberechnung fortfahren.
Erstens werden wir die Antragsteller nach ihren vorhergesagten Wahrscheinlichkeiten in absteigender Reihenfolge sortieren, so dass Antragsteller mit höherem Risiko oben stehen.

Wir wissen bereits, dass ‚1‘ Nicht-Auslöser und ‚2‘ ausfault.
Im nächsten Schritt berechnen wir bei jedem Schritt die kumulative Anzahl von Nicht-Auslösten und Ausfassungen.

Im nächsten Schritt wandeln wir die kumulativen Zahlen von Ausfassungen und Nicht-Auslösten in kumulative Raten um.
Wir teilen die kumulativen Ausfassungen durch die Gesamtzahl der Ausfassungen und die kumulativen Nicht-Auslöser durch die Gesamtzahl der Nicht-Auslöser.

Als nächstes berechnen wir die absolute Differenz zwischen der kumulativen Ausfassungsrate und der kumulativen Nicht-Defaulter-Price.

Die maximale Differenz zwischen der kumulativen Ausfaltungsrate und der kumulativen Nicht-Defaulter-Price beträgt 0,83, was die KS-Statistik für diese Stichprobe ist.
Hier beträgt die KS -Statistik 0,83 und trat mit einer Wahrscheinlichkeit von 0,29 auf.
Dies bedeutet, dass das Modell bei diesem Schwellenwert 83% effektiver als Nicht-Aussagen erfasst.
Hier können wir das beobachten:
Kumulative Ausfassungsrate = wahre constructive Price (wie viele tatsächliche Ausfassungen haben wir bisher erfasst).
Kumulative Nicht-Defaulter-Price = falsch constructive Price (wie viele Nicht-Auslöser werden fälschlicherweise als Säumigen erfasst).
Aber wie können wir hier keinen Schwellenwert behoben haben, wie wir echte constructive und falsch constructive Raten erzielen können?
Mal sehen, wie kumulative Raten TPR und FPR gleich sind.
Erstens betrachten wir jede Wahrscheinlichkeit als Schwellenwert und berechnen TPR und FPR.
(
start {ausgerichtet}
mathbf {at threshold 0.92:} & (4pt)
Tp & = 1, quad fn = 3, quad fp = 0, quad tn = 6 (6pt)
TPR & = TFRAC {1} {4} = 0,25 (6PT)
Fpr & = tfrac {0} {6} = 0 (6pt)
RightArrow ( mathhrm {fpr}, , mathrm {tpr}) & = (0, , 0,25)
finish {ausgerichtet}
)
(
start {ausgerichtet}
mathbf {at threshold 0.63:} & (4pt)
Tp & = 2, quad fn = 2, quad fp = 0, quad tn = 6 (6pt)
TPR & = TFRAC {2} {4} = 0,50 (6PT)
Fpr & = tfrac {0} {6} = 0 (6pt)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (0, , 0,50)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.51:} & (4pt)
Tp & = 3, quad fn = 1, quad fp = 0, quad tn = 6 (6pt)
TPR & = TFRAC {3} {4} = 0,75 (6PT)
Fpr & = tfrac {0} {6} = 0 (6pt)
RightArrow ( mathhrm {fpr}, , mathrm {tpr}) & = (0, , 0,75)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.39:} & (4pt)
Tp & = 3, quad fn = 1, quad fp = 1, quad tn = 5 (6pt)
TPR & = TFRAC {3} {4} = 0,75 (6PT)
Fpr & = tfrac {1} {6} ca. 0,17 (6PT)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (0.17, , 0,75)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.29:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 1, quad tn = 5 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {1} {6} ca. 0,17 (6PT)
Rightarrow ( mathhrm {fpr}, , mathrm {tpr}) & = (0.17, , 1,00)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.20:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 2, quad tn = 4 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {2} {6} ca. 0,33 (6PT)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (0,33, , 1,00)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.13:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 3, quad tn = 3 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {3} {6} = 0,50 (6PT)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (0,50, , 1,00)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.10:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 4, quad tn = 2 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {4} {6} ca. 0,67 (6PT)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (0.67, , 1,00)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.05:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 5, quad tn = 1 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {5} {6} ca. 0,83 (6PT)
Rightarrow ( mathhrm {fpr}, , mathrm {tpr}) & = (0,83, , 1,00)
finish {ausgerichtet}
) (
start {ausgerichtet}
mathbf {at threshold 0.01:} & (4pt)
Tp & = 4, quad fn = 0, quad fp = 6, quad tn = 0 (6pt)
TPR & = TFRAC {4} {4} = 1.00 (6PT)
Fpr & = tfrac {6} {6} = 1.00 (6PT)
Rightarrow ( mathhrm {fpr}, , mathhrm {tpr}) & = (1.00, , 1.00)
finish {ausgerichtet}
)
Aus den obigen Berechnungen können wir sehen, dass die kumulative Ausfaltungsrate der wahren positiven Price (TPR) entspricht, und die kumulative Nicht-Ausladungsrate entspricht der falsch positiven Price (FPR).
Bei der Berechnung der kumulativen Ausfallrate und der kumulativen Nicht-Default-Price stellt jede Zeile einen Schwellenwert dar und die Price wird bis zu dieser Zeile berechnet.
Hier können wir beobachten, dass KS statistic = max (| tpr – fpr |)
Berechnen wir nun die KS -Statistik für den vollständigen Datensatz.
Code:
# Create DataFrame with precise and predicted probs
outcomes = pd.DataFrame({
"Precise": y.values,
"Pred_Prob_Class2": y_pred_proba
})
# Mark defaulters (2) and non-defaulters (1)
outcomes("is_defaulter") = (outcomes("Precise") == 2).astype(int)
outcomes("is_nondefaulter") = 1 - outcomes("is_defaulter")
# Type by predicted likelihood
outcomes = outcomes.sort_values("Pred_Prob_Class2", ascending=False).reset_index(drop=True)
# Totals
total_defaulters = outcomes("is_defaulter").sum()
total_nondefaulters = outcomes("is_nondefaulter").sum()
# Cumulative counts and charges
outcomes("cum_defaulters") = outcomes("is_defaulter").cumsum()
outcomes("cum_nondefaulters") = outcomes("is_nondefaulter").cumsum()
outcomes("cum_def_rate") = outcomes("cum_defaulters") / total_defaulters
outcomes("cum_nondef_rate") = outcomes("cum_nondefaulters") / total_nondefaulters
# KS statistic
outcomes("KS") = (outcomes("cum_def_rate") - outcomes("cum_nondef_rate")).abs()
ks_value = outcomes("KS").max()
ks_index = outcomes("KS").idxmax()
print(f"KS Statistic = {ks_value:.3f} at likelihood {outcomes.loc(ks_index, 'Pred_Prob_Class2'):.4f}")
# Plot KS curve
plt.determine(figsize=(8,6))
plt.plot(outcomes.index, outcomes("cum_def_rate"), label="Cumulative Defaulter Price (TPR)", coloration="crimson")
plt.plot(outcomes.index, outcomes("cum_nondef_rate"), label="Cumulative Non-Defaulter Price (FPR)", coloration="blue")
# Spotlight KS level
plt.vlines(x=ks_index,
ymin=outcomes.loc(ks_index, "cum_nondef_rate"),
ymax=outcomes.loc(ks_index, "cum_def_rate"),
colours="inexperienced", linestyles="--", label=f"KS = {ks_value:.3f}")
plt.xlabel("Candidates (sorted by predicted likelihood)")
plt.ylabel("Cumulative Price")
plt.title("Kolmogorov–Smirnov (KS) Curve")
plt.legend(loc="decrease proper")
plt.grid(True)
plt.present()
Handlung:

Die maximale Lücke beträgt 0,530 bei Wahrscheinlichkeit von 0,2928.
Da wir verstanden haben, wie die KS -Statistik berechnet werden kann, diskutieren wir die Bedeutung dieser Statistik.
Hier haben wir ein Klassifizierungsmodell erstellt und es mithilfe der KS-Statistik bewertet, aber auch andere Klassifizierungsmetriken wie Genauigkeit, ROC-AuC usw.
Wir wissen bereits, dass Genauigkeit für einen Schwellenwert spezifisch ist und sich je nach Schwelle ändert.
ROC-AuC gibt uns eine Zahl, die die Gesamt-Rating-Fähigkeit des Modells zeigt.
Aber warum wird die KS -Statistik in Banken verwendet?
Die KS-Statistik gibt eine einzige Zahl an, die die maximale Lücke zwischen den kumulativen Verteilungen von Ausfassungen und Nicht-Trennungen darstellt.
Kehren wir zu unseren Beispieldaten zurück.
Wir haben KS -Statistik 0,83 mit einer Wahrscheinlichkeit von 0,29 erhalten.
Wir haben bereits besprochen, dass jede Zeile als Schwelle fungiert.
Additionally, was ist mit 0,29 passiert?
Schwellenwert = 0,29 bedeutet, dass die Wahrscheinlichkeiten größer oder gleich 0,29 sind, die als Säumigen gekennzeichnet sind.
Bei 0,29 markierten die Prime 5 Zeilen als Säumige. Unter diesen fünf sind vier tatsächliche Ausgelöste und einer wird nicht fälschlicherweise als Defaulter vorhergesagt.
Hier wahre constructive = 4 und falsch positiv = 1.
Die verbleibenden 5 Zeilen werden als Nicht-Aussagen vorhergesagt.
Zu diesem Zeitpunkt hat das Modell alle vier Ausfassungen und einen Nicht-Defaulter fälschlicherweise als Defaulter festgehalten.
Hier ist TPR bei 1 maximiert und FPR beträgt 0,17.
KS-Statistik = 1-0,17 = 0,83.
Wenn wir weiter gehen und für andere Wahrscheinlichkeiten berechnen, wie wir es zuvor getan haben, können wir feststellen, dass es keine Änderung der TPR geben wird, aber die FPR erhöht wird, was dazu führt, dass mehr Nicht-Auslöser als Ausfalter kennzeichnet.
Dies verringert die Lücke zwischen zwei Gruppen.
Hier können wir sagen, dass das Modell mit 0,29 allen Sumbaultern und 17% der Nicht-Auslöser (nach Stichprobendaten) verweigerte und 83% der Ausfassungen genehmigte.
Entscheiden Banken die Schwelle auf der Grundlage der KS -Statistik?
Während die KS -Statistik die maximale Lücke zwischen zwei Gruppen zeigt, entscheiden Banken nicht auf dieser Statistik einen Schwellenwert.
Die KS -Statistik wird verwendet, um die Modellstärke zu validieren, während die tatsächliche Schwelle durch Berücksichtigung von Risiken, Rentabilität und regulatorischen Richtlinien entschieden wird.
Wenn KS unter 20 liegt, gilt es als schwaches Modell.
Wenn es zwischen 20 und 40 liegt, wird es als akzeptabel angesehen.
Wenn KS im Bereich von 50-70 liegt, gilt es als gutes Modell.
Datensatz
Der in diesem Weblog verwendete Datensatz ist der Deutscher Kreditdatensatzdas öffentlich im UCI -Repository für maschinelles Lernen verfügbar ist. Es wird unter dem bereitgestellt Artistic Commons Attribution 4.0 Worldwide (CC nach 4.0) Lizenz. Dies bedeutet, dass es frei verwendet und mit ordnungsgemäßer Zuordnung geteilt werden kann.
Ich hoffe, dieser Weblog -Beitrag hat Ihnen ein grundlegendes Verständnis der Kolmogorov -Smirnov -Statistik vermittelt. Wenn Sie gerne lesen, sollten Sie es mit Ihrem Netzwerk teilen und Ihre Gedanken teilen.
Wenn Sie meinen Weblog noch nicht auf ROC gelesen haben – auc, können Sie es überprüfen Hier.
Danke fürs Lesen!
