Réseaux de neurones et Process Mining: essayer de se faire des amis

Process Mining est un champ d'analyse de données qui vous permet d'analyser les processus en fonction des journaux des systèmes d'information. Comme il existe très peu de publications sur le sujet de l'utilisation de l'apprentissage automatique dans ce domaine sur Habré, nous avons décidé de partager notre expérience dans le développement de modèles prédictifs pour résoudre des problèmes orientés processus. Dans le cadre du programme VTB, un junior informatique pour les débutants en informatique, des stagiaires de l'équipe Process mining ont testé les méthodes d'apprentissage automatique dans le cadre de la recherche de processus bancaires. Sous la coupe, nous parlerons quand et comment nous avons eu l'idée de résoudre de tels problèmes, ce que nous avons fait et quels résultats nous avons obtenus.



IT Junior Program est un programme de stage annuel pour les débutants en informatique de la VTB Bank, qui a débuté en septembre 2019. Le stage dure six mois. Selon les résultats du programme 2019, plus de la moitié des stagiaires ont rejoint le personnel et sont devenus des employés de l'entreprise. Pour plus d'informations sur le programme, le début de la sélection et les conditions requises pour les candidats, cliquez ici . C’est ainsi que les stagiaires de ce programme ont abordé les tâches de la banque.

Dans le système de coordonnées classique, pour comprendre et formaliser le processus, il faut:

  • mener une entrevue avec les employés;
  • analyser les rapports et la documentation disponibles.

Dans l'approche Process Mining, un modèle de processus numérique est formé sur la base non seulement de l'opinion d'experts des participants au processus, mais également de données pertinentes provenant de systèmes d'information.

En conséquence, nous obtenons un modèle numérique objectif du processus, qui est un reflet du mouvement des données réelles dans les systèmes informatiques du processus. Le modèle résultant fonctionne en temps réel et vous permet d'afficher l'état actuel du processus avec le degré de détail nécessaire.

Dans notre précédent articleNous avons parlé de notre plateforme Process Mining et des tâches réelles de la Banque, qui sont résolues avec son aide. La solution mise en œuvre nous a permis de réduire considérablement le temps nécessaire à la préparation des rapports obligatoires aux agences gouvernementales, et a également permis d'identifier et d'optimiser les imperfections des processus, d'établir une présentation quotidienne de l'état actuel des achats en cours.

Par la suite, nos clients ont eu non seulement besoin de déterminer qualitativement l'état actuel du processus, mais aussi de prévoir ses conditions futures.

Ensuite, nous décrirons étape par étape comment nous avons résolu le problème de la prévision de la durée du processus d'approvisionnement (en utilisant l'ensemble de données BPI Challenge 2019 à titre d'exemple) en utilisant un ensemble d'événements bien connus en utilisant la station DGX haute performance, aimablement fournie par NVIDIA pour la recherche.

Application d'apprentissage automatique pour l'extraction de processus


Pour résoudre le problème, nous avons construit une base de référence à l'aide de CatBoostRegressor, puis développé une solution avec un réseau de neurones et incorporant des variables catégorielles.
En raison de la présence de caractéristiques catégorielles et matérielles dans les données source, il a été décidé d'utiliser le boosting, qui pourrait traiter les caractéristiques catégorielles sans codage, et également résoudre le problème sur une entrée discrète et matérielle.

Les filets ont été utilisés pour créer des attributs entièrement matériels et résoudre le problème sur l'ensemble de la matière, puis comparer ces deux approches et décider de s'embêter avec les filets.

Description des données


Il a été décidé d'utiliser des données externes qui nous conviendraient dans le domaine d'activité et possèdent un ensemble de caractéristiques similaires. L'ensemble de données BPI Challenge 2019 utilisé comprend 250 000 cas, soit 1,5 million d'événements. Les données initiales sont décrites par un ensemble de 21 signes: 18 catégoriques (il y a des signes index), deux booléens et un réel. Le temps d'exécution du processus d'approvisionnement a été sélectionné comme variable cible, ce qui correspondait aux besoins réels de l'entreprise. Pour une description détaillée des caractéristiques, vous pouvez vous référer à la description de l'ensemble de données .

