
1️⃣st Place au Sigir Eom Challenge 2020
2️⃣nd Place and Best Paper Award sur WSDM Booking.com Challenge 2021
2️⃣nd place sur Twitter Recsys Challenge 2021
3️⃣rd Place à KDD Cup 2021
Cleora est un genre de papillons dans la famille des Geometridae . Leur nom scientifique dérive de l'ancien grec grec γῆ ou γαῖα "la Terre", et de la "mesure" de Metron μέτρον en référence à la façon dont leurs larves, ou "vers de pouces", semblent " mesurer la Terre " alors qu'ils se déplacent dans une boucle mode.
Cleora est un modèle à usage général pour l'apprentissage efficace et évolutif des intérêts stables et inductifs pour les données relationnelles hétérogènes.
Installation
pip install pycleora
Construire des instructions
# prepare python env
pip install maturin
# Install pycleora in current env (meant for development)
maturin develop
# Usage example below. More examples in examples/ folder.
Cleora est désormais disponible sous forme de Python Package pycleora . Améliorations clés par rapport à la version précédente:
iterators en plus des fichiers tsvNumPyChangements de rupture:
complex::reflexive pour les incorporations hypergraphiques, regroupées par l'entité transitoire donne de meilleurs résultats. from pycleora import SparseMatrix
import numpy as np
import pandas as pd
import random
# Generate example data
customers = [f"Customer_{i}" for i in range(1, 20)]
products = [f"Product_{j}" for j in range(1, 20)]
data = {
"customer": random.choices(customers, k=100),
"product": random.choices(products, k=100),
}
# Create DataFrame
df = pd.DataFrame(data)
# Create hyperedges
customer_products = df.groupby('customer')['product'].apply(list).values
# Convert to Cleora input format
cleora_input = map(lambda x: ' '.join(x), customer_products)
# Create Markov transition matrix for the hypergraph
mat = SparseMatrix.from_iterator(cleora_input, columns='complex::reflexive::product')
# Look at entity ids in the matrix, corresponding to embedding vectors
print(mat.entity_ids)
# ['Product_5', 'Product_3', 'Product_2', 'Product_4', 'Product_1']
# Initialize embedding vectors externally, using text, image, random vectors
# embeddings = ...
# Or use built-in random deterministic initialization
embeddings = mat.initialize_deterministically(1024)
# Perform Markov random walk, then normalize however many times we want
NUM_WALKS = 3 # The optimal number depends on the graph, typically between 3 and 7 yields good results
# lower values tend to capture co-occurrence, higher iterations capture substitutability in a context
for i in range(NUM_WALKS):
# Can propagate with a symmetric matrix as well, but left Markov is a great default
embeddings = mat.left_markov_propagate(embeddings)
# Normalize with L2 norm by default, for the embeddings to reside on a hypersphere. Can use standardization instead.
embeddings /= np.linalg.norm(embeddings, ord=2, axis=-1, keepdims=True)
# We're done, here are our embeddings
for entity, embedding in zip(mat.entity_ids, embeddings):
print(entity, embedding)
# We can now compare our embeddings with dot product (since they are L2 normalized)
print(np.dot(embeddings[0], embeddings[1]))
print(np.dot(embeddings[0], embeddings[2]))
print(np.dot(embeddings[0], embeddings[3]))
Q: Que dois-je intégrer?
R: Toutes les entités qui interagissent les unes avec les autres, co-occurant ou peuvent être considérées comme présentes ensemble dans un contexte donné. Les exemples peuvent inclure: produits dans un panier, des emplacements fréquentés par les mêmes personnes à des moments similaires, les employés collaborant ensemble, les molécules chimiques étant présentes dans des circonstances spécifiques, les protéines produites par les mêmes bactéries, les interactions médicamenteuses, les co-auteurs des mêmes documents universitaires , les entreprises se produisant ensemble dans les mêmes profils LinkedIn.
Q: Comment dois-je construire l'entrée?
R: Ce qui fonctionne le mieux, c'est le regroupement des entités concomitant dans un contexte similaire, et les nourrir dans des lignes séparées par les espaces en utilisant le modificateur complex::reflexive est une bonne idée. Par exemple, si vous avez des données de produit, vous pouvez regrouper les produits par des paniers d'achat ou par les utilisateurs. Si vous avez des URL, vous pouvez les regrouper par sessions de navigateur, de paires (utilisateur, fenêtre temporelle). Consultez l'exemple d'utilisation ci-dessus. Le regroupement des produits par les clients n'est qu'une possibilité.
Q: Puis-je intégrer simultanément les utilisateurs et les produits, pour les comparer avec la similitude du cosinus?
R: Non, il s'agit d'une approche méthodologiquement mauvaise, provenant d'approches de factorisation de la matrice obsolète. Ce que vous devez faire, c'est d'abord proposer de bons intérêts de produits, puis en créer des incorporations utilisateur. L'alimentation de deux colonnes, par exemple, user product dans CLEORA se traduira par un graphique bipartite. Des produits similaires seront proches les uns des autres, les utilisateurs similaires seront proches les uns des autres, mais les utilisateurs et les produits ne seront pas nécessairement similaires les uns aux autres.
Q: Quelle dimensionnalité d'intégration à utiliser?
R: Plus il y a, mieux c'est, mais nous travaillons généralement de 1024 à 4096 . La mémoire est bon marché et les machines sont puissantes, alors ne lésinez pas sur la taille de l'intégration.
Q: Combien d'itérations de propagation de Markov dois-je utiliser?
R: Cela dépend de ce que vous voulez réaliser. Les faibles itérations (3) ont tendance à approximer la matrice de cooccurrence, tandis que les itérations élevées (7+) ont tendance à donner une similitude contextuelle (pensez à skip-gram mais beaucoup plus précise et plus rapide).
Q: Comment puis-je incorporer des informations externes, par exemple les métadonnées entités, les images, les textes dans les intégres?
R: Initialisez simplement la matrice d'intégration avec vos propres vecteurs provenant d'un VIT, transformateurs de sedence, d'une projection aléatoire de vos fonctionnalités numériques. Dans ce scénario, de faibles nombres d'itérations de Markov (1 à 3) ont tendance à fonctionner le mieux.
Q: Mes intérêts ne tiennent pas dans la mémoire, que dois-je faire?
R: Cleora opère sur les dimensions indépendamment. Initialisez vos intérêts avec un plus petit nombre de dimensions, exécutez Cleora, persistez vers le disque, puis répétez. Vous pouvez concaténer vos vecteurs d'intégration résultants par la suite, mais n'oubliez pas de les normaliser par la suite!
Q: Y a-t-il un nombre minimum d'occurrences d'entité?
R: Non, une entité A co-occupant une seule fois avec une autre entité B obtiendra une intégration appropriée, c'est-à-dire que B sera le plus similaire à A . L'inverse, A sera fortement classé parmi les voisins les plus proches de B , qui peuvent ou non être souhaitables, selon votre cas d'utilisation. N'hésitez pas à tailler votre contribution à Cleora pour éliminer les éléments à basse fréquence.
Q: Y a-t-il des cas de bord où Cleora peut échouer?
R: Cleora fonctionne mieux pour les hypergraphes relativement clairsemés. Si toutes vos hyperedges contiennent une entité très courante X , par exemple un sac à provisions , il dégradera la qualité des intégres en dégénérant les chemins les plus courts dans la marche aléatoire. C'est une bonne pratique de retirer ces entités de l'hypergraphe.
Q: Comment Cleora peut-elle être si rapide et précise en même temps?
R: Ne pas utiliser d'échantillonnage négatif est une grande aubaine. En construisant la matrice de transition de Markov (clairsemée), Cleora effectue explicitement toutes les promenades aléatoires possibles dans un hypergraphe en une grande étape (une seule multiplication de la matrice). C'est ce que nous appelons une seule itération . Nous effectuons 3+ de telles itérations. Grâce à une implémentation très efficace dans la rouille, avec des soins particuliers pour la concurrence, la disposition de la mémoire et la cohérence du cache, il est rapide. L'échantillonnage négatif ou la sélection aléatoire des promenades aléatoires ont tendance à introduire beaucoup de bruit - Cleora est exempte de ces charges.
Lisez le livre blanc "Cleora: un schéma d'intégration de graphes simples, forts et évolutifs"
Cleora intégre les entités dans des espaces sphériques à n dimensions utilisant des projections aléatoires itératives extrêmement rapides et itératives, ce qui permet des performances et de l'évolutivité inégalées.
Les types de données qui peuvent être intégrés comprennent par exemple:
!!! Avertissement: les chiffres ci-dessous sont pour Cleora 1.x, la nouvelle version est nettement plus rapide, mais doit encore ré-cours les repères
Avantages concurrentiels clés de Cleora:
Temps d'intégration - Exemple:
| Algorithme | Ensemble de données FB | Ensemble de données RoadNet | Ensemble de données LiveJournal |
| Cleora | 00:00:43 H | 00:21:59 H | 01:31:42 H |
| Pytorch-bigraph | 00: 04.33 H | 00:31:11 H | 07:10:00 H |
Résultats de la prédiction des liens - Exemple:
| Ensemble de données FB | Ensemble de données RoadNet | Ensemble de données LiveJournal | ||||
| Algorithme | MRR | Hitrate @ 10 | MRR | Hitrate @ 10 | MRR | Hitrate @ 10 |
| Cleora | 0,072 | 0,172 | 0,929 | 0,942 | 0,586 | 0,627 |
| Pytorch-bigraph | 0,035 | 0,072 | 0,850 | 0,866 | 0,565 | 0,672 |
Cleora est construite comme un outil polyvalent "Just Iced It", adapté à de nombreux types et formats de données différents.
Cleora ingère un tableau relationnel des lignes représentant un hypergraphe hétérogène dactylographié et non dirigé, qui peut contenir plusieurs:
Par exemple, un tableau relationnel représentant des paniers d'achat peut avoir les colonnes suivantes:
user <t> product <t> store
Avec le fichier d'entrée contenant des valeurs:
user_id <t> product_id product_id product_id <t> store_id
Chaque colonne a un type, qui est utilisé pour déterminer si des espaces d'identifiants entre différentes colonnes sont partagés ou distincts. Il est possible pour deux colonnes de partager un type, ce qui est le cas pour les graphiques homogènes:
user <t> user
Basé sur la spécification du format de colonne, Cleora fonctionne:
La sortie finale de Cleora se compose de plusieurs fichiers pour chaque paire (non dirigée) de types d'entités dans le tableau.
Ces intérêts peuvent ensuite être utilisés de manière nouvelle grâce à leur propriété d'indépendance sage, qui est décrite plus loin.
Les intérêts produits par Cleora sont différents de ceux produits par Node2Vec, Word2Vec, Deepwalk ou d'autres systèmes de cette classe par un certain nombre de propriétés clés:
Les propriétés techniques décrites ci-dessus impliquent une bonne préparation à la production de Cleora, qui du point de vue de l'utilisateur final peut être résumé comme suit:
!!! Avertissement La documentation ci-dessous est pour Cleora 1.x, à mettre à jour pour 2.x
Plus d'informations peuvent être trouvées dans la documentation complète.
Pour plus de détails, contactez-nous à [email protected]
Veuillez citer notre article (et les articles respectifs des méthodes utilisées) si vous utilisez ce code dans votre propre travail:
@article{DBLP:journals/corr/abs-2102-02302,
author = {Barbara Rychalska, Piotr Babel, Konrad Goluchowski, Andrzej Michalowski, Jacek Dabrowski},
title = {Cleora: {A} Simple, Strong and Scalable Graph Embedding Scheme},
journal = {CoRR},
year = {2021}
}
Synerrise Cleora est sous licence MIT, comme le montre le fichier de licence.
Les demandes de traction sont les bienvenues.