Scikit-learn: Implementieren Sie den Gower-Ähnlichkeitskoeffizienten

Erstellt am 19. Nov. 2015  ·  51Kommentare  ·  Quelle: scikit-learn/scikit-learn

Wie von @lesshaste vorgeschlagen

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

Kann ich das bei ausreichendem Interesse umsetzen?

@jnothman @amueller @agramfort

New Feature

Hilfreichster Kommentar

Hi,

Um irgendwie dazu beizutragen, habe ich die Gower-Funktion gemäß dem Originalpapier implementiert und die entsprechenden Anpassungen im Modul pdist notwendig, da pdist intern mehrere numerische Transformationen vornimmt, die fehlschlagen, wenn Sie eine Matrix mit gemischten Daten verwenden.

Die Ergebnisse, die ich damit bisher erhalten habe, sind die gleichen mit der Gänseblümchenfunktion von R.

Der Quellcode ist in diesem Jupyter-Notebook verfügbar: https://sourceforge.net/projects/gower-distance-4python/files/

Fühlen Sie sich frei, es zu verwenden

Alle 51 Kommentare

Vielen Dank.

Diese Dokumentation für daisy von R könnte auch relevant sein https://stat.ethz.ch/R-manual/R-devel/library/cluster/html/daisy.html, da es ein beliebter Anwendungsfall für . ist der Gower-Koeffizient.

vorgeschlagen wo? in welchem ​​Kontext?

@agramfort Ich habe es auf daisy() beim Clustern von Daten mit gemischten Typen (siehe Seite 27 von https://cran.r-project.org/web/packages/cluster/cluster.pdf). . Allgemeiner gesagt http://www.clustan.talktalk.net/gower_similarity.html behauptet "Gowers allgemeiner Ähnlichkeitskoeffizient ist einer der beliebtesten Näherungswerte für gemischte Datentypen." was eine plausible Behauptung zu sein scheint.

Gibt es einen Benchmark oder ein überzeugendes Beispiel, das dies motiviert?

@agramfort Ich denke, es ist eher so, dass wir derzeit keine andere Möglichkeit haben, einen Unähnlichkeitskoeffizienten für gemischte Datentypen zu berechnen, und dies scheint der Standard zu sein. Ich kann viele Beispiele und Fragen/Antworten online finden, in denen Leute erklären, was der Gower-Koeffizient ist oder seine Verwendung für gemischte Datentypen vorschlagen, aber noch nichts, was ich als Benchmark bezeichnen könnte. Das Originalpapier wurde laut Google-Stipendiat 2298 Mal zitiert.

ok ich bin überzeugt :)

@agramfort Großartig! Diese Änderung würde https://github.com/scikit-learn/scikit-learn/pull/4899 gut ergänzen, wodurch native kategoriale Variablenunterstützung für Bäume eingeführt wird.

Allerdings ist mir jetzt klar, dass scikit-learn derzeit überhaupt keine native Unterstützung für Ordinalzahlen bietet, sodass dieser Teil meines Vorschlags seiner Zeit etwas voraus wäre. Ich nehme an, man könnte es positiv als ersten Schritt zur Unterstützung von Ordinalmerkmalen betrachten.

@amueller Zu [New Feature] ...

Hi,

Um irgendwie dazu beizutragen, habe ich die Gower-Funktion gemäß dem Originalpapier implementiert und die entsprechenden Anpassungen im Modul pdist notwendig, da pdist intern mehrere numerische Transformationen vornimmt, die fehlschlagen, wenn Sie eine Matrix mit gemischten Daten verwenden.

Die Ergebnisse, die ich damit bisher erhalten habe, sind die gleichen mit der Gänseblümchenfunktion von R.

Der Quellcode ist in diesem Jupyter-Notebook verfügbar: https://sourceforge.net/projects/gower-distance-4python/files/

Fühlen Sie sich frei, es zu verwenden

Ich wollte nur fragen, ob es dazu ein Update gibt? Ist das von Problem noch relevant?

@ashimb9 es scheint, dass wir jemanden brauchen, der den Code von @marcelobeckmann integriert

@agramfort Hmm , in diesem Fall werde ich es

Hallo, es gibt einige private Funktionen (zB _convert_to_double, _copy_array_if_base_present) in pdist, die davon ausgehen, dass die zugrunde liegenden Daten vollständig numerisch sind, was nicht zutrifft, wenn Sie einen Datenrahmen mit kategorialen Daten haben.

Ich möchte diesen Code freiwillig integrieren und in einem Fork zur Verfügung stellen, Sie können mir dieses Ticket zuordnen.

Die github-Zuweisungsfunktion funktioniert nur für Teammitglieder

Am 17. Juli 2017 um 19:32 Uhr schrieb "marcelobeckmann" [email protected] :

Hallo, es gibt einige private Funktionen (zB _convert_to_double,
_copy_array_if_base_present) in pdist, die davon ausgehen, dass die zugrunde liegenden Daten
vollständig numerisch, was nicht zutrifft, wenn Sie einen Datenrahmen mit haben
kategoriale Daten.

Ich melde mich freiwillig, diesen Code zu integrieren und in einem Fork verfügbar zu machen, du
kann mir dieses Ticket zuordnen.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-315707830 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz62L3HHzGsSerW5G3n-Z8rrNoV6mwks5sOyoTgaJpZM4Glm0p
.

Keine Sorge, ich werde es forken und Sie können den Get-Code später erhalten. Für mich ist es wichtig, einen Beitrag zu leisten. Ich werde Sie wissen lassen, wenn Sie fertig sind.

Danke @marcelobeckmann für die Aufnahme. Wenn Sie schon dabei sind (und wenn es für Sie machbar ist), habe ich mich gefragt, ob Sie in Betracht ziehen würden, die Gower-Berechnung auch für Daten mit NaN-Werten zu unterstützen, wie sie im Daisy-Paket in R implementiert sind (auf das Sie auch oben verwiesen haben). ?

Ich habe die Integration von Gower in sklearn.metrics.pairwise abgeschlossen (wobei auch die Behandlung von NaN-Werten beobachtet wurde). Ich werde einige Unit-Tests vorbereiten, bevor ich meinen gespaltenen Code einreiche.

@marcelobeckmann Toll! Vielen Dank, vor allem für die Aufnahme der NaN-Unterstützung! :)

PS: Wenn ich vorschlagen darf, sollten Sie in Betracht ziehen, einen Pull-Request zu initiieren, damit die Reviewer Ihren Code betrachten können, während Sie an den Unit-Tests usw. arbeiten.

Ich habe vor einigen Tagen eine Pull-Anfrage gestellt, b5884.

Ja, es befindet sich in der Warteschlange zur Überprüfung.

Am 17. August 2017 um 23:40 Uhr Marcelo Beckmann [email protected]
schrieb:

Ich habe vor einigen Tagen eine Pull-Anfrage gestellt, b5884.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-323076581 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz69uMu0XsoAUfvwWikkadjGCk5yvKks5sZELKgaJpZM4Glm0p
.

Ich habe die von CI geforderten Änderungen vorgenommen und alle Prüfungen wurden bestanden.

@marcelobeckmann tolle
ranges_of_numeric[col] = (1 - min / max, 0)[max == 0] if (max!=0) else 0.0

Ansonsten bekomme ich in Ihrem zweiten Testfall eine Division durch Null-Warnungen.

Hallo, ich habe den Code geändert, um Warnungen zu vermeiden, wie von Pierre Wessman vorgeschlagen, und CI ist grün. Ich brauche jemanden, der meinen Code überprüft.

@marcelobeckmann und möglicherweise andere.

Hallo Marcelo (oder möglicherweise andere), habe ein paar kurze Fragen zu Ihrer Implementierung des Gower-Koeffizienten, die Sie hier platziert haben: https://sourceforge.net/projects/gower-distance-4python/files/.

  1. Benötige ich einen Panda-DataFrame, um die Originaldaten in die Funktion einzuspeisen, oder kann ich auch ein numpy-Array verwenden?

  2. Ich importiere meine Daten in ein numpy-Array. Alle Spalten sind numerische reelle Zahlen mit Ausnahme der ersten Spalte, die die eindeutige ID ist. Ich bekomme zwei Probleme,

  • Erstens, wenn ich die Funktion ausführe, gibt sie eine Datenkonvertierungswarnung zurück, die besagt, dass der dtype U7 in ein Objekt konvertiert wurde!!. Ich ging davon aus, dass die Array-Einträge aus irgendeinem Grund in Anführungszeichen stehen und daher Zeichenfolgen sind. Also habe ich den Typ der Array-Einträge zum Beispiel in int32 umgewandelt und es gibt immer noch den Konvertierungsfehler, der besagt, dass int32 in Objekte konvertiert wurde

  • Zweitens, und wahrscheinlich mit oben verlinkt, erhalte ich jedes Mal, wenn ich die Funktion ausführe und das Ergebnis zeichne, eine andere Visualisierung (unterschiedliche Verteilung der Punkte).

Könnten Sie mich bitte zu den oben genannten Punkten beraten?

Vielen Dank

Hallo Ali,

Vielen Dank für Ihr Interesse an dieser Implementierung der Gower-Distanz.

Während der Code, den ich als Pull-Request erstellt habe, von scikit Learn Commitern nicht genehmigt wurde (CI ist grün und wartet nur auf eine Überprüfung), habe ich diese neueste und stabile Implementierung auf: https://sourceforge.net/projects/gower-distance . verschoben -4python/files/gower_function-v3.ipynb/download

Kommen wir zu deinen Fragen:

  1. Benötige ich einen Panda DataFrame, um die Originaldaten in die Funktion einzuspeisen, oder kann ich auch ein numpy-Array verwenden?

Antwort: Sie können DataFrame oder Numpy in dieser neuen Version 3 verwenden. Sparse-Matrizen werden ebenfalls unterstützt.

  1. . Ich importiere meine Daten in ein numpy-Array. Alle Spalten sind numerische reelle Zahlen mit Ausnahme der ersten Spalte, die die eindeutige ID ist. Ich bekomme zwei Probleme,
  • Erstens, wenn ich die Funktion ausführe, gibt sie eine Datenkonvertierungswarnung zurück, die besagt, dass der dtype U7 in ein Objekt konvertiert wurde!!. Ich ging davon aus, dass die Array-Einträge aus irgendeinem Grund in Anführungszeichen stehen und daher Zeichenfolgen sind. Also habe ich den Typ der Array-Einträge zum Beispiel in int32 umgewandelt und es gibt immer noch den Konvertierungsfehler, der besagt, dass int32 in Objekte konvertiert wurde

Antwort: Diese neue Version unterstützt numerische kategoriale Attribute, es gibt einen zusätzlichen Parameter categorical_features, mit dem Sie ein Array mit false (für numerische Attribute) oder true (für kategoriale) setzen können.

  • Zweitens, und wahrscheinlich mit oben verlinkt, erhalte ich jedes Mal, wenn ich die Funktion ausführe und das Ergebnis zeichne, eine andere Visualisierung (unterschiedliche Verteilung der Punkte).

Antwort: Die neue Version, die ich gepusht habe, hat dieses Problem gelöst.

Beachten Sie, dass ich beabsichtige, diesen PR zu überprüfen, aber er ist nicht sehr hoch
Priorität atm

Hallo Ali,

  1. Die neueste ist gower_function-v3.ipynb, und ja, sie befasst sich mit nan
    Vermehrung

  2. Sie können gower_distance(X) nur verwenden, wenn Ihre kategoriale Att dies nicht ist
    numerisch oder gower_distance(X, categorical_features=[False, True,
    False,...]), wenn Ihre Katzenattribute numerisch dargestellt werden.

Lassen Sie es mich privat wissen, wenn Sie ein Problem haben, da diese Implementierung
Ich habe auf das Internet gedrängt, sollte nicht das Anliegen von scikit lernen sein, sie haben ein
viel zu tun, und hier ist nicht der beste Ort, um darüber zu diskutieren.

Am 30. November 2017, 11:51 Uhr schrieb "Ali-ry" [email protected] :

@marcelobeckmann https://github.com/marcelobeckmann

Hallo Marcelo (oder möglicherweise andere), habe eine kurze Frage zu deinem
Implementierung des Gower-Koeffizienten, den Sie hier platziert haben:
https://sourceforge.net/projects/gower-distance-4python/files/

1.

Ist die gower_single_function-v2.ipynb die finale Version und beschäftigt sich damit
NaN auch?
2.

noch wichtiger, ermöglicht Ihnen diese Implementierung, die
Ähnlichkeiten innerhalb einer einzigen Stichprobe? denn in den meisten Fällen was du
Notwendigkeit besteht darin, den Gower-Abstand zwischen jedem Beobachtungspaar innerhalb von . zu erhalten
eine einzelne Stichprobendaten im Gegensatz zum Vergleich zweier unterschiedlicher Stichprobendaten.

Vielen Dank


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-348166596 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AA3G79jWVbpBNdAFOAim7wJS92-QGl0dks5s7pa8gaJpZM4Glm0p
.

Hallo Ali,

  1. Das neueste ist gower_function-v3.ipynb, und es ist eine Kopie von dem, das ich auf scikit learn gedrängt habe, und ja, es befasst sich mit der nan-Ausbreitung

  2. Sie können gower_distance(X) nur verwenden, wenn Ihre kategorialen Attribute nicht numerisch sind, oder gower_distance(X, categorical_features=[False, True, False,...]), wenn Ihre kategorialen Attribute numerisch dargestellt werden.

Bitte lassen Sie es mich privat wissen, wenn Sie ein Problem haben, denn diese Implementierung, die ich ins Internet verschoben habe, sollte nicht das Anliegen von scikit learn sein, sie haben viel zu tun und hier ist nicht der beste Ort, um etwas zu besprechen, das außerhalb von scikit liegt Projekt lernen.

@marcelobeckmann Hallo Marcelo,
Sollte der Wert des Parameters categorical_features True oder False sein, wenn die kategorialen Variablen in ein numerisches Format codiert sind?

Ich bekomme auch folgenden Fehler:
ValueError: Array mit 0 Sample(s) (shape=(0, 0)) gefunden, während check_pairwise_arrays mindestens 1 benötigt.

Es hat zuvor in den gleichen Daten erfolgreich funktioniert, aber jetzt gibt es einen solchen Fehler. Warum könnte es sein?

Hallo @bendiste ,

Wenn Sie True und False als 1 und 0 darstellen, erhalten Sie die gleichen Ergebnisse.

Verwenden Sie das neueste Notebook gower_function-v6.4.ipynb in
https://sourceforge.net/projects/gower-distance-4python/files/
?

Ich bin gerade dabei, einen Artikel zu schreiben, hoffentlich werde ich diesen Monat die gewünschten Änderungen vornehmen, damit meine Implementierung im Master of Scikit-Learn akzeptiert wird.

Hallo @marcelobeckmann , danke für deine Antwort. Und ja, ich verwende die neueste Version, die Sie angegeben haben. Als ich es erneut heruntergeladen habe, hat es erfolgreich funktioniert. Ich möchte ein paar Dinge fragen, da ich ein Neuling im maschinellen Lernen bin:
1- Kann ich KPCA verwenden, um Dimensionen als Eingabe für den hierarchischen Clustering-Algorithmus zu verringern?
2- Oder muss ich den gesamten Datensatz mit hoher Dimensionalität als Eingabe für das hierarchische Clustering verwenden?

Hallo @marcelobeckmann ,
danke für diese Umsetzung!