Référence


Avant la formation du modèle, les données étaient divisées en échantillons de formation (train) et de test (test) dans un rapport de 0,8 / 0,2. De plus, la division n'a pas eu lieu selon les événements, mais selon les cas.

Pour déterminer dans quelle mesure il est approprié d'utiliser une solution propriétaire complexe sous la forme d'un réseau neuronal, une ligne de base a été construite à l'aide de CatBoost, une bibliothèque avancée de renforcement de gradient sur des arbres de décision. Pour construire une base de référence, un prétraitement minimal des données a été effectué (codage des caractéristiques catégorielles avec la fréquence correspondante dans les données), une variable cible (durée du cas) et un certain nombre de nouvelles fonctionnalités ont été développées (en plus de celles déjà présentes dans le jeu de données d'origine):

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

Après avoir entraîné le CatBoostRegressor dans l'ensemble d'entraînement, nous avons obtenu le résultat suivant: MAE (Mean Absolute Error) = 17,5 jours (c'est-à-dire que la valeur de la variable cible prédite est en moyenne de 17,5 jours différente de la valeur réelle). Ce résultat a été utilisé pour tester l'efficacité d'un réseau neuronal. 

Un des détails importants ici est le développement de la variable cible pour la ligne de base. 

Ayons un cas. Nous le notons c_i de l'ensemble C (l'ensemble de tous les cas de notre ensemble de données). Chaque cas est une séquence ordonnée d'événements, c'est-à-dire c_i = (e_0, ​​..., e_ni), où ni est la longueur du ième cas. Pour chaque événement, nous avons un horodatage - l'heure exacte à laquelle il a commencé. À l'aide de ces tampons temporaires, vous pouvez calculer la durée de l'affaire sans le dernier événement. Cependant, assigner une telle cible à chaque événement, c'est-à-dire faire la correspondance ek ∈ ​​ci, ek → ti (ti est la durée du ième cas), n'est pas très bon. Premièrement, des événements similaires (typiques) peuvent se produire dans des cas de durées différentes. Deuxièmement, nous voulons prédire la durée de l’affaire à partir d’une certaine sous-séquence (ordonnée dans le temps) d’événements (ceci est motivé par le fait que nous ne connaissons pas toute la séquence des événements, c’est-à-dire que nous ne connaissons pas l’affaire avantcomment cela s'est passé, mais nous voulons faire une évaluation de la durée de l'ensemble du cas en fonction de certains événements connus (survenus) de ce cas).

Par conséquent, nous devons diviser chaque cas en sous-séquences de longueur de un à la longueur du cas d'événements ordonnés dans le temps et affecter une variable cible égale à la durée du cas à partir duquel ces sous-séquences sont obtenues, c'est-à-dire les correspondances ci ∈ C, ci → {sub_cj} ni (ni comme précédemment, la longueur du ième cas), j = 1 et len ​​(sub_cj) = j.

Ainsi, nous divisons chaque cas en sous-séquences et attribuons la durée du cas entier à chacune de ces sous-séquences.

Plus d'informations sur les sous-séquences

Comme mentionné précédemment, nous divisons le cas en sous-séquences et attribuons la durée du cas à chacune d'entre elles. Nous allons utiliser le boosting qui correspond à la taille des données d'entrée. Alors maintenant, nous avons X = {{sub_c ki } ni k = 1 } t = 1 N , sub_c ik est la k-ème sous-séquence du i-ème cas, t i est la longueur du i-ème cas, N est le nombre de cas. Autrement dit, la dimension [∑ N t = 1 n i , sc, 17], sc est une variable égale à la longueur de la sous-séquence du cas correspondant.

Après avoir codé les variables catégorielles par leur fréquence, nous avons des variables réelles et booléennes, ainsi que des variables catégorielles codées (les variables d'index ne seront pas utilisées dans le processus d'apprentissage). Nous pouvons également faire la moyenne des valeurs sur une sous-séquence, tandis que dans les caractéristiques catégorielles, nous obtenons la fréquence moyenne des valeurs catégorielles qui se produisent, qui peut également être considérée comme une caractéristique décrivant l'agrégation d'un sous-ensemble d'événements dans un cas, c'est-à-dire comme une caractéristique décrivant une sous-séquence. Laissez-le et voyez ce qui se passe.

