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.
quelle
Antworten:
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.
quelle
sklearn.neighbors.KNeighborsRegressor
mit 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).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:
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!
quelle
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).quelle
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.
quelle
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.
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.
Wenn Sie oder jemand anderes dies versucht hat, kommentieren Sie bitte das Ergebnis.
quelle
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:
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).
quelle