Scikit-learn: Mettre en œuvre le coefficient de similarité de Gower

Créé le 19 nov. 2015  ·  51Commentaires  ·  Source: scikit-learn/scikit-learn

Comme suggéré par @lesshaste

Article - http://cbio.ensmp.fr/~jvert/svn/bibli/local/Gower1971general.pdf

Je peux mettre en œuvre cela s'il y a un intérêt suffisant?

@jnothman @amueller @agramfort

New Feature

Commentaire le plus utile

Salut,

Afin de contribuer d'une manière ou d'une autre, j'ai implémenté la fonction Gower, selon l'article original, et les adaptations respectives nécessaires dans le module pdist, car en interne, le pdist effectue plusieurs transformations numériques qui échoueront si vous utilisez une matrice avec des données mixtes.

Les résultats que j'ai obtenus avec ceci jusqu'à présent sont les mêmes à partir de la fonction marguerite de R.

Le code source est disponible sur ce notebook jupyter : https://sourceforge.net/projects/gower-distance-4python/files/

Sentez-vous libre de l'utiliser

Tous les 51 commentaires

Merci.

Cette documentation pour daisy de R pourrait également être pertinente https://stat.ethz.ch/R-manual/R-devel/library/cluster/html/daisy.html car c'est un cas d'utilisation populaire pour le coefficient de Gower.

suggéré où? dans quel contexte ?

@agramfort je l'ai suggéré sur gitter. L'intérêt principal de ce coefficient est lorsque les variables sont de types mixtes (c'est-à-dire catégorique, numérique, ordinale) . Un cas d'utilisation populaire est dans le package R daisy() mentionné précédemment lors du regroupement de données avec des types mixtes (voir page 27 de https://cran.r-project.org/web/packages/cluster/cluster.pdf) . Plus généralement, http://www.clustan.talktalk.net/gower_similarity.html affirme que « le coefficient de similarité général de Gower est l'une des mesures de proximité les plus populaires pour les types de données mixtes ». ce qui semble être une affirmation plausible.

y a-t-il une référence ou un exemple convaincant qui motiverait cela?

@agramfort Je pense que c'est plus que nous n'avons actuellement aucun autre moyen de calculer un coefficient de dissemblance pour les types de données mixtes et cela semble être le standard. Je peux trouver de nombreux exemples et questions/réponses en ligne où les gens expliquent ce qu'est le coefficient de Gower ou suggèrent son utilisation pour des types de données mixtes, mais rien que je puisse encore appeler une référence. L'article original a été cité 2298 fois selon Google Scholar.

ok je suis convaincu :)

@agramfort Super ! Ce changement compléterait bien https://github.com/scikit-learn/scikit-learn/pull/4899 qui introduit la prise en charge native des variables catégorielles pour les arbres.

Cela dit, je me rends compte maintenant que scikit-learn n'a actuellement aucun support natif pour les ordinaux, donc cette partie de ma suggestion serait légèrement en avance sur son temps. Je suppose que l'on pourrait le considérer d'une manière positive comme la première étape de la prise en charge des caractéristiques ordinales.

@amueller To be tagged with [New Feature] ...

Salut,

Afin de contribuer d'une manière ou d'une autre, j'ai implémenté la fonction Gower, selon l'article original, et les adaptations respectives nécessaires dans le module pdist, car en interne, le pdist effectue plusieurs transformations numériques qui échoueront si vous utilisez une matrice avec des données mixtes.

Les résultats que j'ai obtenus avec ceci jusqu'à présent sont les mêmes à partir de la fonction marguerite de R.

Le code source est disponible sur ce notebook jupyter : https://sourceforge.net/projects/gower-distance-4python/files/

Sentez-vous libre de l'utiliser

Je me demandais juste s'il y avait eu une mise à jour à ce sujet? De plus, le problème relevé par @marcelobeckmann est-il toujours d'actualité ?

@ashimb9 il semble que nous ayons besoin de quelqu'un pour intégrer le code de @marcelobeckmann

@agramfort Hmm, dans ce cas je vais

Salut, il existe des fonctions privées (par exemple, _convert_to_double, _copy_array_if_base_present) dans pdist qui supposent que les données sous-jacentes sont complètement numériques, ce qui n'est pas vrai lorsque vous avez un Dataframe avec des données catégorielles.

Je me porte volontaire pour intégrer ce code et le rendre disponible dans un fork, vous pouvez m'attribuer ce ticket.

La fonctionnalité d'attribution de github ne fonctionne que pour les membres de l'équipe

Le 17 juillet 2017 à 19h32, "marcelobeckmann" [email protected] a écrit :

Salut, il y a quelques fonctions privées (par exemple, _convert_to_double,
_copy_array_if_base_present) dans pdist qui supposent que les données sous-jacentes sont
complètement numérique, ce qui n'est pas vrai lorsque vous avez un Dataframe avec
données catégorielles.

Je me porte volontaire pour intégrer ce code et le rendre disponible dans un fork, vous
pouvez m'attribuer ce ticket.

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-315707830 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AAEz62L3HHzGsSerW5G3n-Z8rrNoV6mwks5sOyoTgaJpZM4Glm0p
.

Pas de soucis, je vais le forker et vous pourrez obtenir le code plus tard. Pour moi, l'important est de contribuer. Je vous tiendrai au courant une fois terminé.

Merci @marcelobeckmann d'avoir repris cela. Pendant que vous y êtes (et si c'est faisable pour vous), je me demandais si vous envisageriez d'ajouter la prise en charge du calcul de gower sur les données avec des valeurs NaN également, comme implémenté dans le package daisy dans R (que vous avez également référencé ci-dessus) ?