Après avoir fait la moyenne de sc sur la dimension, nous obtenons la dimension suivante: [∑ N t = 1 n i , 17].

Construction de modèles

Sur la base des cas, nous divisons le train en un autre train et un échantillon de validation, prenons un CatBoostRegressor avec des paramètres par défaut, lui transmettons un échantillon de formation, validons sur un échantillon de validation, prenons la meilleure itération, utilisons MAE comme métrique de validation. Nous obtenons les éléments suivants (dans la figure ci-dessous) sur le test (nous préparerons séparément le test pour le même pipeline sur lequel le train a été construit. Tous les panneaux sont basés sur les données qui se trouvent dans le test, c'est-à-dire que nous n'avons aucun panneau axé sur la variable cible. La seule mise en garde: si les caractéristiques catégorielles du test ne correspondent pas à la valeur que nous avons vue en train, nous considérons la fréquence de cette valeur dans le test et mettons à jour le dictionnaire pour l'encodage).

Résultats de référence



• Itérations: 500.
• Taux d'apprentissage: 0,1.

Paramètres de formation:

• Temps d'entraînement: moins de 2 minutes.
• Fer: Tesla k80 (de colab).

Résultats:

• Test MAE: 17,5 jours.
• La durée moyenne du cas dans le test: 66,3 jours.

Réseau neuronal


Installer


Pour former le réseau neuronal, les données ont été améliorées: des plongements pour les variables catégorielles ont été construits et la distribution de la variable cible a été ajustée. Ensuite, le réseau neuronal a été formé sur la NVIDIA Tesla K80 (Google Colab) et sur la NVIDIA DGX Station.

Les résultats suivants ont été obtenus:

  • Temps de formation sur NVIDIA K80 (Google Colab): 20 minutes.
  • Temps de formation à la station NVIDIA DGX: 8 minutes.

Le temps de formation du réseau neuronal est dû à la différence des caractéristiques techniques des GPU utilisés:
NVIDIA Tesla K80 (Google Colab)
NVIDIA DGX Station
1X NVIDIA Tesla K80 12 Go
4X NVIDIA Tesla V100 32 Go

Prétraitement


De nouveaux signes

  • EMA sur la valeur de l'événement: nous voulons suivre l'évolution du coût des activités pour chaque cas.
  • Type de faille: dans la description de l'ensemble de données, vous pouvez trouver des informations sur quatre types de statistiques descriptives de l'achat (événement) - ces types sont divisés en valeurs de deux variables dans l'ensemble de données d'origine. Nous l'agrégons simplement (si vous regardez la description de l'ensemble de données, il sera clair de quoi nous parlons).

Signes catégoriels Nous

codons simplement les valeurs uniques des signes catégoriques avec des nombres naturels dans l'ordre, afin que plus tard nous puissions enseigner les plongements.

Intégrations pour les variables catégorielles

Nous déterminons la dimension des incorporations pour chaque variable catégorielle:

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

Nous ajustons la distribution de la cible sur l'échantillon de train. La 

distribution initiale s'est avérée très décalée vers la gauche en raison des valeurs aberrantes (cas qui ont duré 250 000 jours) et d'un grand nombre de cas courts, nous comptons donc les centiles 0,05 et 0,95 et laissons les données du train avec la cible entre ces rapides.

Après cela, nous avons encore des cas qui durent environ un et environ 100 jours, c'est-à-dire que la variable cible passe par plusieurs ordres de grandeur. Par conséquent, l'hypothèse selon laquelle la variance est constante dans la distribution de la variable cible autour de l'algorithme de décision est à peine remplie, c'est-à-dire que la distribution de la variable cible est proche de la normale, mais la variance n'est pas constante du fait que la variable cible peut être inférieure à 1 ou supérieure à 100. Par conséquent, au moins en quelque sorte niveler cet effet, nous normalisons les données.

