Skip to main content

Lärdom

Det bayesianska tillvägagångssättet för A/B-testning

Från idé till genomförande och analys – data och analys kan stödja marknadsförare i varje steg och förvandla alla företag till en insiktsdriven branschledare.

Siva Gabbi profile photo

Siva Gabbi

Manager, Specialist Sales,

Mastercard

Tillämpningarna av A/B-testning är urgamla och sträcker sig över en rad branscher, från medicinsk läkemedelstestning till optimering av upplevelser inom e-handel. Men i takt med att verktygen för att fatta välgrundade beslut baserat på insikter från insamlad data fortsätter att utvecklas har även det bästa tillvägagångssättet förändrats. 

Det frekventistiska synsättet på statistisk inferens i A/B-testningsscenarier, som en gång var universellt accepterat, ersätts nu av en ny guldstandard. Det bayerska synsättet, som också baseras på hypotesprövningens grundval, är känt för sin mindre restriktiva, mycket intuitiva och mer tillförlitliga natur. Medan Mastercard Dynamic Yield redan har skrivit om saken är mitt mål att dyka ner i siffrorna bakom den bayerska skolan och utföra lämpliga härledningar där så behövs. 

 

Grundläggande filosofi för bayesianska metoder: 

I ett bayesianskt angreppssätt är allt en slumpvariabel och har i anslutning till det sannolikhetsfördelning och parametrar. 

Inom frekventistisk statistik, om vi vill modellera klickfrekvensen för en grupp, försöker vi hitta dess medelvärde och varians, som fungerar som parametrar. Och för att hitta dessa parametrar samlar vi in insikter från urvalsdata, skriver ner sannolikheten och maximerar den sedan med avseende på parametrarna. Vi går vidare med att bygga konfidensintervall kring denna Maximum Likelihood-klickfrekvens för att kvantifiera osäkerheten kring var det verkliga medelvärdet skulle ligga. 

Inom Bayesiansk statistik är det verkliga medelvärdet en fördelning men observationerna är fasta, vilket modellerar verkligt beslutsfattande mycket bättre. Mer exakt definieras sannolikhetsfunktionen (pmf) för en Bernoullifördelning som:

Där π är sannolikheten för att klicka. 

Här bör π, enligt det bayesianska tillvägagångssättet, också ha en egen fördelning, egna parametrar och så vidare. 

 

Medelsannolikhetsfördelning & dess parametrar:

För att beräkna den genomsnittliga klickfrekvensen, på samma sätt som medelvärdet för Maximum Likelihood i ett traditionellt A/B-test, försöker vi lösa ut värdet π i ekvationen nedan: 

Där X = de observerade datainsikterna. 

Vi tillämpar den goda gamla Bayesianska formeln för villkorad sannolikhet:

Här kan p(X) behandlas som en normaliseringskonstant med tanke på dess oberoende av π.

Därför: 

p(π) = sannolikhet för klick innan experimentet började – prioritet
p(X|π) = observerade datapunkter – sannolikhet
p(π|X) = sannolikhet för klick efter att urvalet har observerats – posterior

 

Apriori-, sannolikhets- och aposteriorisannolikhetsfördelningar

Vi kan beräkna p(X)-värdet (sannolikheten för klickfrekvens) givet de observerade urvalsdatainsikterna som en produkt av prior och sannolikhet. Här är sannolikheten a priori sannolikheten att klicka på en variant innan några insikter från urvalsdata samlas in (detta skulle vara det historiska genomsnittet för ett experiment eller, i frånvaro av data, kan likställas med en likformig fördelning), medan likelihood är sannolikhetsfördelningen för de insamlade insikterna från urvalsdata.

För att lösa denna ekvation utnyttjar vi ett koncept som kallas konjugatfördelning. Inom bayesiansk sannolikhetsteori kallas prior och posterior för konjugerade fördelningar om posteriorfördelningen har samma sannolikhetsfördelning som priorfördelningen givet en likelihood-funktion. Prior-fördelningen kallas för en konjugatfördelning för likelihood-funktionen.

I vårt fall, om sannolikhetsfunktionen är bernoullifördelad, säkerställer ett val av en betaprior för medelvärdet att även a posteriorifördelningen är betafördelad. I huvudsak är betafördelningen en konjugerad prior för den sannolikhet som är bernoullifördelad! 

Låt oss se hur utnyttjandet av detta koncept hjälper oss att lösa a posteriori-sannolikheten för både kontinuerliga och binära variabler.

Binära variabler

Eftersom vi har att göra med en Bernoulli-fördelning behöver vi bara hantera en slumpvariabel (π). Om vi antar att vår sannolikhetsfunktion följer en prior-beta-fördelning: 

Om vi dessutom antar att experimentet börjar helt förutsättningslöst, är en betafördelning för prioritet med α=1; β=1 en bra utgångspunkt eftersom beta (1,1) är en likformig fördelning: 

Gruppera liknande termer: 

Vi kan se att posteriorfördelningen helt enkelt är en betafördelning av typen:

Plats:

Vilket är detsamma som vår apriorisannolikhetsfördelning:

Detta bekräftar därmed konceptet med konjugerade prioriterade fördelningar för binära utfall.

För att lösa en a posteriori-sannolikhet för binära utfall skulle ritningen vara:

  1. π ~ Beta (1,1): assume the prior distribution is uniform
  2. Exempel på x1
  3. π ~ Beta (1+x1 ,1+1- x1): uppdatera betafördelningen för att ta hänsyn till de observerade urvalsdata
  4. Exempel x2
  5. π ~ Beta (1+x2 ,1+2- x2)
  6. Upprepa från steg 2

Till slut når vi en betafördelning som går från en likformig fördelning till en smal normalfördelning.

Följande kod, som är implementerad i Python, gör det lättare att visualisera förloppet och visar tydligt hur den bayesianska sannolikheten förändras över tid i takt med att antalet stickprov ökar

  1.     from __future__ import print_function, division
  2.  
  3.  
  4.     #! usr/bin/env python"
  5.         __author__ = "SivaGabbi"
  6.     __copyright__ = "Copyright 2019, Dynamic Yield"
  7.  
  8.  
  9.     from builtins import rangev
  10.     import matplotlib.pyplot as plt
  11.     import numpy as np
  12.     from scipy.stats import beta
  13.  
  14.  
  15.     NUM_TRIALS = 2000
  16.     CLICK_PROBABILITIES = [0.35,0.75]
  17.  
  18.  
  19.     class Variation(object):
  20.     def __init__(self, p):
  21.     self.p = p
  22.     self.a = 1
  23.     self.b = 1
  24.  
  25.     def showVariation(self):
  26.     return np.random.random() < self.p
  27.  
  28.     def sampleVariation(self):
  29.     return np.random.beta(self.a, self.b)
  30.  
  31.     def updateVariation(self, x):
  32.     self.a += x
  33.     self.b += 1 - x
  34.  
  35.  
  36.     def plot(variations, trial):
  37.     x = np.linspace(0, 1, 200)
  38.     for b in variations:
  39.     y = beta.pdf(x, b.a, b.b)
  40.         plt.plot(x, y, label="real p: %.4f" % b.p)
  41.         plt.title("variation distributions after %s trials" % trial)
  42.     plt.legend()
  43.     plt.show()
  44.  
  45.  
  46.     def experiment():
  47.     variations = [Variation(p) for p in CLICK_PROBABILITIES]
  48.  
  49.     sample_points = [5,10,20,50,100,200,500,1000,1500,1999]
  50.     for i in range(NUM_TRIALS):
  51.  
  52.     # ta ett urval från varje variant
  53.     bestv = None
  54.     maxsample = -1
  55.     allsamples = []
  56.     for v in variations:
  57.     sample = v.sampleVariation()
  58.         allsamples.append("%.4f" %-prov)
  59.     if sample > maxsample:
  60.     maxsample = sample
  61.     bestv = v
  62.     if i in sample_points:
  63.         print("current samples: %s" % allsamples)
  64.     plot(variations, i)
  65.  
  66.     # visa variationen med det största urvalet
  67.     x = bestv.showVariation()
  68.  
  69.     # uppdatera distributionen för den variation som just samplades
  70.     bestv.updateVariation(x)
  71.  
  72.  
  73.         if __name__ == "__main__":
  74.     experiment()

Utvecklingen av π över tid kan ses som:

Diagram över pi-utveckling över tid

Kontinuerliga variabler

Eftersom vi har att göra med en Bernoulli-fördelning behöver vi bara hantera en stokastisk variabel (π). Om vi antar att vår likelihood-funktion följer en prior-betafördelning:
 

Diskreta variabler:

För att optimera diskreta mätvärden, såsom antal köp, sidvisningar och så vidare, arbetar vi med en gammagivna och en Poisson-sannolikhet. Vilket återigen resulterar i en gamma-posterior.

 

Dynamisk allokering / Utforskande kontra exploatering-dilemma / Multi-arm bandit

Tänk dig att du är på ett casino och har två spelautomater att välja mellan, och att du väljer en av dem och vinner 3/3 gånger du spelar. Vilket skulle ditt nästa drag vara? Skulle du fortsätta att spela på maskinen som har visat sig vinna eller pröva den andra? 

Denna situation sammanfattar exakt utforska-exploatera-dilemmat – valet mellan att samla in mer datainsikter och att maximera avkastningen, vilket vi redan har beskrivet nära tillämpas på A/B-testning. 

Eftersom du i ett traditionellt A/B-test tilldelar en procentandel av trafiken finns det ingen möjlighet att utnyttja datainsikterna, det vill säga att inkrementellt tilldela mer trafik till den vinnande varianten. 

Låt oss se hur detta uppnås i en bayesiansk miljö. 

Kort sagt löser urval helt utforska-utnyttja-dilemmat för oss i ett Bayesianskt test. Anta att du har fördelat trafik slumpmässigt mellan två varianter (blå och orange) och nått följande posteriora sannolikhetsfördelning för båda: 

Graf över variationsfördelningar efter testerna 1999

Som kan ses är den orangea varianten helt klart representerad i ett mycket större urval än den blå varianten. Och hur uppmärksammar vi detta? Variansen! Vi såg tidigare att en a posteriori-sannolikhet blir smalare med mer provdata, så med tanke på att den blå variationen fortfarande är fylligare kan vi dra slutsatsen att den inte är tillräckligt samplad. 

Om vi i det här läget beslutar oss för att slumpmässigt välja ut två punkter, en från varje variation, och jämföra dem båda, hur stor är sannolikheten för att den orangea variationen är högre? 

  1. Om urvalet från den blå variationen kommer från diagrammets högra hälft har det bättre sannolikhet att vara högre 

  1. Om urvalet från den blå variationen kommer från den vänstra halvan av diagrammet är det troligtvis lägre än den orangea variationen 

Vad händer om vi beslutar vilken variation som ska visas härnäst baserat på vilken som har det högre värdet i det här slumpmässiga urvalet? 

→ Om den blå varianten vinner visas den sedan bredvid målgruppen, vilket utökar urvalet samtidigt som den avgränsar kring en fast sannolikhet för dess sanna medelvärde. Här ser vi två ytterligare möjligheter: 

  • Dess slutgiltiga sannolikhet > den orangea variationens sannolikhet: Om urvalet fortsätter kommer den blå variationen att fortsätta vinna 

  • Dess slutgiltiga sannolikhet < den orangea variantens sannolikhet: Den orangea varianten skulle samplas mer och fortsätta att visas 

→ Om den blå varianten förlorar visas den orange varianten 

Därför tar urvalet hand om utforska-och-utnyttja-dilemmat åt oss och fattar alltid det bästa beslutet för vår räkning. 

 

Tillkännage en vinnare 

När a-posteriori-fördelningarna har kartlagts för de olika varianterna tar du ett stort antal observationer för att fastställa en vinnare. Låt oss hypotetiskt säga att du gör 1 000 dragningar från två varianter och att du 999 gånger av 1 000 ser att den orangea varianten har en högre sannolikhet: 

Diagram över konverteringsgrad

Sannolikheten för att variation orange är bättre än variation blå kommer att vara (999 / 1 000) × 100, vilket är 99,9 %. 

På Mastercard Dynamic Yield drar vi 300 000 slumpmässiga urval från varje variation för att beräkna sannolikheten att vara bäst (Probability to Be Best, P2BB). 

 

Möjlighet till att utforska och exploatera

När du kör ett traditionellt A/B-test där en variation presterar betydligt bättre än en annan visas fortfarande den sämre variationen för en stor publik tills statistisk signifikans har uppnåtts. Även om det gör det möjligt att fastställa en vinnare med säkerhet kan väntetiden leda till förlorade affärsmöjligheter. 

I en idealisk värld bör du kunna leda om trafik från den svagare varianten och maximera avkastningen med vinnarvarianten. För att ge den svagare varianten en chans att ta ledningen tilldelar vi den en minimal andel av trafiken (kallad epsilon) och utnyttjar vinnarvarianten. Därmed har termen ”utforska vs. utnyttja” (även kallad ”epsilon-greedy” i vissa sammanhang) uppstått, vilket handlar om hur mycket tid som ”slösas bort” på att lära sig i stället för att dra nytta av det som redan har lärts in. Den här funktionen är i princip omöjlig i ett traditionellt A/B-test, såvida du inte är fast besluten att producera falskt positiva resultat.

 

Bayesiansk sammanfattning

Sammanfattning av det som har tagits upp hittills: 

  • Bayesiansk A/B-testning konvergerar snabbare än ett traditionellt A/B-test med mindre urvalsdata tack vare dess mindre restriktiva antaganden 

  • Att uppnå signifikans är ”inkrementellt” till sin natur vid bayesiansk A/B-testning. Du kan när som helst kontrollera värdena och besluta dig för att avbryta experimentet 

  • Försumbar risk för ett falskt positivt fel 

  • Utforskande strategi vid bayesiansk testning lämnar inga pengar på bordet 

Sammanfattningsvis rör sig branschen mot det bayesianska ramverket eftersom det är en enklare, mindre restriktiv, mycket intuitiv och mer tillförlitlig metod för A/B-testning. Faktum är att Mastercard Dynamic Yield har gått över till en bayesiansk statistisk motor, inte bara för binära mål som konverteringsgrad och klickfrekvens (CTR) utan även för icke-binära mål som intäkt per användare. 

Om du vill veta mer om de frågor som tas upp i den frekventistiska ansatsen kan du kika på det här blogginlägget. 

Kontakta säljavdelningen

Prata med en expert för att ta reda på hur Mastercard kan göra din verksamhet ännu bättre med hjälp av våra produkter och tjänster.

Mastercard