J'ai terminé l'intégration de Gower à sklearn.metrics.pairwise (en observant également le traitement des valeurs NaN). Je vais préparer quelques tests unitaires avant de soumettre mon code forké.

@marcelobeckmann Super ! Merci beaucoup, surtout d'avoir inclus le support NaN ! :)

PS : Si je peux me permettre, vous voudrez peut-être envisager de lancer une demande d'extraction afin que les réviseurs puissent commencer à examiner votre code pendant que vous travaillez sur les tests unitaires, etc.

J'ai fait une pull request il y a quelques jours, b5884.

Oui, il est dans la file d'attente pour être examiné.

Le 17 août 2017 à 23h40, Marcelo Beckmann [email protected]
a écrit:

J'ai fait une pull request il y a quelques jours, b5884.

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-323076581 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AAEz69uMu0XsoAUfvwWikkadjGCk5yvKks5sZELKgaJpZM4Glm0p
.

J'ai apporté les modifications requises par CI, et toutes les vérifications ont réussi.

@marcelobeckmann super travail ! vous voudrez peut-être remplacer la ligne 659 par quelque chose comme :
ranges_of_numeric[col] = (1 - min / max, 0)[max == 0] if (max!=0) else 0.0

Sinon, je reçois une division par zéro avertissement dans votre deuxième cas de test.

Salut, j'ai changé le code pour éviter les avertissements comme proposé par Pierre Wessman, et CI est vert. J'ai besoin de quelqu'un pour revoir mon code.

@marcelobeckmann et potentiellement d'autres.