Le résultat est montré dans le graphique ci-dessous (la ligne noire est la distribution normale).



Ensuite, nous divisons par cas nos données en train et validation. Il y a aussi une nuance évidente ici: nous normalisons la cible avec la moyenne et la déviation, calculées selon toutes les données, puis divisons par train et validation, c'est-à-dire que cela se révèle comme un visage en train, mais puisque nous résolvons un problème auxiliaire ici, ce visage ne semble pas critique.

Panneaux de construction


Idée

  • Nous ne prenons que des signes catégoriques de notre train, codés par des nombres naturels.
  • Nous ne prenons pas des sous-chaînes de cas, mais simplement des événements, c'est-à-dire une ligne dans nos données pour les incorporations - il s'agit d'un événement caractérisé par des caractéristiques catégorielles codées.
  • : , ̆, , , , ̆ ̆ ̆. - , ̆, , , ̆ ( ), ( , - ̆ ).
  • ̆ .
  • , 8-̆̆ elu ̆, ( , , , L2-) .
  • , , — , , .
  • Summary: — ̆ ̆ ̆ ̆ — ̆.


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




Préparation des données

Nous avons maintenant des incorporations pour les variables catégorielles (il y a une nuance ici: nous avons honnêtement pris des valeurs uniques de variables catégorielles dans notre train (pas sur celle que nous avons allouée pour les intégrations de formation, mais sur celle que nous avons allouée au tout début pour formation), il y a donc une chance que sur les données de test il y ait une valeur de variables catégorielles que nous n'avons pas vues dans le train, c'est-à-dire que nous n'avons pas formé l'intégration pour cette valeur.

Pour de telles valeurs, une ligne distincte est créée dans les matrices d'intégration, mais dans notre cas, le problème est que pendant la formation, il n'est pas impliqué, et donc n'étudie pas. Sur cette base, si nous rencontrons une valeur d'une variable catégorielle qui n'a pas été vue auparavant, alors nous prenons ce vecteur, mais en fait il est simplement pris de la distribution d'initialisation.

Dans la façon de former ce vecteur, il existe une direction pour améliorer le modèle. L'idée est que des valeurs très rares dans le train peuvent être encodées avec ce vecteur, car si nous ne voyons une nouvelle valeur que dans le test, qui représente conditionnellement 20% de l'échantillon initial entier, alors cette valeur est rare et se comporte probablement mêmes que les valeurs rares dans le train.

Dans chaque cas, nous remplaçons les variables catégorielles par l'incorporation correspondante, nous connectons avec les attributs réels et booléens, nous obtenons une matrice de taille [N, F], où F est la somme des dimensions des incorporations pour les variables catégorielles, le nombre d'attributs réels et booléens.

Nous effectuons un regroupement d'événements dans une sous-séquence (comme précédemment). La variable cible pour la sous-séquence est la durée du cas à partir duquel la sous-séquence a été obtenue. Ajoutez le nombre d'événements et la somme des coûts des événements de cette sous-séquence au vecteur de la sous-séquence.

Nous avons maintenant une matrice de taille fixe - vous pouvez alimenter le modèle (avant cela, nous normalisons la matrice).

Méthode de parallélisation

  • Nous fabriquons une tour pour chaque GPU.
  • À chaque étape, nous divisons les paramètres entre les tours.
  • .
  • ̆ , .
  • ( , ̆ ̆ ).
  • .
  • , - ( , 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 .

Un morceau du graphique du modèle.



Consommation de ressources et parallélisation.

La formation d'un réseau de neurones sur un processeur prend environ quatre fois plus de temps que sur une station NVIDIA DGX. Dans ce cas, la différence semble insignifiante - huit minutes sur la NVIDIA DGX Station et 32 ​​minutes sur le CPU. Cependant, il s'agit d'un petit modèle avec une petite quantité de données. Lors de la mise en œuvre de projets réels, où il y aura plusieurs fois plus de cas et d'événements, la formation sur le CPU prendra au moins une semaine. Dans ce cas, l'utilisation de NVIDIA DGX Station réduira le temps de formation à deux jours, ce qui augmentera considérablement l'efficacité du travail. 

Il a également été révélé que la vitesse du processus d'apprentissage dépend fortement du nombre de GPU utilisés, ce qui montre l'avantage de NVIDIA DGX Station.

Ceci est confirmé par des expériences précédentes sur le CPU et le GPU de la station NVIDIA DGX en utilisant l'ensemble de données d'origine sans aucun traitement préalable:

  • Temps d'apprentissage sur le CPU: 6 minutes 18 secondes.
  • Temps de formation GPU: 34 secondes.

Visualisation de la charge du GPU



Visualisation de la charge du CPU



Résultats du réseau neuronal




  • Test MAE = 10 jours.
  • La durée moyenne du dossier au test = 67 jours.
  • Temps d'inférence = 20 secondes.

résultats


  • Nous avons implémenté un pilote pour évaluer les méthodes d'apprentissage automatique dans le cadre des tâches Process Mining.
  • Nous avons testé et élargi la liste de nos outils avec lesquels nous allons résoudre des problèmes importants pour les entreprises.
  • L'un des résultats intéressants a été l'écriture de notre propre implémentation de calcul parallèle sur 4 cartes Tesla v100, qui sont équipées de la station DGX: l'utilisation de plusieurs GPU accélère l'apprentissage presque en ligne avec le nombre de GPU (le code est parallélisé).
  • La transition vers une entrée totalement continue et l'utilisation d'un réseau neuronal ont permis de prendre une semaine de repos.
  • Le temps passe de quelques minutes à une heure et demie (formation à l'architecture finale et aux plongements, mais les plongements peuvent être utilisés pré-formés, donc le temps est réduit à 20 minutes).

Les expériences décrites montrent que dans le domaine de l'exploration de processus, les algorithmes de machine et d'apprentissage profond peuvent être appliqués avec succès. De plus, il a été révélé que la vitesse du processus d'apprentissage dépend fortement du nombre de GPU utilisés, ce qui montre l'avantage de NVIDIA DGX Station.

Quoi et comment peut-on améliorer


Intégrations de style Word2vec pour les événements

Lorsque nous avons créé notre modèle, y compris les incorporations pour les variables catégorielles, nous n'avons pas pris en compte la séquence d'événements les uns par rapport aux autres, c'est-à-dire la sémantique particulière des événements à l'intérieur des cas. Pour apprendre quelque chose d'utile à partir de l'ordre des événements à l'intérieur des cas, vous devez former les incorporations pour ces événements.

Idée

  • Nous prenons une caractéristique catégorielle et une réelle, divisons le réel en seau, puis chaque transaction sera caractérisée par la valeur de la variable catégorielle et le seau dans lequel la valeur de la variable réelle tombe. Combinez ces deux valeurs, nous obtenons, pour ainsi dire, un analogue du mot pour l'événement.
  • Nous considérons le cas comme une phrase (l'ensemble des mots de la phrase correspond à l'ensemble des événements du cas).
  • ̆ , ̆ ̆, , .
  • ̆, 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 ̆. 

Compter L'



utilisation des fonctionnalités des plongements donne une augmentation de quelques dixièmes de jour.

Finalement

  • Les plongées se sont avérées, bien sûr, sans instruction, car elles se sont un peu entraînées.
  • Il y a environ 290 fonctionnalités issues des intégrations catégorielles et 20 fonctionnalités issues des intégrations sémantiques (cela n'a plus de sens car la taille du dictionnaire est petite), de sorte que l'influence de ces fonctionnalités sémantiques peut être nivelée en raison d'un déséquilibre dans la proportion des fonctionnalités.
  • La sémantique entre les événements doit être en quelque sorte ajoutée à l'ensemble de formation, car du fait que les séquences d'événements (cas) sont ordonnées, l'ordre est important et des informations peuvent en être extraites.
  • Vous pouvez utiliser des architectures plus sophistiquées pour les incorporations.
  • , , — .

All Articles