Neuronale Netze und Process Mining: Freunde finden

Process Mining ist ein Datenanalysefeld, mit dem Sie Prozesse anhand der Protokolle von Informationssystemen analysieren können. Da es auf Habré nur sehr wenige Veröffentlichungen zum Thema des Einsatzes von maschinellem Lernen in diesem Bereich gibt, haben wir uns entschlossen, unsere Erfahrungen bei der Entwicklung von Vorhersagemodellen zur Lösung prozessorientierter Probleme zu teilen. Im Rahmen des VTB-Programms, einem IT-Junior für angehende IT-Experten, testeten Praktikanten des Process Mining-Teams die Methoden des maschinellen Lernens im Rahmen der Aufgaben der Untersuchung von Bankprozessen. Im Rahmen des Schnitts werden wir darüber sprechen, wann und wie wir auf die Idee gekommen sind, solche Probleme zu lösen, was wir getan haben und welche Ergebnisse wir erzielt haben.



Das IT Junior Program ist ein jährliches Praktikumsprogramm für IT-Anfänger bei der VTB Bank, das erstmals im September 2019 begann. Das Praktikum dauert sechs Monate. Nach den Ergebnissen des Programms 2019 trat mehr als die Hälfte der Praktikanten in die Belegschaft ein und wurde Mitarbeiter des Unternehmens. Weitere Informationen zum Programm, zum Auswahlbeginn und zu den Anforderungen an die Kandidaten finden Sie hier . So näherten sich die Auszubildenden dieses Programms den Aufgaben der Bank.

Im klassischen Koordinatensystem ist es notwendig, um den Prozess zu verstehen und zu formalisieren:

  • ein Interview mit Mitarbeitern führen;
  • Analysieren Sie verfügbare Berichte und Dokumentationen.

Beim Process Mining-Ansatz wird ein digitales Prozessmodell auf der Grundlage nicht nur der Expertenmeinung der Prozessteilnehmer, sondern auch relevanter Daten aus Informationssystemen gebildet.

Als Ergebnis erhalten wir ein objektives digitales Modell des Prozesses, das die Bewegung realer Daten in den IT-Systemen des Prozesses widerspiegelt. Das resultierende Modell arbeitet in Echtzeit und ermöglicht es Ihnen, den aktuellen Status des Prozesses mit dem erforderlichen Detaillierungsgrad anzuzeigen.

In unserem vorherigen ArtikelWir sprachen über unsere Process Mining-Plattform und die eigentlichen Aufgaben der Bank, die mit ihrer Hilfe gelöst werden. Die implementierte Lösung ermöglichte es uns, den Zeitaufwand für die Erstellung von Pflichtberichten an Regierungsbehörden erheblich zu verkürzen und Prozessfehler zu identifizieren und zu optimieren, um eine tägliche Darstellung des aktuellen Status der Einkäufe in der Arbeit zu erstellen.

In der Folge mussten unsere Kunden nicht nur den aktuellen Stand des Prozesses qualitativ bestimmen, sondern auch die zukünftigen Bedingungen vorhersagen.

Als Nächstes beschreiben wir Schritt für Schritt, wie wir das Problem der Vorhersage der Dauer des Beschaffungsprozesses (am Beispiel des BPI Challenge 2019-Datensatzes) anhand einer Reihe bekannter Ereignisse mithilfe der Hochleistungs-DGX-Station gelöst haben, die uns freundlicherweise von NVIDIA für Forschungszwecke zur Verfügung gestellt wurde.

Anwendung für maschinelles Lernen für Process Mining


Um das Problem zu lösen, haben wir mit CatBoostRegressor eine Baseline erstellt und anschließend eine Lösung mit einem neuronalen Netzwerk und der Einbettung kategorialer Variablen entwickelt.
Aufgrund des Vorhandenseins von kategorialen und materiellen Merkmalen in den Quelldaten wurde beschlossen, Boosting zu verwenden, das kategoriale Merkmale ohne Codierung verarbeiten und das Problem auch bei einer diskreten und materiellen Eingabe lösen kann.

