Das Buch "Probabilistische Programmierung in Python: Bayesianische Inferenz und Algorithmen"

Bild Hallo habrozhiteli! Bayesianische Methoden erschrecken die Formeln vieler IT-Spezialisten, aber jetzt können Sie nicht mehr auf die Analyse von Statistiken und Wahrscheinlichkeiten verzichten. Cameron Davidson-Pylon spricht über die Bayes'sche Methode aus der Sicht eines praktischen Programmierers, der mit der multifunktionalen PyMC-Sprache und den Bibliotheken NumPy, SciPy und Matplotlib arbeitet. Wenn Sie die Rolle der Bayes'schen Schlussfolgerungen bei A / B-Tests aufdecken, Betrug und andere dringende Aufgaben identifizieren, werden Sie dieses nicht triviale Thema nicht nur leicht verstehen, sondern auch beginnen, das erworbene Wissen anzuwenden, um Ihre Ziele zu erreichen.

Auszug: 4.3.3. Beispiel: Sortieren von Kommentaren zu Reddit


Vielleicht stimmen Sie nicht zu, dass das Gesetz der großen Zahlen von allen angewendet wird, wenn auch nur implizit, bei unbewussten Entscheidungen. Betrachten Sie das Beispiel von Online-Produktbewertungen. Vertrauen Sie oft einer durchschnittlichen Bewertung von fünf Punkten basierend auf einer Bewertung? Zwei Bewertungen? Drei Bewertungen? Sie verstehen unbewusst, dass bei einer so geringen Anzahl von Bewertungen die durchschnittliche Bewertung nicht gut widerspiegelt, wie gut oder schlecht das Produkt ist.


Infolgedessen gibt es Auslassungen beim Sortieren und im Allgemeinen beim Vergleichen von Waren. Für viele Käufer ist es klar, dass das Sortieren der Ergebnisse einer interaktiven Suche nach Bewertungen nicht sehr objektiv ist. Es spielt keine Rolle, ob es sich um Bücher, Videos oder Kommentare im Internet handelt. Oft erhalten Filme oder Kommentare an erster Stelle nur aufgrund einer geringen Anzahl begeisterter Fans gute Noten, und wirklich gute Filme oder Kommentare werden auf nachfolgenden Seiten mit angeblich unvollständigen Bewertungen von etwa 4,8 versteckt. Was tun?

Betrachten Sie die beliebte Website Reddit (ich biete absichtlich keine Links dazu an, da Reddit dafür berüchtigt ist, Benutzer anzulocken, und ich befürchte, dass Sie nie wieder zu meinem Buch zurückkehren werden). Auf dieser Seite gibt es viele Links zu verschiedenen Geschichten und Bildern, und Kommentare zu diesen Links sind ebenfalls sehr beliebt. Benutzer der Site (die normalerweise als das Wort redditor1 bezeichnet wird) können für oder gegen jeden Kommentar stimmen (die sogenannten Upvotes und Downvotes). Reddit sortiert Kommentare standardmäßig in absteigender Reihenfolge. Wie kann man feststellen, welche Kommentare die besten sind? Sie konzentrieren sich normalerweise auf die folgenden verschiedenen Indikatoren.

1. Popularität . Ein Kommentar gilt als gut, wenn viele Stimmen abgegeben werden. Probleme bei der Verwendung dieses Modells beginnen bei einem Kommentar mit Hunderten von Stimmen für und Tausenden von Gegenstimmen. Obwohl dieser Kommentar sehr beliebt ist, scheint er zu vieldeutig, um als "bester" angesehen zu werden.

2. Der Unterschied . Sie können den Unterschied zwischen der Anzahl der Stimmen dafür und dagegen ausnutzen. Dies löst das Problem, das bei der Verwendung der Metrik "Beliebtheit" auftritt, berücksichtigt jedoch nicht den temporären Charakter der Kommentare. Kommentare können viele Stunden nach Veröffentlichung des ursprünglichen Links gesendet werden. Gleichzeitig entsteht eine Voreingenommenheit, aufgrund derer die besten Kommentare überhaupt nicht die höchste Bewertung erhalten, sondern die ältesten, denen es gelungen ist, mehr Stimmen als neuere zu sammeln.

3. Korrektur für die Zeit . Stellen Sie sich eine Methode vor, bei der der Unterschied zwischen Vor- und Nachteilen durch das Alter des Kommentars geteilt wird und eine Häufigkeit ermittelt wird, z. B. der Unterschied pro Sekunde oder pro Minute. Ein Gegenbeispiel fällt sofort ein: Wenn Sie die Option "pro Sekunde" verwenden, ist ein Kommentar, der vor einer Sekunde mit einer "Ja" -Stimme hinterlassen wurde, besser als vor 100 Sekunden mit 99 "Ja" -Stimmen. Dieses Problem kann vermieden werden, wenn Sie nur Kommentare berücksichtigen, die vor mindestens t Sekunden hinterlassen wurden. Aber wie wählt man einen guten Wert von t? Bedeutet dies, dass alle Kommentare, die später als vor t Sekunden veröffentlicht wurden, schlecht sind? Der Fall endet mit einem Vergleich instabiler Werte mit stabilen (neue und alte Kommentare).

4. Wert . Die Rangfolge der Kommentare zum Verhältnis der Anzahl der Stimmen zur Gesamtstimmenzahl. Dieser Ansatz beseitigt das Problem mit der zeitlichen Natur von Kommentaren, sodass kürzlich veröffentlichte Kommentare mit guten Noten eine hohe Bewertung mit der gleichen Wahrscheinlichkeit erhalten wie die vor langer Zeit hinterlassenen, vorausgesetzt, sie haben ein relativ hohes Stimmenverhältnis zur Gesamtzahl der Stimmen. Das Problem bei dieser Methode ist, dass ein Kommentar mit einer Stimme (Verhältnis = 1,0) besser ist als ein Kommentar mit 999 Stimmen und einer Gegenstimme (Verhältnis = 0,999), obwohl es offensichtlich ist, dass der zweite von diesen Kommentaren ist wahrscheinlich der beste.

Ich habe aus einem bestimmten Grund „eher“ geschrieben . Es kann sich herausstellen, dass der erste Kommentar mit einer einzigen Ja-Stimme mit 999 Ja-Stimmen wirklich besser ist als der zweite. Es ist schwierig, dieser Aussage zuzustimmen, da wir nicht wissen, welche 999 potenziellen nächsten Stimmen für den ersten Kommentar vorliegen könnten. Sagen wir, er könnte als Ergebnis von weiteren 999 Stimmen dafür und nicht eine einzige Gegenstimme erhalten und besser sein als die zweite, obwohl ein solches Szenario nicht sehr wahrscheinlich ist.

Tatsächlich müssen wir das tatsächliche Stimmenverhältnis bewerten. Ich stelle fest, dass dies keineswegs mit der beobachteten Korrelation der Stimmen dafür übereinstimmt; Das tatsächliche Stimmenverhältnis ist ausgeblendet. Wir beobachten nur die Anzahl der Stimmen im Vergleich zu den Gegenstimmen (das tatsächliche Stimmenverhältnis kann als die Wahrscheinlichkeit angesehen werden, dass dieser Kommentar eine Ja-Stimme erhält, nicht eine Gegenstimme). Dank des Gesetzes der großen Zahlen kann man mit Sicherheit sagen, dass in einem Kommentar mit 999 Ja-Stimmen und einer Gegenstimme das tatsächliche Stimmenverhältnis wahrscheinlich nahe bei 1 liegt. Andererseits sind wir viel weniger zuversichtlich, wie es ausgeht Das tatsächliche Stimmenverhältnis für den Kommentar mit einer Stimme dafür. Dies scheint ein Bayes'sches Problem zu sein.

Eine Möglichkeit, die a priori Verteilung der Ja-Stimmen zu bestimmen, besteht darin, die Geschichte der Verteilung der Ja-Stimmen zu untersuchen. Dies kann erreicht werden, indem Reddit-Kommentare gelöscht und anschließend die Verteilung definiert werden. Dieses Verfahren weist jedoch mehrere Nachteile auf.

1. Asymmetrische Daten . Die absolute Mehrheit der Kommentare hat eine sehr geringe Anzahl von Stimmen, wodurch die Verhältnisse vieler Kommentare nahezu extrem sind (siehe das „dreieckige“ Diagramm im Beispiel mit dem Kaggle-Datensatz in Abb. 4.4) und die Verteilung stark „verzerrt“ ist. Sie können versuchen, nur Kommentare zu berücksichtigen, deren Stimmenzahl einen bestimmten Schwellenwert überschreitet. Aber hier entstehen Schwierigkeiten. Man muss nach einem Gleichgewicht zwischen der Anzahl der verfügbaren Kommentare einerseits und einem höheren Schwellenwert mit der entsprechenden Genauigkeit des Verhältnisses andererseits suchen.

