Multi-Armed Bandits applied to Qlik
- Igor Alcantara
- Oct 9, 2024
- 2 min read
Hello, Data Explorers! 🚀
In this video series, we discuss what is Multi-Armed Bandits, a very popular technique that is used in several use cases where it is not clear which resource is best to invest in. What is the best Ad to invest my money on, what is the best employee to send to a conference, what is the best research to add more investment? These are just some of the use cases this powerful yet simple technique is applicable.
This is a series of 2 videos. We recommend that you watch both of them and in order. The first video, we explain the simplified theory of Multi-Armed Bandits and in the second video, we show an example of a Qlik implementation of this concept.
At the end of this post, you can find the implementation code.
Video 01: Multi-Armed Bandits Simplified
Video 02: Multi-Armed Bandits Implementation in Qlik
Qlik Script
// Step 1: Collect Near Real-Time User Interaction/*Data Required:    Ad Impressions: Records of when an ad was displayed to a user.    Ad Clicks: Records of when a user clicked on an ad.Data Fields:	AdID: Identifier for the ad.    Timestamp: When the impression or click occurred.    UserID (optional): To track user-specific behavior.Data Source:	This data could come from logs, databases, or real-time event streams.*/// Step 2: Import Real Data into Qlik// Load ad impressionsImpressions:LOAD    AdID,    TimestampFROM [YourImpressionsDataSource];// Load ad clicksClicks:LOAD    AdID,    TimestampFROM [YourClicksDataSource];// Step 3: Prepare the Data// Combine impressions and clicksAdEvents:LEFT JOIN (Impressions)LOAD    AdID,    Timestamp,    1 AS ClickedRESIDENT Clicks;AdEvents:NOCONCATENATELOAD    AdID,    Timestamp,    IF(ISNULL(Clicked), 0, Clicked) AS ClickRESIDENT AdEvents;DROP TABLE Impressions;DROP TABLE Clicks;// Step 4: Initialize Ad Statistics// Initialize or update ad statisticsAdStats:LOAD    AdID,    COUNT(AdID) AS DisplayCount,    SUM(Click) AS ClickCountRESIDENT AdEventsGROUP BY AdID;// Step 5: Implement the Epsilon-Greedy AlgorithmLET epsilon = 0.1;       // Exploration rateLET randomNumber = Rand();IF $(randomNumber) <= $(epsilon) THEN    // Exploration: randomly select an ad    LET selectedAd = FieldValue('AdID', Ceil(Rand() * FieldValueCount('AdID')));ELSE    // Exploitation: select the ad with the highest estimated CTR    EstimatedCTR:    LOAD        AdID,        IF(DisplayCount=0, 0, ClickCount / DisplayCount) AS EstimatedCTR    RESIDENT AdStats;    MaxCTR:    LOAD        MAX(EstimatedCTR) AS MaxEstimatedCTR    RESIDENT EstimatedCTR;    BestAds:    LOAD        AdID    RESIDENT EstimatedCTR    WHERE EstimatedCTR = Peek('MaxEstimatedCTR', 0, 'MaxCTR');    LET numBestAds = NoOfRows('BestAds');    LET selectedRow = Floor(Rand() * $(numBestAds));    LET selectedAd = Peek('AdID', $(selectedRow), 'BestAds');    DROP TABLE MaxCTR;    DROP TABLE EstimatedCTR;    DROP TABLE BestAds;ENDIF// Step 6: Update the Statistics with Real-Time Data// Update counts for the selected adAdStats:NOCONCATENATELOAD    AdID,    IF(AdID = $(selectedAd), DisplayCount + 1, DisplayCount) AS DisplayCount,    IF(AdID = $(selectedAd), ClickCount + 1, ClickCount) AS ClickCountRESIDENT AdStats;// Step 7: Automate the Process/*Scheduling and Triggers:	Set up the Qlik script to run at appropriate intervals or trigger updates based on new data.Integration with Ad Serving Platform:	Connect the algorithm's output (selectedAd) with your ad delivery system.*/







Comments