Salut Marcelo (ou potentiellement d'autres), j'ai quelques questions rapides concernant votre implémentation du coefficient de gower que vous avez placé ici : https://sourceforge.net/projects/gower-distance-4python/files/.

  1. Ai-je besoin d'un dataFrame panda pour alimenter les données d'origine dans la fonction ou puis-je également utiliser un tableau numpy ?

  2. J'importe mes données dans un tableau numpy. Toutes les colonnes sont des nombres réels numériques à l'exception de la première colonne qui est l'ID unique. Je reçois deux problèmes,

  • tout d'abord, lorsque j'exécute la fonction, elle renvoie un avertissement de conversion de données indiquant que le dtype U7 a été converti en objet !!. J'ai supposé que c'était parce que les entrées du tableau, pour une raison quelconque, apparaissent entre guillemets et sont donc des chaînes. J'ai donc converti le type d'entrées du tableau en int32 par exemple et cela donne toujours l'erreur de conversion indiquant que int32 a été converti en objets

  • Deuxièmement, et probablement lié à ci-dessus, chaque fois que j'exécute la fonction et que je trace le résultat, je reçois une visualisation différente (différente répartition des points).

Pourriez-vous me renseigner sur ce qui précède s'il vous plaît ?

Merci beaucoup

Salut Ali,

Merci de votre intérêt pour cette mise en œuvre de la distance Gower.

Bien que le code pour lequel j'ai fait une pull request ne soit pas approuvé par les commiters scikit learn (CI est vert et n'attend qu'un examen), j'ai poussé cette implémentation la plus récente et stable vers : https://sourceforge.net/projects/gower-distance -4python/files/gower_function-v3.ipynb/download

C'est parti pour vos questions :

  1. Ai-je besoin d'un Panda DataFrame pour alimenter les données d'origine dans la fonction ou puis-je également utiliser un tableau numpy ?

Réponse : Vous pouvez utiliser DataFrame ou Numpy dans cette nouvelle version 3. Les matrices creuses sont également prises en charge.

  1. . J'importe mes données dans un tableau numpy. Toutes les colonnes sont des nombres réels numériques à l'exception de la première colonne qui est l'ID unique. Je reçois deux problèmes,
  • tout d'abord, lorsque j'exécute la fonction, elle renvoie un avertissement de conversion de données indiquant que le dtype U7 a été converti en objet !!. J'ai supposé que c'était parce que les entrées du tableau, pour une raison quelconque, apparaissent entre guillemets et sont donc des chaînes. J'ai donc converti le type d'entrées du tableau en int32 par exemple et cela donne toujours l'erreur de conversion indiquant que int32 a été converti en objets

Réponse : Cette nouvelle version prend en charge les attributs catégoriels numériques, il existe un paramètre supplémentaire categorical_features, que vous pouvez définir un tableau avec false (pour les attributs numériques) ou true (pour les attributs catégoriques)

  • Deuxièmement, et probablement lié à ci-dessus, chaque fois que j'exécute la fonction et que je trace le résultat, je reçois une visualisation différente (différente répartition des points).

Réponse : La nouvelle version que j'ai poussée a résolu ce problème.

notez que j'ai l'intention de revoir ce PR, mais il n'est pas très élevé
guichet automatique prioritaire

Salut Ali,

  1. Le dernier en date est gower_function-v3.ipynb, et oui il traite de nan
    propagation

  2. Vous pouvez utiliser gower_distance(X) uniquement, si vos att catégoriques ne sont pas
    numeric, ou gower_distance(X, categorical_features=[False, True,
    False,...]), si vos attr cat sont représentés sous forme numérique.

Faites-moi savoir en privé si vous avez un problème, car cette implémentation
J'ai poussé vers internet ne devrait pas être le souci de scikit learn, ils ont un
beaucoup à faire, et ce n'est pas le meilleur endroit pour en discuter.

Le 30 novembre 2017 à 11h51, "Ali-ry" [email protected] a écrit :

@marcelobeckmann https://github.com/marcelobeckmann

Salut Marcelo (ou potentiellement d'autres), j'ai une petite question concernant votre
mise en œuvre du coefficient de gower que vous avez placé ici :
https://sourceforge.net/projects/gower-distance-4python/files/

1.

La fonction gower_single_function-v2.ipynb est-elle la version finale et traite-t-elle
NaN aussi ?
2.

plus important encore, cette mise en œuvre vous permet-elle d'obtenir le
similitudes au sein d'un seul échantillon de données ? car dans la plupart des cas ce que vous
besoin est d'obtenir la distance de gower entre chaque paire d'observation dans
un seul échantillon de données plutôt que de comparer deux échantillons de données différents.

Merci beaucoup

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-348166596 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AA3G79jWVbpBNdAFOAim7wJS92-QGl0dks5s7pa8gaJpZM4Glm0p
.

Salut Ali,

  1. Le dernier est gower_function-v3.ipynb, et c'est une copie de celui que j'ai poussé à scikit learn, et oui, il traite de la propagation nan

  2. Vous pouvez utiliser gower_distance(X) uniquement, si vos attr catégoriques ne sont pas numériques, ou gower_distance(X, categorical_features=[False, True, False,...]), si vos attr catégoriques sont représentés sous forme numérique.

S'il vous plaît laissez-moi savoir en privé si vous avez un problème, car cette implémentation que j'ai poussée sur Internet ne devrait pas être le souci de scikit learn, ils ont beaucoup à faire, et ce n'est pas le meilleur endroit pour discuter de quelque chose qui est en dehors de scikit projet d'apprentissage.

@marcelobeckmann Bonjour Marcelo,
La valeur du paramètre categorical_features doit-elle être True ou False si les variables catégorielles sont codées dans un format numérique ?

J'obtiens également l'erreur suivante :
ValueError : tableau trouvé avec 0 échantillon(s) (shape=(0, 0)) alors qu'un minimum de 1 est requis par check_pairwise_arrays.

Cela fonctionnait avec succès dans les mêmes données auparavant, mais maintenant cela donne une telle erreur. Pourquoi cela pourrait-il être ?

Salut @bendiste ,

Si vous représentez Vrai et Faux par 1 et 0, vous obtiendrez les mêmes résultats.

Utilisez-vous le dernier ordinateur portable gower_function-v6.4.ipynb dans
https://sourceforge.net/projects/gower-distance-4python/files/
?

Je suis en train de finir d'écrire un article, j'espère que ce mois-ci je vais apporter les modifications demandées pour que mon implémentation soit acceptée dans le master de scikit-learn.

Bonjour @marcelobeckmann , merci pour votre réponse. Et oui, j'utilise la dernière version que vous avez indiquée. Lorsque je l'ai retéléchargé, cela a fonctionné avec succès. Étant donné que je suis un débutant en apprentissage automatique, j'aimerais poser quelques questions :
1- Puis-je utiliser KPCA pour réduire les dimensions en entrée de l'algorithme de clustering hiérarchique ?
2- Ou dois-je utiliser l'ensemble de données complet avec une dimensionnalité élevée comme entrée pour le clustering hiérarchique ?

Salut @marcelobeckmann ,
merci pour cette réalisation !

J'ai essayé la version gower_function-v6.4.
Je peux voir que les distances dans vos tests unitaires sont les mêmes, peu importe si vous spécifiez les colonnes catégorielles ou non. J'ai également essayé avec mes propres données, où cela n'affecte pas non plus le résultat.

Est-ce correct?

Merci!

Salut @annelaura ,

Désolé pour le délai de réponse. Oui, c'est correct, ce test visait juste à vérifier si les paramètres categorical_features=[0, 1] n'affecteront pas les résultats, si les colonnes non numériques peuvent également être identifiées comme des objets. Les données d'entrée sont les mêmes, donc les résultats doivent être les mêmes.

Après avoir terminé quelques papiers, je me remets au travail pour enfin proposer mon implémentation à scikit master branch ! :)

@marcelobeckmann des nouvelles à ce sujet ? :)