2. Voreingenommene Daten (mit systematischen Fehlern) . Reddit besteht aus vielen Unterforen (Subreddits). Zwei Beispiele: r / aww mit Bildern von lustigen Tieren und r / Politik. Es ist mehr als wahrscheinlich, dass sich das Verhalten der Benutzer beim Kommentieren dieser beiden Reddit-Unterforen radikal unterscheidet: In dem ersten von ihnen werden Besucher höchstwahrscheinlich berührt und verhalten sich freundlich, was zu einer größeren Anzahl von Stimmen im Vergleich zum zweiten führt, in dem Meinungen abgegeben werden in den Kommentaren sind wahrscheinlich abweichend.

In Anbetracht des Vorstehenden erscheint es mir sinnvoll, eine einheitliche A-priori-Verteilung zu verwenden.

Jetzt können wir die hintere Verteilung des tatsächlichen Stimmenverhältnisses berechnen. Das Skript comment_for_top_reddit_pic.py wird verwendet, um Kommentare aus dem derzeit beliebtesten Reddit-Bild zu entfernen. Im folgenden Code haben wir Reddit-Kommentare zum Bild [3] gelöscht : http://i.imgur.com/OYsHKlH.jpg.

from IPython.core.display import Image #       %run #   i-   . %run top_pic_comments.py 2 

 [Output]: Title of submission: Frozen mining truck http://i.imgur.com/OYsHKlH.jpg 

 """ Contents:       Votes:   NumPy  ""  ""    """ n_comments = len(contents) comments = np.random.randint(n_comments, size=4) print "  (    %d) \n -----------"%n_comments for i in comments: print '"' + contents[i] + '"' print " ""/"": ",votes[i,:] print 

 [Output]:   (   77) ----------- "Do these trucks remind anyone else of Sly Cooper?"  ""/"": [2 0] "Dammit Elsa I told you not to drink and drive."  ""/"": [7 0] "I've seen this picture before in a Duratray (the dump box supplier) brochure..."  ""/"": [2 0] "Actually it does not look frozen just covered in a layer of wind packed snow."  ""/"": [120 18] 

Mit N Stimmen und einem gegebenen tatsächlichen Stimmenverhältnis „für“ p ähnelt die Anzahl der Stimmen „für“ einer binomischen Zufallsvariablen mit den Parametern p und N (Tatsache ist, dass das tatsächliche Stimmenverhältnis „für“ der Wahrscheinlichkeit entspricht, eine Stimme für „im Vergleich zur Stimme“ abzugeben. gegen ”mit N möglichen Stimmen / Versuchen). Wir erstellen eine Funktion für die Bayes'sche Ableitung von p in Bezug auf die Stimmenmenge "für" / "gegen" einen bestimmten Kommentar.

 import pymc as pm def posterior_upvote_ratio(upvotes, downvotes, samples=20000): """         ""  "",   ,    ,    . ,    . """ N = upvotes + downvotes upvote_ratio = pm.Uniform("upvote_ratio", 0, 1) observations = pm.Binomial("obs", N, upvote_ratio, value=upvotes, observed=True) # ;    MAP,     #       . map_ = pm.MAP([upvote_ratio, observations]).fit() mcmc = pm.MCMC([upvote_ratio, observations]) mcmc.sample(samples, samples/4) return mcmc.trace("upvote_ratio")[:] 

Das Folgende sind die resultierenden posterioren Verteilungen.

 figsize(11., 8) posteriors = [] colors = ["#348ABD", "#A60628", "#7A68A6", "#467821", "#CF4457"] for i in range(len(comments)): j = comments[i] label = u'(%d :%d )\n%s...'%(votes[j, 0], votes[j,1], contents[j][:50]) posteriors.append(posterior_upvote_ratio(votes[j, 0], votes[j,1])) plt.hist(posteriors[i], bins=18, normed=True, alpha=.9, histtype="step", color=colors[i%5], lw=3, label=label) plt.hist(posteriors[i], bins=18, normed=True, alpha=.2, histtype="stepfilled", color=colors[i], lw=3) plt.legend(loc="upper left") plt.xlim(0, 1) plt.ylabel(u"") plt.xlabel(u"  ''") plt.title(u"    '' \   "); 

 [Output]: [****************100%******************] 20000 of 20000 complete 

