2017-07-27 3 views
1

Je cherche une méthode/structure de données pour implémenter un système d'évaluation pour un matcher binaire pour une vérification.Convertir une table CSV en structures de données Redis

Ce système sera réparti sur plusieurs PC.

idée de base est décrite dans de nombreux endroits sur Internet, par exemple, dans ce document: https://precisebiometrics.com/wp-content/uploads/2014/11/White-Paper-Understanding-Biometric-Performance-Evaluation.pdf

Ce matcher, que je teste, prend deux éléments de données comme une entrée et calcule un score de correspondance qui reflète leur similitude (un seuil sera alors choisi, en fonction du faux couplage/du faux taux de non-correspondance).

Actuellement je stocke des scores correspondant ainsi que des étiquettes dans un fichier CSV, comme suit:

label1, label2, genuine, 0.1 
label1, label4, genuine, 0.2 
... 
label_2, label_n+1, impostor, 0.8 
label_2, label_n+3, impostor, 0.9 
... 
label_m, label_m+k, genuine, 0.3 
... 

(j'ai une base de données marquée)

Je lance un script python, qui se charge cette table dans Pandas DataFrame et calcule la courbe FMR/FNMR, similaire à celle représentée dans la figure 2 dans le lien ci-dessus. Le traitement est plutôt simple, il suffit de trier les données, de balayer les lignes de haut en bas et de calculer le nombre d'imposteurs/génois sur les rangées au-dessus et en dessous de chaque rangée.

Le système devrait également prendre en charge la recherche de valeurs aberrantes afin de prendre en charge l'amélioration de l'algorithme de correspondance (étiquettes de paires d'éléments de données, résultats originaux anormalement élevés ou scores d'imposteur anormalement petits). C'est aussi assez facile avec les DataFrames (juste trier et prendre des lignes de tête).

Maintenant, je pense à la façon de stocker les données de comparaison dans la RAM au lieu de fichiers CSV sur le disque dur. Je considère Redis à cet égard: la quantité de données est importante, et plusieurs PC sont impliqués dans les calculs, et Redis a une fonction maître-esclave qui lui permet de synchroniser rapidement les données sur le réseau, de sorte que plusieurs PC ont exactement clones de données. C'est gratuit.

Cependant, Redis ne me semble pas très bien convenir pour stocker de telles données tabulaires. Par conséquent, j'ai besoin de changer les structures de données et les algorithmes pour leur traitement. Cependant, ce n'est pas évident pour moi, comment traduire cette table en structures de données Redis.

Une autre option consisterait à utiliser un autre système de stockage de données à la place de Redis. Cependant, je ne suis pas au courant de ces systèmes et serai reconnaissant pour les suggestions.

+1

Vous pourriez utiliser un 'DefaultDict' de [redis-collections] (http://redis-collections.readthedocs.io/en/stable/api.html#redis_collections.dicts.DefaultDict) - chaque clé pourrait stocker une liste des valeurs. – bbayles

Répondre

1

Vous devez en apprendre davantage sur Redis pour relever vos défis. Je vous recommande d'essayer https://try.redis.io et ensuite réfléchir à vos questions. TL; DR - Redis n'est pas un magasin de "données tabulaires", c'est un magasin pour les structures de données. C'est à vous d'utiliser la ou les structures de données qui répondent le mieux à vos requêtes.

IMO qu'est-ce que vous voulez faire est de garder les grandes données (quelle est la taille de toute façon?) Sur le stockage lent et de stocker simplement le modèle (calculs de courbe FMR? Outliers?) Dans Redis. Cela peut presque certainement être fait avec les structures de données de base existantes (probablement des Hashes et des Sets Triés dans ce cas), mais peut-être même de façon plus optimale avec la nouvelle API Modules.Voir le module redis-ml comme un exemple de servir des modèles d'apprentissage machine de Redis (et peut-être votre cas d'utilisation serait une belle addition;))

Avis de non-responsabilité: Je travaille chez Redis Labs, chez Redis et fournisseur de solutions commerciales qui s'appuient sur elle, y compris le module mentionné ci-dessus (open source, licence AGPL).