Wie ich am Sberbank-Wettbewerb zur Vorhersage der Kundenabwanderung teilgenommen habe

    Im Rahmen der ICBDA 2015 hat die Sberbank einen Wettbewerb durchgeführt, um den Abfluss ihrer Kunden vorherzusagen . Ich war ein wenig verwirrt, habe nichts gewonnen und möchte trotzdem den Entscheidungsprozess beschreiben.


    Die Sberbank hat die Daten großzügig verschickt. Wir erhielten ~ 20.000 Benutzer, von denen bekannt war, dass sie im November, Dezember, Januar oder nicht in den Abfluss fielen. Und es gab ~ 30.000 Benutzer, für die man raten musste, ob sie im Februar abreisen würden. Außerdem wurde eine 35-GB-Datei mit ungefähr folgendem Inhalt angehängt:
    Сорри, НДА
    

    Die physikalische Bedeutung der Felder wurde nicht speziell offenbart. Sie sagten "so interessant". Es war nur bekannt, wo nach der Benutzer-ID gesucht werden musste. Diese Ausrichtung erschien mir äußerst seltsam. Sberbank kann jedoch auch verstanden werden. Zunächst habe ich beschlossen, dieses infernalische Datenarray beiseite zu lassen und die Benutzer aus den Trainings- und Testsätzen genauer zu untersuchen.

    Es stellte sich als unglaublich heraus: Wenn der Benutzer im November und Dezember nicht abgereist ist, wird er höchstwahrscheinlich im Januar nicht abreisen. Wenn der Benutzer gegangen ist, wird er höchstwahrscheinlich nicht zurückkehren:


    Darüber hinaus stellte sich heraus, dass 70% der Benutzer aus der Teststichprobe an der Schulung teilnehmen. Das heißt, das folgende geniale Qualifikationsmerkmal bittet: Wenn der Benutzer im Januar abreist, befindet er sich im Abfluss, und im Februar, wenn er nicht im Januar abreist, befindet er sich nicht im Abfluss. Um die Qualität einer solchen Lösung einzuschätzen, nehmen wir alle Benutzer ab Januar und prognostizieren sie anhand der Daten für Dezember. Es stellt sich nicht sehr heraus, aber besser als gar nichts:


    Ja, es ist klar, dass Januar und Februar völlig unterschiedliche Monate sind. Ende Dezember, die erste Januarhälfte ist für die Russen in der Regel etwas Besonderes. Es gibt jedoch keine bestimmte Auswahl, Sie müssen den Algorithmus auf etwas überprüfen.

    Um die Lösung irgendwie zu verbessern, müssen Sie die riesige Datei noch ohne Beschreibung durchsuchen. Als erstes habe ich beschlossen, alle Datensätze, in denen die ID keinem Benutzer gehört, aus dem Trainings- oder Testmuster zu streichen. Oh Horror, es konnte keine einzige Platte rausgeworfen werden. Ein Benutzer dort entspricht keinem, aber durchschnittlich 300 Einträgen. Das heißt, es handelt sich um eine Art von Protokollen, nicht um aggregierte Daten. Außerdem sind 50 der 60 Spalten Hashes. Protokolliert mit Hashes anstelle von Werten. Meiner Meinung nach ist das völliger Unsinn. Ich liebe die Datenanalyse für jene Momente, in denen es möglich ist, neues Wissen zu entdecken. In diesem Fall könnte die Öffnung so aussehen: "Wenn der Benutzer in der siebten Spalte häufig 8UCcQrvgqGa2hc4s2vzPs3dYJ30 = hat, bedeutet dies wahrscheinlich, dass er bald abreist." Nicht sehr interessant. Trotzdem habe ich beschlossen, mehrere Hypothesen zu testen, um zu sehen, was passiert.

    Es ist bekannt, dass in jeder Zeile des Protokolls zwei IDs und nicht eine vorhanden sind. Daher habe ich angenommen, dass wir mit irgendeiner Art von Transaktionen arbeiten. Um dies irgendwie zu überprüfen, wurde ein Diagramm erstellt, in dem sich ID an den Eckpunkten befand, und Kanten wurden angezeigt, wenn sich zwei IDs in demselben Datensatz trafen. Wenn das Protokoll wirklich Transaktionen enthält, sollte sich das Diagramm als sehr spärlich herausstellen und gut in Cluster gruppiert sein. Das Ergebnis war nicht ganz das, was ich erwartet hatte, es gab viele Verbindungen zwischen den Clustern per Auge:


    Aber formal war die Modularität sehr hoch und die Cluster bildeten sich oft um einen Scheitelpunkt, sodass ich entschied, dass es sich um Transaktionen handelte. Darüber hinaus gab es keine besseren Ideen.


    Wenn es sich um Transaktionen handelt, ist die Anzahl der eingehenden und ausgehenden Transaktionen die logische Ergänzung zum Modell. Tatsächlich hatten fast 40% derjenigen, die im Januar abgereist sind, weniger als zehn eingehende Transaktionen.


    Fügen Sie diese einfache Bedingung zum Modell hinzu und erhalten Sie eine gute Qualität:


    Es ist klar, dass nur die Anzahl der Transaktionen nicht sehr cool ist. Der Benutzer kann im Januar 2014 500 Transaktionen tätigen und im Januar 2015 problemlos abreisen. Sie müssen sich den Trend ansehen. Das durchgesickerte endet ja alles im ersten, zweiten Monat:


    Und für diejenigen, die kompliziertere Geschichten haben:


    Irgendwie konnte ich diese Bedingung einfach nicht zum Modell hinzufügen, also musste ich mich dem maschinellen Lernen zuwenden. Ich habe RandomForest auf 500 Bäumen mit einer Tiefe von 10 auf Features wie "Monate vor der ersten Transaktion", "Monate vor der letzten Transaktion", "Anzahl der Monate mit Transaktionen" gesichtet. Die Qualität ist etwas gewachsen: Der


    Vorrat an einfach verständlichen Lösungen ist erschöpft. Deshalb musste ich in eine riesige Datei ohne Beschreibung noch tiefer graben. Für alle Spalten wurde berechnet, wie viele eindeutige Werte dort gefunden werden.


    Warum ist die Anzahl der eindeutigen Werte gebrochen? Weil ich eine knifflige Methode zum Berechnen von eindeutigen Werten mit festem Speicher verwenden musste . Wenn Sie nur alles in Sets packen, erhalten Sie nicht genug Speicher.

    Dann für Spalten, in denen eine vernünftige Anzahl von verschiedenen Werten Histogramme berechnet wurden:


    Es ist zu sehen, dass einige Histogramme ähnlich sind, z. B. 14 und 33, 22 und 41. In der Tat gehen die meisten Felder paarweise (ja, ich habe das Korrelationsdiagramm der Zeichen manuell abgelegt):


    Das heißt, ein Teil der Spalten wird durch id1, ein Teil durch id2 beschrieben. Einige Felder weisen auf eine Transaktion hin. Um sicherzustellen, welche Spalten den Benutzer beschreiben, habe ich berechnet, wie oft unterschiedliche Werte für dieselbe ID verwendet werden. Es stellte sich heraus, dass die Spalten 5 bis 15 fast nie mehr als einen Wert für id annehmen. In der Tat sind einige von ihnen der Name der Stadt, Postleitzahl. Sie betraten das Modell als kategorisch. Der Rest kann unterschiedliche Werte für dieselbe ID annehmen (natürlich meistens null), sodass sie das Modell mit Gewichten eingaben.


    Aufgrund all dieser kategorialen Merkmale hat die Komplexität des Modells erheblich zugenommen, und die meisten neuen Merkmale haben keinen besonderen Beitrag geleistet. Aber es gab eine Besonderheit - die 56.. Sie hat viel beeinflusst. Die Qualität ist deutlich gewachsen:


    Ich habe eine andere coole Funktion ausprobiert. Er nahm das von ihm zu Beginn erstellte Transaktionsdiagramm heraus und untersuchte, wo Benutzer leckten und blieben. Ich war überrascht zu bemerken, dass es einen Cluster gibt, in dem fast alles durchgesickert ist. Der Klassifikator hat zwar keine Fehler gemacht, daher hat der Qualitätsgewinn nicht funktioniert.


    Ich habe auch Parameter für RandomForest ausgewählt. Markiert ein Testmuster. Ich war überzeugt, dass jeder, der im Januar ging, im Februar ging. Ich überprüfte, dass der Anteil derjenigen, die gingen, im Allgemeinen normal war. Und an die Sberbank geschickt. Aber anscheinend ist etwas schief gelaufen, weil ich mich in den Top 3 nicht wiedergefunden habe. Das größere Oberteil wurde uns aber nicht gezeigt.

    Jetzt auch beliebt: