Berücksichtigen Sie als Beispielanwendung die folgenden zwei Eigenschaften von Stack Overflow-Benutzern: Anzahl der Reputations- und Profilansichten .
Es wird erwartet, dass diese beiden Werte für die meisten Benutzer proportional sind: Benutzer mit hohen Wiederholungszahlen ziehen mehr Aufmerksamkeit auf sich und erhalten daher mehr Profilansichten.
Daher ist es interessant, nach Benutzern zu suchen, die im Vergleich zu ihrer allgemeinen Reputation viele Profilansichten haben.
Dies könnte darauf hinweisen, dass dieser Benutzer eine externe Quelle des Ruhms hat. Oder vielleicht nur, dass sie interessante, schrullige Profilbilder und Namen haben.
Mathematischer ausgedrückt ist jeder zweidimensionale Abtastpunkt ein Benutzer, und jeder Benutzer hat zwei Integralwerte im Bereich von 0 bis + unendlich:
- Ruf
- Anzahl der Profilansichten
Es wird erwartet, dass diese beiden Parameter linear abhängig sind, und wir möchten Stichprobenpunkte finden, die die größten Ausreißer dieser Annahme sind.
Die naive Lösung wäre natürlich, nur Profilansichten zu vertreten, nach Ruf zu teilen und zu sortieren.
Dies würde jedoch zu Ergebnissen führen, die statistisch nicht aussagekräftig sind. Wenn ein Benutzer beispielsweise auf eine Frage geantwortet hat, 1 Upvote erhalten hat und aus irgendeinem Grund 10 Profilansichten hat, die leicht zu fälschen sind, wird dieser Benutzer vor einem viel interessanteren Kandidaten mit 1000 Upvotes und 5000 Profilansichten angezeigt .
In einem eher "realen" Anwendungsfall könnten wir versuchen zu antworten, zum Beispiel "Welche Startups sind die aussagekräftigsten Einhörner?". Wenn Sie beispielsweise 1 Dollar mit winzigem Eigenkapital investieren, erstellen Sie ein Einhorn: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Konkrete saubere, benutzerfreundliche Daten aus der realen Welt
Um Ihre Lösung für dieses Problem zu testen, können Sie einfach diese kleine (75 Millionen komprimierte, ~ 10 Millionen Benutzer) vorverarbeitete Datei verwenden, die aus dem Stack Overflow-Datendump 2019-03 extrahiert wurde :
wget https://github.com/cirosantilli/media/raw/master/stack-overflow-data-dump/2019-03/users_rep_view.dat.7z
7z x users_rep_view.dat.7z
Dadurch wird die UTF-8-codierte Datei erstellt, users_rep_view.dat
die ein sehr einfaches, durch Leerzeichen getrenntes Format aufweist:
Id Reputation Views DisplayName
-1 1 649 Community
1 45742 454747 Jeff_Atwood
2 3582 24787 Geoff_Dalgas
3 13591 24985 Jarrod_Dixon
4 29230 75102 Joel_Spolsky
5 39973 12147 Jon_Galloway
8 942 6661 Eggs_McLaren
9 15163 5215 Kevin_Dente
10 101 3862 Sneakers_O'Toole
So sehen die Daten auf einer Protokollskala aus:
Es wäre dann interessant zu sehen, ob Ihre Lösung uns tatsächlich hilft, neue unbekannte, skurrile Benutzer zu entdecken!
Die anfänglichen Daten wurden aus dem Datendump 2019-03 wie folgt erhalten:
wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z
# Produces Users.xml
7z x stackoverflow.com-Users.7z
# Preprocess data to minimize it.
./users_xml_to_rep_view_dat.py Users.xml > users_rep_view.dat
7z a users_rep_view.dat.7z users_rep_view.dat
sha256sum stackoverflow.com-Users.7z users_rep_view.dat.7z > checksums
Quelle fürusers_xml_to_rep_view_dat.py
.
Nachdem Sie Ihre Ausreißer durch Neuordnung ausgewählt haben users_rep_view.dat
, können Sie eine HTML-Liste mit Hyperlinks abrufen, um schnell die Top-Picks anzuzeigen mit:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
Quelle fürusers_rep_view_dat_to_html.py
.
Dieses Skript kann auch als Kurzreferenz zum Einlesen der Daten in Python dienen.
Manuelle Datenanalyse
Wenn wir uns das Gnuplot-Diagramm ansehen, sehen wir das wie erwartet:
- Die Daten sind ungefähr proportional, mit größeren Abweichungen für Benutzer mit geringer Wiederholungszahl oder geringer Anzahl von Ansichten
- Benutzer mit geringer Wiederholungszahl oder geringer Anzahl von Ansichten sind klarer, was bedeutet, dass sie höhere Konto-IDs haben, was bedeutet, dass ihre Konten neuer sind
Um ein Gefühl für die Daten zu bekommen, wollte ich einige weit oben liegende Punkte in einer interaktiven Plotsoftware aufschlüsseln.
Gnuplot und Matplotlib konnten mit einem so großen Datensatz nicht umgehen, also habe ich VisIt zum ersten Mal getestet und es hat funktioniert. Hier ist eine detaillierte Übersicht aller Plot-Software, die ich ausprobiert habe: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
Oh mein Gott, das war schwer zum Laufen zu bringen. Ich musste:
- Laden Sie die ausführbare Datei manuell herunter, es gibt kein Ubuntu-Paket
- Konvertieren Sie die Daten in CSV, indem Sie sie
users_xml_to_rep_view_dat.py
schnell hacken, da ich nicht leicht herausfinden konnte, wie ich sie durch durch Leerzeichen getrennte Dateien füttern kann (Lektion gelernt, das nächste Mal gehe ich direkt zu CSV). - Kämpfe 3 Stunden lang mit der Benutzeroberfläche
- Die Standardpunktgröße ist ein Pixel, das mit dem Staub auf meinem Bildschirm verwechselt wird. Bewegen Sie sich zu 10-Pixel-Kugeln
- Es gab einen Benutzer mit 0 Profilansichten, und VisIt weigerte sich korrekt, das Logarithmusdiagramm zu erstellen. Daher habe ich Datenlimits verwendet, um diesen Punkt zu entfernen. Dies erinnerte mich daran, dass Gnuplot sehr freizügig ist und gerne alles plant, was Sie darauf werfen.
- Fügen Sie unter "Steuerelemente"> "Anmerkungen" Achsentitel hinzu, entfernen Sie den Benutzernamen und andere Dinge.
So sah mein VisIt-Fenster aus, nachdem ich diese manuelle Arbeit satt hatte:
Die Buchstaben sind Punkte, die ich manuell mit der fantastischen Auswahl ausgewählt habe:
- Sie können die genaue ID für jeden Punkt anzeigen, indem Sie die Gleitkommapräzision im Auswahlfenster> "Gleitkommaformat" auf erhöhen
%.10g
- Sie können dann alle handverlesenen Punkte mit "Picks speichern unter" in eine txt-Datei kopieren. Auf diese Weise können wir eine anklickbare Liste interessanter Profil-URLs mit einigen grundlegenden Textverarbeitungen erstellen
TODOs lernen, wie man:
- Siehe die Profilnamenzeichenfolgen. Sie werden standardmäßig in 0 konvertiert. Ich habe gerade Profil-IDs in den Browser eingefügt
- Wählen Sie alle Punkte in einem Rechteck auf einmal aus
Und zum Schluss noch ein paar Benutzer, die bei Ihrer Bestellung wahrscheinlich ganz oben stehen sollten:
Benutzer mit sehr geringen Wiederholungszahlen mit großer Anzahl von Ansichten und geringen Informationsprofilen.
Diese Benutzer leiten den Datenverkehr wahrscheinlich irgendwie von irgendwoher um.
Verwandte: es war ein Meta - Thread für berühmte Frage gold Abzeichen durch eine Benutzermanipulation, aber ich kann es jetzt nicht finden.
Wenn es zu viele solcher Benutzer gibt, wird unsere Analyse schwierig sein, und wir müssten versuchen, andere Parameter zu berücksichtigen, um einen solchen "Betrug" zu vermeiden:
- A 1 143100 2445750 /programming//users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 /programming//users/2139869/xxn
- E 40 23067 5740196 /programming//users/5740196/listcrawler
- F 11 7738 3313079 /programming//users/3313079/rikitikitaco
- G 136 11123 4102129 /programming//users/4102129/abhishek-deshpande
- K 377 24453 1012351 /programming//users/1012351/overstack
- L 1489 57515 1249338 /programming//users/1249338/frosty
- M 1767 40986 2578799 /programming//users/2578799/naresh-walia
- Ich finde diese Gruppe von Benutzern interessant, alle so nah in der Grafik:
- H 58 4331 1818755 /programming//users/1818755/eerongal
- I 103 4366 1816274 /programming//users/1816274/angelov
- J 157 4688 688552 /programming//users/688552/oylex
äußerer Ruhm:
- O 29799 170854 2274694 /programming//users/2274694/lyndsey-scottex Victorias geheimes Modell: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 /programming//users/1/jeff-atwood SO Mitbegründer
- Y 29230 75102 4 /programming//users/4/joel-spolsky SO Mitbegründer
- Benutzer mit der höchsten Reputation erhalten in der Regel mehr Profilansichten, da sie in den Google-Abfragen / -Auflistungen "Benutzer mit der höchsten Reputation" angezeigt werden:
- U 542861 401220 88656 /programming//users/88656/eric-lippert am C # -Design beteiligt
- V 852319 396830 157882 /programming//users/157882/balusc Top-2-Benutzer, wahnsinnig viele Antworten
skurrile Profile:
- N 13690 108073 63550 /programming//users/63550/peter-mortensen Das eigene Bild! Ich denke auch, dass er zuvor Moderator war.
- R 143904 144287 895245 /programming//users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad % e5% bf% 83996icu% e5% 85% ad% e5% 9b% 9b% e4% ba% 8b% e4% bb% b6
- T 291742 161929 560648 /programming//users/560648/lightness-races-in-orbit
Benutzer mit hohen Wiederholungszahlen, die zu diesem Zeitpunkt gesperrt waren. Ah, die Dummheit deines Vertreters geht zu 1 Regel:
- B 1 77456 285587 /programming//users/285587/your-common-sense
Ich bin mir nicht sicher, ob ich versucht bin, Ansichtsmanipulation zu sagen:
- Q 65788 126085 50776 /programming//users/50776/casperone
- S 15655 81541 293594 /programming//users/293594/xnx
- W 12019 37047 2227834 /programming//users/2227834/unheilig
- X 1421 27963 1255427 /programming//users/1255427/jack-nicholson
Mögliche Lösungen
Ich habe von https://www.evanmiller.org/how-not-to-sort-by-average-rating.html über das Wilson-Konfidenzintervall gehört, das den Anteil positiver Bewertungen mit der Unsicherheit in Einklang bringt einer kleinen Anzahl von Beobachtungen ", aber ich bin nicht sicher, wie ich das auf dieses Problem abbilden soll.
In diesem Blog-Beitrag empfiehlt der Autor diesen Algorithmus, um Elemente zu finden, die viel mehr Upvotes als Downvotes haben, aber ich bin mir nicht sicher, ob dieselbe Idee für das Upvote- / Profilansichtsproblem gilt. Ich dachte daran zu nehmen:
- Profilansichten == Upvotes dort
- Upvotes hier == Downvotes dort (beide "schlecht")
Ich bin mir jedoch nicht sicher, ob dies sinnvoll ist, da beim Auf- / Ab-Abstimmungsproblem jedes zu sortierende Element N 0/1 Abstimmungsereignisse aufweist. Bei meinem Problem sind jedem Element zwei Ereignisse zugeordnet: das Abrufen der Upvote und das Abrufen der Profilansicht.
Gibt es einen bekannten Algorithmus, der für diese Art von Problem gute Ergebnisse liefert? Selbst wenn ich den genauen Problemnamen kenne, kann ich vorhandene Literatur finden.
Literaturverzeichnis
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positiv-korreliert-zu-level-of-reputa
- Test auf bivariate Ausreißer
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Gibt es eine einfache Möglichkeit, Ausreißer zu erkennen?
- Wie sollen Ausreißer in der linearen Regressionsanalyse behandelt werden?
- https://math.meta.stackexchange.com/questions/26137/who-maximiert das Verhältnis von Menschen, die auf Fragen eingegangen sind
Getestet in Ubuntu 18.10, VisIt 2.13.3.
Antworten:
Ich denke, das Wilson-Score-Konfidenzintervall kann direkt auf Ihr Problem angewendet werden. Die im Blog verwendete Punktzahl war eine Untergrenze des Konfidenzintervalls anstelle eines erwarteten Werts.
Eine andere Methode für ein solches Problem besteht darin, unsere Schätzung in Bezug auf einige Vorkenntnisse, die wir haben, zu korrigieren (zu verzerren), beispielsweise das Verhältnis von Gesamtansicht zu Wiederholung.
In der Praxis ist dies im Wesentlichen ein gewichteter Durchschnitt des Verhältnisses von Gesamtansicht zu und des Verhältnisses von Benutzeransicht zu , wobei ist die Anzahl der Wiederholungen, die ein Benutzer hat, ist eine Konstante, ist das Verhältnis von Ansicht zu Wiederholung des Benutzers und das Gesamtverhältnis von Ansicht zu Wiederholung.μMAP=nμMLE+cμ0n+c n c μMLE μ0
Um die beiden Methoden zu vergleichen (Wilson-Score-Konfidenzintervall untere Grenze und MAP), geben beide eine genaue Schätzung, wenn genügend Daten (Wiederholungen) vorhanden sind. Wenn die Anzahl der Wiederholungen gering ist, wird die Wilson-Methode der unteren Grenze gegen Null tendieren und MAP wird Voreingenommenheit gegenüber dem Mittelwert.
quelle