Die Netze wurden verwendet, um vollständig Materialattribute zu erstellen und das Problem mit dem gesamten Materialeinsatz zu lösen. Anschließend wurden diese beiden Ansätze verglichen und entschieden, ob mit den Netzen gearbeitet werden soll.

Daten Beschreibung


Es wurde beschlossen, externe Daten zu verwenden, die für uns im Geschäftsbereich geeignet sind und ähnliche Merkmale aufweisen. Der verwendete BPI Challenge 2019-Datensatz enthält 250.000 Fälle - das sind 1,5 Millionen Ereignisse. Die Anfangsdaten werden durch einen Satz von 21 Zeichen beschrieben: 18 kategoriale (es gibt Indexzeichen), zwei boolesche und ein reales. Die Ausführungszeit des Beschaffungsprozesses wurde als Zielvariable ausgewählt, die den tatsächlichen Anforderungen des Unternehmens entsprach. Eine detaillierte Beschreibung der Merkmale finden Sie in der Beschreibung des Datensatzes .

Basislinie


Vor dem Modelltraining wurden die Daten im Verhältnis 0,8 / 0,2 in Trainings- (Zug) und Testproben (Test) unterteilt. Darüber hinaus erfolgte die Aufteilung nicht nach Ereignissen, sondern nach Fällen.

Um festzustellen, wie angemessen es ist, eine komplexe proprietäre Lösung in Form eines neuronalen Netzwerks zu verwenden, wurde die Basislinie mit CatBoost erstellt, einer erweiterten Bibliothek zur Gradientenverstärkung auf Entscheidungsbäumen. Um eine Basislinie zu erstellen, wurde eine minimale Datenvorverarbeitung durchgeführt (Codierung von kategorialen Merkmalen mit der entsprechenden Häufigkeit in den Daten), eine Zielvariable (Falldauer) und eine Reihe neuer Merkmale wurden entwickelt (zusätzlich zu denen, die bereits im ursprünglichen Datensatz enthalten sind):

  • . , : , , , , , .
  • Exponential Moving Average . EMA , .
  • (, , ).

Nach dem Training des CatBoostRegressor im Trainingssatz haben wir das folgende Ergebnis erhalten: MAE (Mean Absolute Error) = 17,5 Tage (dh der Wert der vorhergesagten Zielvariablen unterscheidet sich durchschnittlich 17,5 Tage vom wahren Wert). Dieses Ergebnis wurde verwendet, um die Wirksamkeit eines neuronalen Netzwerks zu testen. 

Eines der wichtigen Details hierbei ist die Entwicklung der Zielvariablen für die Basislinie. 

Lassen Sie uns einen Fall haben. Wir bezeichnen es mit c_i aus der Menge C (der Menge aller Fälle in unserem Datensatz). Jeder Fall ist eine geordnete Folge von Ereignissen, d. H. C_i = (e_0, ​​..., e_ni), wobei ni die Länge des i-ten Falls ist. Für jede Veranstaltung haben wir einen Zeitstempel - die genaue Zeit, zu der sie begonnen hat. Mit diesen temporären Stempeln können Sie die Dauer des Falls ohne das letzte Ereignis berechnen. Es ist jedoch nicht sehr gut, jedem Ereignis ein solches Ziel zuzuweisen, dh eine Korrespondenz ek ∈ ​​ci, ek → ti (ti ist die Dauer des i-ten Falls) zu erstellen. Erstens können ähnliche Ereignisse (typisch) bei unterschiedlicher Dauer auftreten. Zweitens möchten wir die Dauer des Falls anhand einer bestimmten (zeitlich geordneten) Teilsequenz von Ereignissen vorhersagen (dies ist darauf zurückzuführen, dass wir nicht die gesamte Abfolge von Ereignissen kennen, dh den Fall vorher nicht kennenwie es passiert ist, aber wir möchten eine Bewertung der Dauer des gesamten Falls anhand einiger bekannter (aufgetretener) Ereignisse aus diesem Fall vornehmen.

Daher müssen wir jeden Fall in Teilsequenzen der Länge von eins bis zur Länge des Falls zeitlich geordneter Ereignisse aufteilen und eine Zielvariable zuweisen, die der Dauer des Falls entspricht, aus dem diese Teilsequenzen erhalten werden, dh die Entsprechungen ci ∈ C, ci → {sub_cj} ni (ni) nach wie vor ist die Länge des i-ten Falls), j = 1 und len (sub_cj) = j.