Ich habe die gower_function-v6.4-Version ausprobiert.
Ich kann sehen, dass die Abstände in Ihren Unit-Tests gleich sind, egal ob Sie die kategorialen Spalten angeben oder nicht. Ich habe es auch mit meinen eigenen Daten versucht, wo es das Ergebnis ebenfalls nicht beeinflusst.

Ist das richtig?

Dankeschön!

Hallo @annelaura ,

Entschuldigung für die verspätete Antwort. Ja, das ist richtig, dieser Test war nur, um zu überprüfen, ob die Parameter categorical_features=[0, 1] die Ergebnisse nicht beeinflussen, wenn auch die nicht numerischen Spalten als Objekte identifiziert werden können. Die Eingabedaten sind gleich, daher müssen die Ergebnisse gleich sein.

Nachdem ich einige Papiere fertiggestellt habe, bin ich wieder an der Arbeit, um endlich meine Implementierung für den Scikit-Master-Zweig vorzuschlagen! :)

@marcelobeckmann gibt es dazu Neuigkeiten? :)

Hallo Alex, ich habe alle Änderungen abgeschlossen, die die Rezensenten bisher im Pull-Request gefragt haben, und CI ist grün. Ich habe auch die Rezensenten angepingt, um zu überprüfen, ob sie zufrieden sind, dann können wir diese Pull-Anfrage schließen und zur Freigabe pushen.

Irgendwelche Aktualisierungen? @marcelobeckmann

In Arbeit nach Überprüfung.

Wurde die PR genehmigt? @marcelobeckmann

Noch nicht, nach einer kürzlich erfolgten Codeüberprüfung wird daran gearbeitet.

Schade, dass ich es brauche.

Gibt es nur die Funktion irgendwo? So kann ich es alleine verwenden (zu Forschungszwecken)

Vielen Dank

Sie können den neuesten Commit dieser Funktion in diesem PR nehmen:
https://github.com/scikit-learn/scikit-learn/pull/9555

Ich habe es geschafft, dass es vor Ort funktioniert. Vielen Dank!

Nur ein kurzes +1 auf dieses Ticket! Danke für die ganze Arbeit dazu.

Stoßen. Dies wäre eine tolle Ergänzung. Ich kann nicht glauben, dass es 4 Jahre gedauert hat, bis eine relativ einfache Berechnung in sklearn gelangt ist!

Oder du könntest sagen: Danke für deine engagierte Beharrlichkeit über vier Jahre
ehrenamtlicher Einsatz!

Oder Sie könnten sagen: Danke für Ihre engagierte Beharrlichkeit über vier Jahre ehrenamtlichen Einsatzes!

Sie haben Recht, tut mir leid. Ich wollte nicht unhöflich wirken. Ich weiß die Mühe sehr zu schätzen. Ich benutze dies seit einiger Zeit lokal und es wäre großartig, wenn es hinzugefügt würde. Dies ist die einzige mir bekannte Entfernungsmetrik für gemischte Datentypen.

Abgesehen von der ehrenamtlichen Arbeit, die die Kernentwickler nicht berücksichtigt haben
so dringend, gibt es in der Tat Herausforderungen im Umgang mit gemischten Typen,
und wie man die Skalierung in einem Zugtestaufbau durchführt.

Freue mich schon auf sklearn.

Jemand, der behauptet, von diesem Thread " geborgte Ideen " zu haben, hat auf github ein Paket

Aus @marcelobeckmanns Notizbuch:

    # 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)

Aus "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)

Hallo Leute, danke, behalte das im Auge.

Ich bin froh, dass die Leute den Code nehmen und versuchen, ihn zu verbessern, das ist der Zweck, Open Source zu sein, obwohl einige Anerkennung geschätzt wird.

Hoffentlich wird dieser Code Teil von scikit-learn, wenn diese PR #9555 akzeptiert wird.

Mit freundlichen Grüßen,

Marcelo Beckmann

Viel Glück dabei!!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen