Maschinelles Lernen zur Einschätzung des Alters von Nutzern anhand von Facebook-Websites, die sie mögen

25

Ich habe eine Datenbank aus meiner Facebook-Anwendung und versuche, mithilfe von maschinellem Lernen das Alter der Benutzer basierend auf den von ihnen bevorzugten Facebook-Websites einzuschätzen.

Es gibt drei entscheidende Merkmale meiner Datenbank:

  • Die Altersverteilung in meinem Trainingsset (insgesamt 12.000 Benutzer) ist auf jüngere Benutzer ausgerichtet (dh ich habe 1157 Benutzer im Alter von 27 und 23 Benutzern im Alter von 65 Jahren).

  • Viele Sites haben nicht mehr als 5 Likers (ich habe die FB-Sites mit weniger als 5 Likers herausgefiltert).

  • Es gibt viel mehr Funktionen als Beispiele.

Meine Fragen lauten also: Welche Strategie würden Sie vorschlagen, um die Daten für die weitere Analyse vorzubereiten? Sollte ich eine Art Dimensionsreduktion durchführen? Welche ML-Methode ist in diesem Fall am besten geeignet?

Ich verwende hauptsächlich Python, daher sind Python-spezifische Hinweise sehr willkommen.

Wojciech Walczak
quelle
1
Wenn Sie sagen "viel mehr Funktionen als Beispiele", dann meinen Sie damit, dass die eindeutige Anzahl der geliebten Websites >> num Benutzer ist. Gilt das auch für die Root-Domain der Sites? Das heißt, sind sie eine Reihe von youtube.com- oder cnn.com-URLs auf den Websites oder sind sie bereits auf eine Domain beschränkt? Ich neige dazu, die Dimensionalität zu reduzieren, indem ich URLs zu Domainstämmen und nicht zu bestimmten Seiten reduziere, wenn dies möglich ist.
Cwharland
Danke für die Antwort. Die Anzahl der Funktionen (eindeutige bevorzugte Sites) beträgt 32.000, während die Anzahl der Stichproben (Benutzer) 12.000 beträgt. Die Funktionen sind Facebook-Seiten, sodass die URLs nicht aufgehalten werden müssen. Ein Benutzer kann entweder facebook.com/cnn mögen oder nicht. Ich mag die Idee, zu versuchen, das Alter der Benutzer basierend auf den Links, die sie teilen, zu schätzen :)
Wojciech Walczak
Ahhh, ich habe die Beschreibung der geliebten Seiten falsch gelesen. Danke für die Klarstellung.
Cwharland

Antworten:

16

Eine Sache, mit der man anfangen sollte, wäre k-NN. Die Idee hier ist, dass Sie eine Benutzer / Artikel-Matrix haben und für einige Benutzer ein angegebenes Alter haben. Das Alter einer Person in der Benutzer-Artikel-Matrix kann durch das mittlere oder mittlere Alter einiger nächster Nachbarn im Artikelbereich bestimmt werden.

Sie haben also jeden Benutzer als Vektor im Objektraum ausgedrückt, finden die k nächsten Nachbarn und weisen dem fraglichen Vektor eine zusammenfassende Statistik des Alters des nächsten Nachbarn zu. Sie können k für eine Abstandsgrenze oder realistischer auswählen, indem Sie einem durchgehaltenen Zug iterativ Alter zuweisen und das k auswählen, das den Fehler in dieser Zuordnung minimiert.

Wenn die Dimensionalität ein Problem darstellt, können Sie diese Einstellung leicht durch eine Einzelwertzerlegung reduzieren, indem Sie die m Vektoren auswählen, die die größte Varianz in der Gruppe erfassen.

In allen Fällen, da jedes Merkmal binär ist, scheint es, dass die Cosinus-Ähnlichkeit Ihre Abstandsmetrik ist.

Ich muss ein bisschen mehr über andere Ansätze nachdenken (Regression, RF, usw.), da Ihr Funktionsbereich eng fokussiert ist (alle Varianten derselben Aktion, die ich mag). Ich denke, der Benutzer / Gegenstand-Ansatz ist der beste.

Ein Hinweis zur Vorsicht, wenn das Alter, in dem Sie trainieren, selbst gemeldet wird, müssen Sie möglicherweise einige davon korrigieren. Facebook-Nutzer geben in der Regel das Alter in dem Jahrzehnt an, in dem sie geboren wurden. Zeichnen Sie ein Histogramm der Geburtsdaten (abgeleitet vom Alter) und stellen Sie fest, ob Sie Spitzen in Jahrzehnten wie den 70ern, 80ern und 90ern haben.

Cwharland
quelle
Hallo, deine Antwort ist meiner eigentlichen Strategie ziemlich ähnlich. Ich habe sklearn.neighbors.KNeighborsRegressormit der Kosinusmetrik auf SVD-reduziertem Raum gearbeitet (nach Anwendung von SVD ist der durchschnittliche Schätzfehler von ~ 6 Jahren auf ~ 4 gesunken). Benutzer in meiner Datenbank sind zwischen 18 und 65 Jahre alt (ältere Benutzer wurden herausgefiltert), daher gibt es 48 mögliche Klassen. Ich frage mich, ob das nicht zu viele Klassen für kNN sind und ob ich es als Regression oder als Klassifizierungsproblem behandeln sollte (ich denke, beide sind anwendbar).
Wojciech Walczak
Anekdotisch kann ich sagen, dass ich Random Forests pro Klasse verwendet habe, um eine Reihe von Klassen individuell anzupassen und dann die Ergebnisse jedes dieser Modelle auf verschiedene Weise zu kombinieren. In diesem Fall könnten Sie sogar darüber nachdenken, jedem Alter des Benutzers mit dem kNN frühere Wahrscheinlichkeiten zuzuweisen, dann jedes klassenbasierte Modell zu durchlaufen, die Ergebnisse zu aktualisieren, die früheren Wahrscheinlichkeiten für jede Klasse zu aktualisieren und die wahrscheinlichste Klasse aus diesen Nachkommen auszuwählen. Es klingt ein bisschen komplizierter, aber im schlimmsten Fall hätten Sie die kNN-Genauigkeit.
Cwharland
7

Ich habe kürzlich ein ähnliches Projekt in Python durchgeführt (Vorhersagen von Meinungen mithilfe von FB-ähnlichen Daten) und mit dem folgenden grundlegenden Prozess gute Ergebnisse erzielt:

  1. Lesen Sie den Trainingssatz ein (n = N), indem Sie die durch Kommas getrennten Sätze Zeile für Zeile durchlaufen lassen, und verwenden Sie einen Zähler, um die beliebtesten Seiten zu identifizieren
  2. Verwenden Sie pandas.DataFrame.isin für jede der K beliebtesten Seiten (ich habe ungefähr 5000 verwendet, aber Sie können mit unterschiedlichen Werten herumspielen), um zu testen, ob jede Person im Trainingssatz jede Seite mag, und erstellen Sie dann einen N x K-Datenrahmen der Ergebnisse (ich nenne es xdata_train)
  3. Erstellen Sie eine Reihe (ich nenne sie ydata_train) mit allen Ergebnisvariablen (in meinen Fällen Meinungen, in Ihrem Alter) mit demselben Index wie xdata_train
  4. Richten Sie mit scikit-learn einen zufälligen Gesamtstrukturklassifikator ein, um ydata_train basierend auf xdata_train vorherzusagen
  5. Verwenden Sie den Kreuzvalidierungstest von scikit-learn, um Parameter zu optimieren und die Genauigkeit zu optimieren (Optimieren der Anzahl der populären Seiten, der Anzahl der Bäume, der minimalen Blattgröße usw.).
  6. Ausgabe eines zufälligen Waldklassifikators und einer Liste der beliebtesten Seiten mit pickle (oder behalten Sie den Speicher bei, wenn Sie alles auf einmal tun)
  7. Laden Sie den Rest Ihrer Daten, laden Sie die Liste der beliebtesten Seiten (falls erforderlich) und wiederholen Sie Schritt 2, um xdata_new zu erstellen
  8. Laden Sie den zufälligen Gesamtstrukturklassifizierer (falls erforderlich) und verwenden Sie ihn, um Werte für die xdata_new-Daten vorherzusagen
  9. Geben Sie die vorhergesagten Ergebnisse in einer neuen CSV-Datei oder einem anderen Ausgabeformat Ihrer Wahl aus

In Ihrem Fall müssen Sie den Klassifikator gegen einen Regressor austauschen (siehe hier: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ), ansonsten jedoch denselben Vorgang sollte problemlos funktionieren.

Außerdem sollten Sie sich der erstaunlichsten Funktion von Zufallswäldern in Python bewusst sein: der sofortigen Parallelisierung! Diejenigen von uns, die mit R angefangen haben und dann umgezogen sind, sind immer wieder erstaunt, besonders wenn Sie an einer Maschine mit ein paar Dutzend Kernen arbeiten (siehe hier: http://blog.yhathq.com/posts/comparing- Random-Forests-in-Python-und-r.html ).

Beachten Sie schließlich, dass dies eine perfekte Anwendung für die Netzwerkanalyse ist, wenn Sie sowohl die Daten von Freunden als auch von Einzelpersonen selbst haben. Wenn Sie das Alter der Freunde eines Benutzers analysieren können, wird das Alter des Benutzers mit ziemlicher Sicherheit innerhalb von ein oder zwei Jahren des Medians unter seinen Freunden liegen, insbesondere wenn die Benutzer jung genug sind, um ihre Freundesnetzwerke aufzubauen, während sie noch in sind Schule (da die meisten Klassenkameraden sein werden). Diese Vorhersage würde wahrscheinlich alle Vorhersagen übertreffen, die Sie durch das Modellieren erhalten würden - dies ist ein Lehrbuchbeispiel für ein Problem, bei dem jedes Mal die richtigen Daten> das richtige Modell vorliegen.

Viel Glück!

Therriault
quelle
2
Ein interessanter Aspekt bei der Verwendung der Top-5000-Websites ist die Tatsache, dass sie möglicherweise nicht in der Lage sind, Nutzer nach Alter zu segmentieren. Die Top-Websites, von der Konstruktion her, sind diejenigen, die jeder besucht. Sie sind daher nicht sehr gut darin, Ihre Benutzer zu segmentieren, da sich alle möglichen Klassifizierungen (Altersgruppen) mit diesen Websites befasst haben. Dies ist ein ähnlicher Begriff wie der idf-Teil von tf-idf. idf filtert das Rauschen "Jeder hat diese Funktion" heraus. Wie werden die am häufigsten besuchten Websites als Merkmale in Ihren Plots mit variabler Wichtigkeit mit Ihrer RF eingestuft?
Cwharland
1
Guter Punkt. Eine einfache Lösung hierfür wäre, den Trainingsdatensatz in J-Altersklassen (z. B. 13-16, 17-20, 21-24 usw.) zu unterteilen und die Top-Seiten (K / J) für jede Gruppe zu übernehmen. Das würde sicherstellen, dass Sie für jede Gruppe eine signifikante Vertretung haben. Es wird sicherlich einige Überlappungen zwischen den Gruppen geben. Wenn Sie also sehr wählerisch sind, möchten Sie vielleicht die besten (K / J) Seiten für jede Gruppe auswählen, aber ich denke, das könnte übertrieben sein.
Therriault
5

Ein weiterer Vorschlag ist, die logistische Regression zu testen . Als zusätzlichen Bonus erhalten Sie anhand der Gewichte (Koeffizienten) des Modells eine Vorstellung davon, welche Websites altersabhängig sind.

Sklearn bietet das Paket sklearn.linear_model.LogisticRegression an, das auch für den Umgang mit spärlichen Daten ausgelegt ist.

Wie in den Kommentaren erwähnt, müssen Sie im vorliegenden Fall das Modell mit mehr Eingabevariablen als Stichproben regulieren (verwenden Sie bei sklearn.linear_model.LogisticRegression das penalty='l1'Argument).

damienfrancois
quelle
1
Mit LR müsste man, glaube ich, mehrere Modelle für Altersfächer herstellen. Wie würden Sie zwei Modelle für verschiedene Altersklassen vergleichen, die bei der Aufnahme für einen Benutzer dasselbe Problem vorhersagen?
Cwharland
1
Beachten Sie, dass LR fehlschlägt, wenn mehr Variablen als Beobachtungen vorliegen, und eine schlechte Leistung erbringt, wenn die Annahmen des Modells nicht erfüllt werden. Um es zu nutzen, muss die Dimensionsreduzierung ein erster Schritt sein.
Christopher Louden
1
@cwharland Sie sollten die Antwortvariable nicht als kategorisch betrachten, da sie von Natur aus kontinuierlich ist und von der Problemdefinition diskretisiert wird. Eine Kategorisierung würde bedeuten, dem Algorithmus mitzuteilen, dass die Vorhersage des Alters 16, wenn es tatsächlich 17 ist, ebenso ein schwerwiegender Fehler ist wie die Vorhersage des Alters 30, wenn es tatsächlich 17 ist. 30 vs 17) gelten als groß. Die logistische Regression wird in diesem Fall verwendet, um den kontinuierlichen Wert vorherzusagen und nicht um die hinteren Wahrscheinlichkeiten abzuschätzen.
damienfrancois
@ChristopherLouden Sie haben Recht, dass die Vanille-Version der logistischen Regression nicht für den Fall 'large p small n' geeignet ist. Ich hätte erwähnen müssen, dass Regularisierung im vorliegenden Fall wichtig ist. Ich aktualisiere meine Antwort. Da L1-reguliertes LR eine Art Merkmalsauswahl ist, halte ich keinen vorläufigen FS-Schritt für erforderlich.
damienfrancois
@damienfrancois: Dem stimme ich definitiv zu. Ich bin nur ein bisschen besorgt, dass LR in diesem Fall Zwischenwerte zu hart bestraft. Es scheint keine Motivation zu geben, eine Sigmoid-ähnliche Kurve abzubilden, da Sie nicht besonders an extremen Alterswerten interessiert sind. Vielleicht interpretiere ich den Gebrauch aber falsch.
Cwharland
4

Einige Forschungen von D. Nguyen et al. Versuchen Sie, das Alter der Twitter-Nutzer anhand ihrer Tweets vorherzusagen. Vielleicht finden Sie sie nützlich. Sie verwenden logistische und lineare Regression.

Lgylym
quelle
3

Abgesehen von den schickeren Methoden können Sie die Bayes-Formel ausprobieren

P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))

P (I | p1 ... pn) ist die Wahrscheinlichkeit, dass ein Benutzer der Altersgruppe I angehört, wenn er p1, .., pn mag

P (i) ist die Wahrscheinlichkeit, dass ein Benutzer der Altersgruppe i angehört

P (p1 .. pn | i) ist die Wahrscheinlichkeit, dass ein Benutzer p1, .., pn mochte, wenn er der Altersgruppe i angehört.

  • Sie haben bereits die Schätzungen für P (i) aus Ihren Daten: Dies ist nur der Anteil der Benutzer in der Altersgruppe I.
  • Um P (p1 ... pn | i) zu schätzen, schätze ich für jede Altersgruppe die Wahrscheinlichkeit (Häufigkeit), dass p_ij eine Seite j mag. Damit p_ij für alle j ungleich Null ist, können Sie die Frequenz für die gesamte Population mit einem kleinen Gewicht einmischen.

  • Dann log P (p1 ... pn | i) = Summe (log p_ij, i = p1, .., pn), die Summe über alle Seiten, die einem neuen Benutzer gefallen. Diese Formel wäre annähernd richtig, wenn ein Benutzer die Seiten in seiner Altersgruppe unabhängig mag.

  • Theoretisch sollten Sie auch log (1-p_ij) für alle i hinzufügen, die er nicht mochte, aber in der Praxis sollten Sie feststellen, dass die Summe von log (1-p_ij) irrelevant klein ist, sodass Sie nicht auch brauchen viel Speicher.

Wenn Sie oder jemand anderes dies versucht hat, kommentieren Sie bitte das Ergebnis.

Valentas
quelle
2

Das ist ein sehr interessantes Problem.

Ich sah mich einem ähnlichen Problem gegenüber, indem ich die Bilder analysierte, die Benutzer in das soziale Netzwerk hochgeladen hatten. Ich habe folgenden Ansatz gewählt:

  • Anstatt Daten mit dem Alter (15 Jahre, 27 Jahre, ...) zu verknüpfen, habe ich verschiedene Altersgruppen festgelegt: Weniger als 18 Jahre, 18 bis 30 Jahre und mehr als 30 Jahre (dies ist auf das spezifische Problem zurückzuführen, das wir hatten) Sie können jedoch die gewünschten Intervalle auswählen. Diese Aufteilung hilft sehr, das Problem zu lösen.
  • Danach habe ich ein hierarchisches Clustering erstellt (divisiv oder aggregativ). Dann wähle ich die Zweige aus, in denen ich Benutzer mit bekanntem Alter (oder Gruppenalter) hatte, und dann habe ich für diesen Zweig das gleiche Alter auf diese Gruppe ausgedehnt.

Dieser Ansatz ist teilüberwachtes Lernen und ich empfehle ihn für den Fall, dass Sie nur einige Daten beschriften.

Beachten Sie bitte, dass in einem sozialen Netzwerk die Leute normalerweise über das Alter lügen (nur zum Spaß oder manchmal, weil sie sich im sozialen Netzwerk tarnen möchten).

adesantos
quelle