Daher teilen wir jeden Fall in Teilsequenzen auf und weisen jeder solchen Teilsequenz die Dauer des gesamten Falls zu.

Weitere Informationen zu Teilsequenzen

Wie bereits erwähnt, teilen wir den Fall in Teilsequenzen auf und weisen jedem von ihnen die Dauer des Falls zu. Wir werden Boosting verwenden, das genau auf die Größe der Eingabedaten abgestimmt ist. Jetzt haben wir also X = {{sub_c ki } ni k = 1 } t = 1 N , sub_c ik ist die k-te Teilsequenz des i-ten Falls, t i ist die Länge des i-ten Falls, N ist die Anzahl der Fälle. Das heißt, die Dimension [∑ N t = 1 n i , sc, 17], sc ist eine Variable, die der Länge der Teilsequenz des entsprechenden Falls entspricht.

Nachdem wir kategoriale Variablen nach ihrer Häufigkeit codiert haben, haben wir reale und boolesche Variablen sowie codierte kategoriale Variablen (Indexvariablen werden im Lernprozess nicht verwendet). Wir können auch Durchschnittswerte über eine Teilsequenz berechnen, während wir in kategorialen Merkmalen die durchschnittliche Häufigkeit auftretender kategorialer Werte erhalten, die auch als ein Merkmal betrachtet werden kann, das die Aggregation einer Teilmenge von Ereignissen in einem Fall beschreibt, dh als ein Merkmal, das eine Teilsequenz beschreibt. Lass es und schau was passiert.

Nach Mittelung von sc über die Dimension erhalten wir die folgende Dimension: [∑ N t = 1 n i , 17].

Modellbau

Basierend auf den Fällen teilen wir den Zug in einen anderen Zug und ein Validierungsmuster auf, nehmen einen CatBoostRegressor mit Standardparametern, übergeben ihm ein Trainingsmuster, validieren anhand eines Validierungsmusters, nehmen die beste Iteration und verwenden MAE als Validierungsmetrik. Wir erhalten Folgendes (in der folgenden Abbildung) zum Test (wir bereiten den Test separat für dieselbe Pipeline vor, auf der der Zug gebaut wurde. Alle Zeichen basieren auf den Daten, die im Test enthalten sind, dh wir haben keine Zeichen, die sich auf die Zielvariable konzentrieren. Die einzige Einschränkung: Wenn die kategorialen Merkmale im Test nicht dem Wert entsprechen, den wir im Zug gesehen haben, berücksichtigen wir die Häufigkeit dieses Werts im Test und aktualisieren das Wörterbuch für die Codierung.

Basisergebnisse



• Iterationen: 500.
• Lernrate: 0,1.

Trainingsparameter:

• Trainingszeit: weniger als 2 Minuten.
• Eisen: Tesla k80 (aus Colab).

Ergebnisse:

• Test MAE: 17,5 Tage.
• Die durchschnittliche Dauer des Falls im Test: 66,3 Tage.

Neurales Netzwerk


Installieren


Um das neuronale Netzwerk zu trainieren, wurden die Daten verbessert: Einbettungen für kategoriale Variablen wurden erstellt und die Verteilung der Zielvariablen wurde angepasst. Als nächstes wurde das neuronale Netzwerk auf dem NVIDIA Tesla K80 (Google Colab) und auf der NVIDIA DGX Station trainiert.

Die folgenden Ergebnisse wurden erhalten:

  • Schulungszeit auf NVIDIA K80 (Google Colab): 20 Minuten.
  • Schulungszeit an der NVIDIA DGX Station: 8 Minuten.

Die Trainingszeit des neuronalen Netzwerks ist auf die unterschiedlichen technischen Eigenschaften der verwendeten GPUs zurückzuführen:
NVIDIA Tesla K80 (Google Colab)
NVIDIA DGX Station
1X NVIDIA Tesla K80 12 GB
4X NVIDIA Tesla V100 32 GB

Vorverarbeitung


Neue Zeichen

  • EMA zum Wert der Veranstaltung: Wir wollen den Trend bei den Kosten der Aktivitäten für jeden Fall erfassen.
  • Art des Fehlers: In der Datensatzbeschreibung finden Sie Informationen zu vier Arten einiger beschreibender Statistiken des Kaufs (Ereignisses). Diese Typen sind im ursprünglichen Datensatz in die Werte von zwei Variablen unterteilt. Wir aggregieren es einfach zurück (wenn Sie sich die Beschreibung des Datensatzes ansehen, wird klar, wovon wir sprechen).

Kategoriale Zeichen Wir

codieren einfach die eindeutigen Werte von kategorialen Zeichen mit natürlichen Zahlen, damit wir später Einbettungen unterrichten können.

Einbettungen für kategoriale Variablen

Wir bestimmen die Dimension der Einbettungen für jede kategoriale Variable:

  • , ̆ ̆ ̆. ̆ , ̆ ̆ , ̆, . : MUi  = min(CAT_EMBEDDING_DIM; (len(uniquei) + 1) // 2), CAT_EMBEDDING_DIM — , uniquei — i- .
  • , 3, i-̆ ̆ max(3;MUi)+1, 1, , train, unk-.

Wir passen die Verteilung des Ziels in der Zugstichprobe an. Die 

anfängliche Verteilung hat sich aufgrund von Ausreißern (Fälle, die 250.000 Tage dauerten) und einer großen Anzahl von Kurzfällen stark nach links verschoben. Daher zählen wir die Perzentile 0,05 und 0,95 und belassen die Daten aus dem Zug mit dem Ziel dazwischen diese Stromschnellen.

Danach haben wir immer noch Fälle, die ungefähr einen und ungefähr 100 Tage dauern, dh die Zielvariable durchläuft mehrere Größenordnungen. Daher wird die Annahme, dass die Varianz in der Verteilung der Zielvariablen um den Entscheidungsalgorithmus konstant ist, kaum erfüllt, dh die Verteilung der Zielvariablen ist nahezu normal, aber die Varianz ist nicht konstant, da die Zielvariable entweder kleiner als 1 oder größer als 100 sein kann Irgendwie diesen Effekt ausgleichen, normalisieren wir die Daten.

Das Ergebnis ist in der folgenden Grafik dargestellt (schwarze Linie ist die Normalverteilung).



Dann teilen wir unsere Daten nach Fall in Zug und Validierung auf. Hier gibt es auch eine offensichtliche Nuance: Wir normalisieren das Ziel mit dem Durchschnitt und der Abweichung, die anhand aller Daten berechnet werden, und teilen dann durch Zug und Validierung, das heißt, es stellt sich wie ein Gesicht im Zug heraus, aber da wir hier ein Hilfsproblem lösen, scheint dieses Gesicht nicht kritisch.

Gebäudeschilder


Idee

  • Wir nehmen nur kategorische Zeichen aus unserem Zug, die durch natürliche Zahlen codiert sind.
  • Wir nehmen keine Teilzeichenfolgen aus Fällen, sondern lediglich Ereignisse, dh eine Zeile in unseren Daten für Einbettungen - dies ist ein Ereignis, das durch codierte kategoriale Merkmale gekennzeichnet ist.
  • : , ̆, , , , ̆ ̆ ̆. - , ̆, , , ̆ ( ), ( , - ̆ ).
  • ̆ .
  • , 8-̆̆ elu ̆, ( , , , L2-) .
  • , , — , , .
  • Summary: — ̆ ̆ ̆ ̆ — ̆.


  • Batch size = 1000
  • Learning rate = 3e-04.
  • = 15.
  • : Tesla k80 (colab) + Nvidia DGX Station .
  • (colab) – 50 .
  • (Nvidia DGX Station) — 18 .




Datenvorbereitung

Jetzt haben wir Einbettungen für kategoriale Variablen (hier gibt es eine Nuance: Wir haben ehrlich gesagt eindeutige Werte für kategoriale Variablen in unserem Zug verwendet (nicht für die, die wir für Trainingseinbettungen zugewiesen haben, sondern für die, die wir zu Beginn zugewiesen haben Training), daher besteht die Möglichkeit, dass die Testdaten einen Wert von kategorialen Variablen enthalten, die wir im Zug nicht gesehen haben, dh wir haben keine Einbettung für diesen Wert trainiert.

Für solche Werte wird eine separate Zeile in den Einbettungsmatrizen erstellt. In unserem Fall besteht das Problem jedoch darin, dass sie während des Trainings nicht beteiligt sind und daher nicht studieren. Wenn wir davon ausgehen, dass wir einen Wert einer zuvor nicht gesehenen kategorialen Variablen treffen, nehmen wir diesen Vektor, aber tatsächlich wird er einfach aus der Initialisierungsverteilung entnommen.

Beim Trainieren dieses Vektors gibt es eine Richtung zur Verbesserung des Modells. Die Idee ist, dass sehr seltene Werte im Zug mit diesem Vektor codiert werden können, denn wenn wir nur im Test einen neuen Wert sehen, der bedingt 20% der gesamten Anfangsstichprobe ausmacht, ist dieser Wert selten und verhält sich wahrscheinlich Gleich wie seltene Werte im Zug.

In jedem Fall ersetzen wir die kategorialen Variablen durch die entsprechende Einbettung, verbinden uns mit den reellen und booleschen Attributen und erhalten eine Matrix der Größe [N, F], wobei F die Summe der Dimensionen der Einbettungen für kategoriale Variablen, die Anzahl der reellen und booleschen Attribute ist.

Wir führen eine Gruppierung von Ereignissen in einer Teilsequenz durch (wie zuvor durchgeführt). Die Zielvariable für die Teilsequenz ist die Dauer des Falls, aus dem die Teilsequenz erhalten wurde. Addieren Sie die Anzahl der Ereignisse und die Summe der Kosten der Ereignisse in dieser Teilsequenz zum Vektor der Teilsequenz.

Jetzt haben wir eine Matrix fester Größe - Sie können sie in das Modell einspeisen (vorher normalisieren wir die Matrix).

Parallelisierungsmethode

  • Wir machen einen Turm für jede GPU.
  • Bei jedem Schritt teilen wir die Parameter auf die Türme auf.
  • .
  • ̆ , .
  • ( , ̆ ̆ ).
  • .
  • , - ( , word2vec-style, ).



  • () () ().
  • ̆ : — , gpu , , gpu .



  • : 7-̆̆ elu.
  • ̆ , .
  • Batch size = 1000.
  • Learning rate = 3e-04.
  • = 15.
  • : Tesla k80 (colab) + Nvidia DGX Station.
  • (colab) = 20 .
  • (Nvidia DGX Station) = 8 .

Ein Teil des Modelldiagramms.



Ressourcenverbrauch und Parallelisierung. Das

Training neuronaler Netze auf einer CPU dauert etwa viermal so lange wie auf einer NVIDIA DGX-Station. In diesem Fall scheint der Unterschied unbedeutend zu sein - acht Minuten auf der NVIDIA DGX Station und 32 Minuten auf der CPU. Dies ist jedoch ein kleines Modell mit einer kleinen Datenmenge. Bei der Implementierung realer Projekte, bei denen es mehrmals mehr Fälle und Ereignisse geben wird, dauert die Schulung der CPU mindestens eine Woche. In diesem Fall reduziert die Verwendung der NVIDIA DGX Station die Schulungszeit auf zwei Tage, was die Arbeitseffizienz erheblich erhöht. 

Es zeigte sich auch, dass die Geschwindigkeit des Lernprozesses stark von der Anzahl der verwendeten GPUs abhängt, was den Vorteil der NVIDIA DGX Station zeigt.

Dies wird durch frühere Experimente mit der NVIDIA DGX Station-CPU und -GPU unter Verwendung des Originaldatensatzes ohne vorherige Verarbeitung bestätigt:

  • Lernzeit auf der CPU: 6 Minuten 18 Sekunden.
  • GPU-Trainingszeit: 34 Sekunden.

GPU-



Lastvisualisierung CPU-Lastvisualisierung



Ergebnisse des neuronalen Netzes




  • Test MAE = 10 Tage.
  • Die durchschnittliche Testdauer = 67 Tage.
  • Inferenzzeit = 20 Sekunden.

Ergebnisse


  • Wir haben ein Pilotprojekt implementiert, um Methoden des maschinellen Lernens im Rahmen von Process Mining-Aufgaben zu bewerten.
  • Wir haben die Liste unserer Tools getestet und erweitert, mit denen wir geschäftliche Probleme lösen können.
  • Eines der interessanten Ergebnisse war das Schreiben unserer eigenen Implementierung von Parallel Computing auf 4 Tesla v100-Karten, mit denen die DGX-Station ausgestattet ist: Die Verwendung mehrerer GPUs beschleunigt das Lernen fast im Einklang mit der Anzahl der GPUs (der Code ist parallelisiert).
  • Der Übergang zu einem vollständig kontinuierlichen Eintrag und die Verwendung eines neuronalen Netzwerks ermöglichten es, eine Woche Pause von der Grundlinie einzulegen.
  • Die Zeit erhöht sich von einigen Minuten auf eineinhalb Stunden (Schulung in endgültiger Architektur und Einbettungen, aber Einbettungen können vorab trainiert verwendet werden, sodass die Zeit auf 20 Minuten reduziert wird).

Die beschriebenen Experimente zeigen, dass im Bereich Process Mining maschinelle und Deep-Learning-Algorithmen erfolgreich angewendet werden können. Darüber hinaus wurde festgestellt, dass die Geschwindigkeit des Lernprozesses stark von der Anzahl der verwendeten GPUs abhängt, was den Vorteil der NVIDIA DGX Station zeigt.

Was und wie kann verbessert werden


Einbettungen im Word2vec-Stil für Ereignisse

Bei der Erstellung unseres Modells, einschließlich Einbettungen für kategoriale Variablen, haben wir die Reihenfolge der Ereignisse relativ zueinander, dh die eigentümliche Semantik von Ereignissen in Fällen, nicht berücksichtigt. Um aus der Reihenfolge der Ereignisse in den Fällen etwas Nützliches zu lernen, müssen Sie Einbettungen für diese Ereignisse trainieren.

Idee

  • Wir nehmen ein kategoriales Merkmal und ein Real, teilen das Real in einen Bucket auf, dann wird jede Transaktion durch den Wert der kategorialen Variablen und den Bucket charakterisiert, in den der Wert der Realvariablen fällt. Kombinieren Sie diese beiden Werte, erhalten Sie sozusagen ein Analogon des Wortes für das Ereignis.
  • Wir betrachten den Fall als einen Satz (die Menge der Wörter im Satz entspricht der Menge der Ereignisse im Fall).
  • ̆ , ̆ ̆, , .
  • ̆, Skipgram CBOW .
  • , ̆, .



  • Skipgram.
  • — 5.

  • Batch size = 1000.
  • Learning rate = 3e-04.
  • = 10.
  • : Tesla k80 (colab) + Nvidia DGX Station.
  • (colab) — 20 .
  • (Nvidia DGX Station) — 8 .
  • Test MAE : 10 ̆. 

Anzahl Die



Verwendung von Funktionen aus Einbettungen erhöht sich um einige Zehntel eines Tages.

Zusammenfassend

  • Einbettungen erwiesen sich natürlich als ungebildet, weil sie ein wenig trainierten.
  • Es gibt ungefähr 290 Features aus kategorialen Einbettungen und 20 Features aus semantischen Einbettungen (dies ist nicht mehr sinnvoll, da die Größe des Wörterbuchs gering ist), sodass der Einfluss dieser semantischen Features aufgrund eines Ungleichgewichts im Anteil der Features ausgeglichen werden kann.
  • Die Semantik zwischen Ereignissen muss irgendwie zum Trainingssatz hinzugefügt werden, da aufgrund der Tatsache, dass die Abfolgen von Ereignissen (Fällen) geordnet sind, die Reihenfolge wichtig ist und Informationen daraus extrahiert werden können.
  • Sie können komplexere Architekturen für Einbettungen verwenden.
  • , , — .

All Articles