Wie aus Abb. 4.5, einige Verteilungen sind stark "gequetscht", während andere relativ lange "Schwänze" haben, was zum Ausdruck bringt, dass wir nicht genau wissen, wofür das tatsächliche Stimmenverhältnis ist.

Bild

4.3.4. Sortieren


Bisher haben wir das Hauptziel unseres Beispiels ignoriert: Kommentare vom Besten zum Schlechtesten zu sortieren. Natürlich ist es unmöglich, die Verteilungen zu sortieren; Sortieren benötigen skalare Werte. Es gibt viele Möglichkeiten, die Essenz der Verteilung in Form eines Skalars zu extrahieren. Zum Beispiel kann das Wesen einer Verteilung in Form ihrer mathematischen Erwartung oder ihres Durchschnittswerts ausgedrückt werden. Der Durchschnittswert hierfür ist jedoch nicht geeignet, da dieser Indikator die Unsicherheit der Verteilungen nicht berücksichtigt.

Ich würde empfehlen, einen am wenigsten plausiblen Wert von 95% zu verwenden, der als Wert mit einer Wahrscheinlichkeit von nur 5% definiert ist, dass der tatsächliche Wert des Parameters darunter liegt (vgl. Die Untergrenze des Bayes'schen Konfidenzintervalls). Als nächstes zeichnen wir die posterioren Verteilungen mit dem angegebenen Wert von 95% am wenigsten wahrscheinlich auf (Abb. 4.6).

Bild

 N = posteriors[0].shape[0] lower_limits = [] for i in range(len(comments)): j = comments[i] label = '(%d :%d )\n%s…'%(votes[j, 0], votes[j,1], contents[j][:50]) plt.hist(posteriors[i], bins=20, normed=True, alpha=.9, histtype="step", color=colors[i], lw=3, label=label) plt.hist(posteriors[i], bins=20, normed=True, alpha=.2, histtype="stepfilled", color=colors[i], lw=3) v = np.sort(posteriors[i])[int(0.05*N)] plt.vlines(v, 0, 10 , color=colors[i], linestyles="—", linewidths=3) lower_limits.append(v) plt.legend(loc="upper left") plt.ylabel(u"") plt.xlabel(u"  ''") plt.title(u"    '' \   "); order = np.argsort(-np.array(lower_limits)) print order, lower_limits 

 [Output]: [3 1 2 0] [0.36980613417267094, 0.68407203257290061, 0.37551825562169117, 0.8177566237850703] 

Das Beste sind nach unserem Verfahren diejenigen Kommentare, für die die höchste Wahrscheinlichkeit besteht, einen hohen Prozentsatz an Ja-Stimmen zu erhalten. Visuell sind dies Kommentare, deren Wert dem zu 95% am wenigsten plausiblen Wert am nächsten kommt. In Abb. 4.6 Der am wenigsten plausible Wert von 95% wird mit vertikalen Linien dargestellt.

Warum ist das Sortieren nach dieser Metrik eine so gute Idee? Das Sortieren nach dem zu 95% am wenigsten plausiblen Wert bedeutet maximale Vorsicht bei der Erklärung von Kommentaren als die besten. Das heißt, selbst im schlimmsten Fall, wenn wir das Stimmenverhältnis stark überschätzen, ist garantiert, dass die besten Kommentare an der Spitze stehen. Mit dieser Bestellung werden die folgenden sehr natürlichen Eigenschaften bereitgestellt.

1. Von den beiden Kommentaren mit dem gleichen beobachteten Stimmenverhältnis „für“ wird der Kommentar mit der höheren Stimmenzahl als der beste anerkannt (da das Vertrauen in das höhere Stimmenverhältnis für ihn höher ist).

2. Von den beiden Kommentaren mit der gleichen Anzahl von Stimmen gilt der beste als der Kommentar mit einer größeren Anzahl von Stimmen.

»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers
» Inhalt
» Auszug

25% Rabatt auf Gutschein für Händler - JavaScript

Nach Bezahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.

Source: https://habr.com/ru/post/de456562/


All Articles