0

Ich benutze Scikit-lernen zum Clustering eines Korpus von Tweets (nur der Text) über die #oscars.Wie kann ich das Gewicht von Features für das K-Means-Clustering ändern?

Es wäre wirklich nützlich, wenn ein Benutzername wie @LeonardoDiCaprio oder ein Hashtag wie #redcarpet als signifikanter in den Vorprozessen betrachtet werden kann.

Ich würde gerne wissen, ob es möglich ist, diese häufigen Benutzernamen und Hashtags für wichtigere Funktionen mehr Gewicht hinzuzufügen.

+0

Wenn Sie sagen, zusätzliches Gewicht, wie meinst du? k-means verwendet eine Entfernungsberechnung, um herauszufinden, wie "ähnlich" alle Merkmale zweier Instanzen sind. Willst du damit sagen, dass die "Nähe" das Aussehen bestimmter Wörter überladen soll? Umgekehrt bedeutet das, dass Sie wollen, dass sie die "Distanz" zwischen Tweets überladen, wenn eines diese Wörter hat und das andere nicht? Sind Ihre Daten in irgendeiner Weise normalisiert? – flyingmeatball

+0

@flyingmeatball zum Beispiel Ich möchte als Feature "@sasha" nehmen, weil es ein gemeinsames Wort im Korpus ist (erscheint in mehr als 30% der Tweets) und weil es ein Benutzername ist (es ist ein Token, das mit "@" beginnt). Aber ich möchte auch keine Features verpassen, die keine Benutzernamen sind. Die Pipeline für meine Daten ist CountVectorizer -> K-Means – fuxes

+0

Ich habe zufällig mit SGDClassifier in etwas wie das laufen. Es hat einen Parameter sample_weight, der seiner Fit-Methode zugewiesen wurde. Vielleicht hat K-means so etwas. Werfen Sie einen Blick: http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_weighted_samples.html#example-linear-model-plot-sgd-weighted-samples-py – Shovalt

Antwort

5

K-Mittel ist definiert auch nur für euklidischen Räumen, bei denen der Abstand zwischen dem Vektor A und B als

|| A - B || = sqrt(SUM_i (A_i - B_i)^2) 

so ausgedrückt wird, wenn Sie bestimmte Funktion zu „Gewicht“ wollen, würden Sie so etwas wie

mögen

was dazu führen würde, dass ich sehr viel wichtiger bin (wenn w_i> 1) - also würde man eine größere Strafe bekommen, wenn man einen anderen Wert hat (in Bezug auf Beutel Wörter/Satz Wörter - es bedeutet einfach, wenn zwei Dokumente haben unterschiedliche Menge dieses bestimmten Wortes, sie sind assum anders als die, die sich in einer anderen Wortgruppe unterscheiden).

Also, wie können Sie es erzwingen? Nun, grundlegende Mathematik ist alles was Sie brauchen! Sie können ganz einfach, dass

|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B || 

mit anderen Worten sehen - Sie TFIDF Transformator nehmen (oder was auch immer Sie Ihren Text auf konstante Größe Vektor verwenden, um Karte), prüfen Sie, welche Funktionen für die Worte verantwortlich sind Sie interessiert sind, können Sie Erstelle einen Vektor von Einsen (mit einer Größe, die der Anzahl der Dimensionen entspricht) und erhöhe die Werte für die Wörter, die dir wichtig sind (zum Beispiel 10x) und nimm die Quadratwurzel dieser Sache. Dann verarbeiten Sie einfach alle Ihre Daten vor, indem Sie mit diesem Gewichtsvektor "punktweise" mit Rundsendung (np.multiply) multiplizieren. Das ist alles was du brauchst, jetzt werden deine Worte in dieser genau definierten Weise wichtiger. Aus mathematischer Perspektive führt dies die Mahalanobis-Distanz anstelle der Euklidischen ein, wobei die Kovarianzmatrix gleich w * I ist (also - Diagonal-Gaussian, das als Generator Ihrer Norm verwendet wird).

+0

gut gesagt - @fuxes kann es einige Versuche dauern und einen Fehler, um herauszufinden, welchen Wert man verwenden soll, um die "wertvollen" Begriffe zu multiplizieren. In der Regel haben Sie ein gewisses Maß daran, ob Ihr Modell mehr oder weniger genau ist, mit verschiedenen Gewichtungsaktualisierungen und Sie können Ihre Gesamtleistung mit einem Testset vergleichen. – flyingmeatball