Kreditscoring, Teil 2

Im ersten Teil meines Blogs zum Thema Kreditscoring wurde für die Klassifizierung von Kunden die logistische Regression genutzt. Die Optimierung des Modells erfolgte mittels Rückwärtselimination. Im zweiten Teil werden nun die Kunden mit Hilfe des binären Entscheidungsbaums klassifiziert.

 

Was versteht man unter einem binären Entscheidungsbaum?

Die o. a. Abbildung zeigt ein mögliches Ergebnis für einen Entscheidungsbaum. Dieser besteht aus Knoten und Pfaden. Ein dreißigjähriger Eigenheimbesitzer würde z. B. dem roten Pfad im Entscheidungsbaum folgen. Der rote Pfad endet mit der Entscheidung Default und führt damit zur Ablehnung des Kredits. Der Entscheidungsbaum zeigt anschaulich, wie man zu dieser Entscheidung kommt - daher auch der Name.

Wie erstellt man einen Entscheidungsbaum?

Betrachten wir zu diesem Zweck unsere Trainingsdaten:


Die Tabelle enthält sowohl metrische (Kreditbetrag, Einkommen und Alter) als auch kategoriale Merkmale (Scoreklasse, Wohnen, Jobdauer und Zins).

Bei einem binären Entscheidungsbaum wird jedes Merkmal in zwei Gruppen geteilt. Dies erfolgt bei metrischen Daten auf Basis eines Trennwertes. Alle Werte, die kleiner gleich dem Trennwert sind, werden einer Gruppe, der Rest der anderen Gruppe zugeteilt. Bei kategorialen Daten stehen zwei Töpfe zur Auswahl. Alle verfügbaren Ausprägungen werden nun beliebig auf die beiden Töpfe aufgeteilt. Es stellt sich nun die Frage, welcher Trennwert bzw. welche Aufteilung optimal ist. Oder anders formuliert:

Wie erkennt man, ob eine gewählte Aufteilung gut trennt?

Dafür bedient man sich unterschiedlicher Techniken: Nachdem eine Aufteilung festgelegt wurde, kann man mittels ꭙ⊃2;-Test, Entropie, Gini-Kennzahl oder anderen Verfahren die Güte der Aufteilung beurteilen. Programmtechnisch wird aus Gründen der Einfachheit oft die Gini-Kennzahl als Gütekriterium genutzt.

Die Gini-Kennzahl berechnet sich wie folgt:
Von jedem Knoten kennen wir die Gesamtanzahl aller darin enthaltenen Elemente. Weiters wissen wir aus den Trainingsdaten, wie viele Elemente davon den Gruppen kein Default und Default zugeordnet wurden. Mit Hilfe dieser Informationen kann die Gini-Kennzahl berechnet werden:

Betrachten wir als Beispiel das Merkmal Alter. Das Ziel ist es, mit Hilfe der Gini-Kenzahl die Güte der Trennzahl zu beurteilen.

Betrachten wir den Knoten A (Alter): dieser enthält 400 Kunden und nehmen wir als Trennzahl ein Alter von 40 Jahren an. Diese Trennzahl teilt den Knoten in die beiden Knoten L (Links) mit 240 Kunden und den Knoten R (Rechts) mit den restlichen 160 Kunden auf. Für jeden Knoten können wir nun die Anzahl an Kunden mit der Ausprägung Default ermitteln. 180 Kunden beim Knoten A, 100 Kunden beim Knoten L und 110 Kunden beim Knoten R. Damit stehen alle Informationen zur Verfügung, welche benötigt werden, um die Gini-Kennzahl zu berechnen.

Konkret erhalten wir für die einzelnen Knoten (A, L und R) folgende Ergebnisse:

Aus diesen einzelnen Gini-Kennzahlen kann man nun eine gemeinsame Kennzahl G zur Bewertung der Aufteilung ermitteln.
Für die konkrete Altersaufteilung (Alter > 40) erhalten wir folgende Kennzahl:

Ob dieser Wert G tatsächlich eine optimale Lösung für die Aufteilung des Merkmals Alter darstellt, kann zunächst nicht beantwortet werden - es fehlen Vergleichszahlen. Eine Möglichkeit besteht darin, den Wert für unterschiedliche Altersaufteilungen zu bestimmen und sich so schrittweise der optimalen Aufteilung zu nähern. Diese Vorgangsweise ist aufwändig und mühsam. Doch dafür gibt es heute Computer und das R-Paket rpart.

rpart steht für recursive partitioning and regression tree. Mit Hilfe von rpart kann man automatisch einen - im gewissen Sinne - optimierten Entscheidungsbaum erstellen.

Wir erstellen nun unseren ersten Entscheidungsbaum mit Hilfe der Trainingsdaten:

Wenn wir keine Anpassungen an den Daten vornehmen, wird auf Grund des geringen Auftretens von Defaults (rund 11 %) vom Algorithmus nur ein Knoten (Root-Knoten) gebildet. Die einzig mögliche Entscheidung lautet in diesem Fall: Kredit vergeben! Das entspricht aber nicht unseren Vorstellungen.

Um dieses Problem zu lösen, müssen wir unsere Trainingsdaten anpassen. Für den Algorithmus ist es wichtig, dass beide Fälle (kein Default|Default) in der Analyse in etwa gleich auftreten. Zu diesem Zweck können wir Datensätze mit der Ausprägung "kein Default" entfernen oder Datensätze mit der Ausprägung "Default" duplizieren. Eine andere Alternativen besteht darin, dass man den Datensätzen entsprechende aprioi-Wahrscheinlichkeiten zuweist. Schließlich könnte man auch die Kosten für unterschiedliche Entscheidungen in einer Verlust-Matrix abbilden.

In diesem Beispiel habe ich die Trainingsdaten angepasst und Datensätze mit der Kennung kein Default auf rund ein Drittel reduziert. Die Datensätze mit der Kennung Default wurden belassen. Diese reduzierte Datei nenne ich undersampled_trainingsset.

Man erkennt auch hier, dass die Datenaufbereitung viel Raum und Zeit einnimmt – dies ist jedoch Teil jeder Analyse. Wie bereits erwähnt, nutzen wir das Paket rpart um die Analyse durchzuführen. Diesmal jedoch mit dem reduzierten (undersampled) Trainingsbestand:

Die Funktion rpart enthält verschieden Argumente.

Das erste Argument ist ein Formelausdruck. Dieser stellt die binäre Responsevariable in Abhängigkeit von Kredit, Score, Wohnen, Gehalt, Alter, Jobdauer und Zins dar – ersichtlich wird dies durch die Wellenlinie innerhalb des Ausdrucks.

Das zweite Argument bestimmt die Analysemethode (class). Damit wird zum Ausdruck gebracht, dass es sich in diesem Beispiel um einen binären Entscheidungsbaum handelt.

Das dritte Argument beschreibt die reduzierten Trainingsdaten.

Das vierte Argument beschreibt das Abbruchkriterium für die Erstellung von neuen Knoten im Entscheidungsbaum. Im konkreten Fall wurde der cp-Wert auf 0.001 gesetzt. Falls für einen neuen Knoten der cp-Wert unterhalb dieser Grenze liegt, wird der Vorgang für diesen Zweig des Entscheidungsbaumes beendet.

Wir werden nun einige der vom Paket rpart erstellten Ausgaben näher betrachten. Als erstes analysieren wir die Tabelle mit der Darstellung der cp-Werte. Diese Tabelle wird uns helfen, einen optimalen Entscheidungsbaum zu finden.

Im unteren Teil der Tabelle findet man eine Tabelle mit cp-Werten. Man erkennt, dass der letzte Eintrag den cp-Wert 0.001 aufweist. Darunter findet man keinen Eintrag mehr. Dies entspricht der Vorgabe im Funktionsaufruf: control = rpart.control(cp = 0.001)

In der Spalte nsplit kann man die kumulierte Anzahl an Knoten, in Abhängigkeit vom cp-Wert, ablesen. Mit zunehmender Verringerung der cp-Werte findet eine Optimierung der Trainingsdaten und nicht des Problems statt. Man spricht von einer Überanpassung.

Betrachten wir nun die Spalte xerror der cp-Tabelle. Wir erkennen, dass der Wert zunächst abnimmt, auf niedrigem Niveau bleibt und dann wieder zunimmt. Eine grafische Darstellung dieses Sachverhalts erhalten wir mit der plotcp-Funktion.

Das Minimum finden wir bei einem cp-Wert von 0.0034594. Wir erstellen nun den Entscheidungsbaum, der diesem cp-Wert entspricht.

Damit können wir unseren finalen Entscheidungsbaum darstellen:

Der Vorteil des Entscheidungsbaums liegt in der Klarheit seiner Darstellung. Trotzdem möchte ich auf einige Besonderheiten hinweisen: Bei allen grün eingefärbten Knoten fällt die Entscheidung zu Gunsten des Kredits. Bei allen blau eingefärbten Knoten wird der Kredit abgelehnt. Je heller die Farbe, umso weniger eindeutig ist die Entscheidung.

Trotzdem haben Entscheidungsbäume auch Nachteile: Sie liefern zumeist zu wenige Knoten, um reale Probleme zu bedienen. Sie sind jedoch eine große Hilfe beim Aufspüren von Modellen. Bei der logistischen Regression hat man dieses Problem nicht.

Sie haben nun zwei Verfahren für Binärentscheidungen kennengelernt:

  • die logistische Regression und
  • den binäre Entscheidungsbaum

Mit diesen beiden Verfahren habe ich die Mächtigkeit der Programmiersprache R aufgezeigt. Dabei handelt es sich jedoch nur um die kleine Spitze eines riesigen Eisbergs. In den nächsten Beiträgen werde ich Ihnen die Programmiersprache R Schritt für Schritt näher bringen.

Falls Ihnen dieser Weg, die Programmiersprache R zu erlernen, zu mühsam erscheint, können Sie mich gerne unter helmut.grillenberger@usedata.com kontaktieren. Weitere Informationen finden Sie auf meiner Webseite www.usedata.com. Ich berate und unterstütze Sie und Ihr Team gerne in allen Fragen zur Programmiersprache R, Statistik und Data Science.

Mit statistischen Grüßen
Helmut Grillenberger

www.usedata.com
www.pulsmagic.com

Dieser Komentar steht auch im pdf-Format zur Verfügung [427 KB] .

Teilen Sie Helmut's Blog - meine R-Initiative mit Freunden, Kollegen und Interessierten auf LinkedIn.