Un modo bayesiano di scegliere un ristorante

Una prospettiva bayesiana per la scelta di un ristorante

Di recente stavo cercando un nuovo buon ristorante. Google Maps mi ha evidenziato 2 opzioni: ristorante A con 10 recensioni tutte a 5 stelle e ristorante B con 200 recensioni e rating medio di 4. Sono stato tentato di scegliere il ristorante A, ma il basso numero di recensioni mi preoccupava. D’altra parte, le numerose recensioni del ristorante B mi hanno dato fiducia nel suo rating di 4 stelle, ma non promettevano nulla di eccellente. Quindi, volevo confrontare i ristoranti e scegliere la migliore, tenendo conto delle recensioni o della mancanza di recensioni. Grazie a Bayes, c’è una soluzione.

Immagine realizzata dall'autore.

Il framework bayesiano consente di fare supposizioni sull’andamento iniziale dei rating e quindi di aggiornare la credenza iniziale in base ai dati osservati.

Impostare le credenze iniziali / priorità

  • Inizialmente non sappiamo nulla sulla probabilità di ogni rating (da 1 a 5 – stelle). Quindi, prima di qualsiasi recensione, tutti i rating hanno la stessa probabilità. Ciò significa che partiamo dalla distribuzione uniforme che può essere espressa come una distribuzione Dirichlet (generalizzazione di Beta).
  • La nostra valutazione media sarà semplicemente (1+2+3+4+5)/5 = 3, dove la maggior parte della probabilità è concentrata.
#misurazioni precedenti di probabilità campionate da uniformesample_size = 10000p_a = np.random.dirichlet(np.ones(5), size=sample_size)p_b = np.random.dirichlet(np.ones(5), size=sample_size)# media precedente delle valutazioni basate sulle probabilità campionateratings_support = np.array([1, 2, 3, 4, 5])prior_reviews_mean_a = np.dot(p_a, ratings_support)prior_reviews_mean_b = np.dot(p_b, ratings_support)
Immagine realizzata dall'autore.

Aggiornare le credenze

  • Per aggiornare le credenze iniziali, è necessario moltiplicare le credenze priore alla probabilità di osservare i dati con le credenze priori.
  • Il dato osservato è naturalmente descritto da una distribuzione multinomiale (generalizzazione della distribuzione binomiale).
  • Si scopre che la distribuzione di Dirichlet è una prior coniugata alla verosimiglianza multinomiale. In altre parole, la nostra distribuzione posteriore è anche una distribuzione di Dirichlet con parametri che incorporano i dati osservati.
Immagine realizzata dall'autore.
#dati osservatireviews_a = np.array([0, 0, 0, 0, 10])reviews_b= np.array([21, 5, 10, 79, 85])# stimare le probabilità dei rating posteriori basate sui dati osservatisample_size = 10000p_a = np.random.dirichlet(reviews_a+1, size=sample_size)p_b = np.random.dirichlet(reviews_b+1, size=sample_size)# calcolare le medie dei rating posterioriposterior_reviews_mean_a = np.dot(p_a, ratings_support)posterior_reviews_mean_b = np.dot(p_b, ratings_support)
  • La valutazione media posteriore di A è ora in qualche punto intermedio tra la precedente di 3 e la successiva osservata di 5. Ma la valutazione media di B non è cambiata molto perché il grande numero di recensioni ha prevalso sulle credenze iniziali.
Immagine realizzata dall'autore.

Quindi, quale è migliore?

  • Tornando alla nostra domanda originale, “migliore” significa la probabilità che una valutazione media di A sia più grande di una valutazione media di B, cioè P(E(A|dati)>E(B|dati)).
  • Nel mio caso ottengo una probabilità dell’85% che il ristorante A sia migliore del ristorante B.
# P(E(A)-E(B)>0)posterior_rating_diff = posterior_reviews_mean_a-posterior_reviews_mean_bp_posterior_better = sum(posterior_rating_diff>0)/len(posterior_rating_diff)
Immagine creata dall'autore.

L’aggiornamento bayesiano ci consente di incorporare credenze precedenti che sono particolarmente preziose in caso di un piccolo numero di recensioni. Tuttavia, quando il numero di recensioni è elevato, le credenze iniziali non influiscono significativamente sulle credenze posteriori.

Il codice è disponibile nel mio github e sto andando al ristorante A.