Salut Alex, j'ai terminé toutes les modifications que les examinateurs ont demandées jusqu'à présent dans la demande d'extraction, et CI est vert. J'ai également envoyé un ping aux examinateurs pour vérifier s'ils étaient satisfaits, puis nous pouvons fermer cette demande d'extraction et la pousser à la publication.

Les mises à jour? @marcelobeckmann

Travaux en cours après examen.

Le PR a-t-il été approuvé ? @marcelobeckmann

Pas encore, le travail est en cours après une récente révision du code.

Dommage que j'en ai besoin.

Est-ce que la fonction est disponible quelque part ? Je peux donc l'utiliser moi-même (à des fins de recherche)

Merci

Vous pouvez prendre le dernier commit de cette fonction dans ce PR :
https://github.com/scikit-learn/scikit-learn/pull/9555

J'ai réussi à le faire fonctionner localement. Merci!

Juste un petit +1 sur ce ticket ! Merci pour tout ce travail.

Cogner. Ce serait un excellent ajout. Je n'arrive pas à croire qu'il ait fallu 4 ans pour qu'un calcul relativement simple le transforme en sklearn !!

Ou vous pourriez dire : merci pour votre persévérance dévouée pendant quatre ans de
effort bénévole !

Ou vous pourriez dire : merci pour votre persévérance dévouée pendant quatre ans d'efforts bénévoles !

Tu as raison, désolé. Je ne voulais pas paraître impoli. J'apprécie beaucoup l'effort. Je l'utilise localement depuis un certain temps maintenant, et ce serait formidable de le voir ajouté. C'est la seule métrique de distance que je connaisse pour les types de données mixtes.

Mis à part l'effort bénévole, et que les développeurs principaux n'ont pas pris en compte
cette urgence, il y a en effet des défis autour de la façon de gérer les types mixtes,
et autour de la façon d'effectuer la mise à l'échelle dans une configuration de test de train.

J'attends avec impatience dans sklearn.

Quelqu'un qui prétend avoir " emprunté des idées " à ce fil a publié un package sur github pour calculer la distance de Gower (similarité, techniquement). En parlant de distance et de similitude, l'exemple est identique à celui de @marcelobeckmann. Je n'ai jeté qu'un coup d'œil au code jusqu'à présent, mais voici un aperçu :

Extrait du cahier de

    # This is to normalize the numeric values between 0 and 1.
    X_num = np.divide(X_num ,max_of_numeric,out=np.zeros_like(X_num), where=max_of_numeric!=0)

De "Michael Yan":

    # This is to normalize the numeric values between 0 and 1.
    Z_num = np.divide(Z_num ,num_max,out=np.zeros_like(Z_num), where=num_max!=0)

Salut les gars, merci de garder un œil dessus.

Je suis content que les gens prennent le code et essaient de l'améliorer, c'est le but d'être open source, bien qu'un certain crédit soit apprécié.

Espérons que ce code fera partie de scikit-learn, si ce PR #9555 est accepté.

Meilleures salutations,

Marcelo Beckmann

Bonne chance dans le processus !!

Cette page vous a été utile?
0 / 5 - 0 notes