SlideShare a Scribd company logo
Shiva Chaitanya, Netflix
#DSSAIS11
Stratification Library For Machine
Learning Use Cases At Netflix
• Iterative ML in Netflix
• Boson Library
• Data Sampling (Stratification) Needs
• API Examples
Outline
Title Ranking
Everything is a Recommendation
RowSelection&Ordering
Recommendations are
driven by machine
learning algorithms
Over 80% of what
members watch comes
from our
recommendations
Image
• Try an idea offline using historical data to see if it would have
made better recommendations
• If it would, deploy a live A/B test to see if it performs well in
production
Running Experiments
• When experimenting offline, iterate quickly
• When ready to move to production, transition must be
smooth
• Spark + Scala!
ML Research Pipeline
Hypothesize Prototype Analyze A/B Test Productize
Rapid Iterations
• Developing machine learning
is iterative
• Need a shortened pipeline to
rapidly try ideas
• Entire pipeline must be
amenable to correct
experimentation
• Down-sampled data should
satisfy desired distribution for
model training/testing
• A high level Spark/Scala API for ML exploration
• Focuses on Offline Feature Engineering/Training
for both
• Ad-hoc exploration
• Production
• Think “Subset of SKLearn” for Scala/JVM ecosystem
• Spark’s Dataframe is the core data abstraction
Boson Overview
Design
Experiment
Collect Label
Dataset
Model Training
Compute
Validation Metrics
Model Testing
Design a New Experiment to Test Out Different Ideas
Offline ML
Experiment
Online
System
Online
AB Testing
Running Experiments
Offline Feature
Generation
Snapshots
Infrastructure
Stratify User
Cohorts
Capture Facts Stratify Training
Set
Runs once a
day
Design
Experiment
Collect Label
Dataset
Model Training
Compute
Validation Metrics
Model Testing
Design a New Experiment to Test Out Different Ideas
Offline ML
Experiment
Online
System
Online
AB Testing
Offline Feature
Generation
Snapshots
Infrastructure
Stratify User
Cohorts
Capture Facts Stratify
Training Set
Runs once a
day
Stratify User
Cohorts
Stratify Training
Set
Running Experiments
Data Stratification
• A mechanism to down-sample datasets while meeting a desired
distribution
• Place constraints on snapshotted users while ensuring maximal
training data yield
• Place constraints on training data to make sure a model learns
enough about important/newer demographics
• Several criteria: Small Countries, Emerging Markets, New
Members ...
Flexible Dataframe Stratification API
• Extended stratification methods on Spark dataframes
• Think sampling rules specified with native spark SQL-like expressions
dataframe.stratify(rules = Seq(
$(“country”) == ‘US’ maxPercent 8.0,
$(“tenure”) > 10 && $(“plays”) > 1 minPercent 0.5,
…
))
Sampling Netflix Userbase
• Spark + Scala DSL with strong type safety
• Expressive power to build arbitrary user-sets on demand
• Declarative API that informs the library what to do, not how
• Large set of supported user attributes to stratify by
– E.g Country, Tenure, Plays, Searches, etc
User stratification client
User Stratification
Client
De-normalized
Data
Snapshots
Specify sampling rules
Building Blocks
• Country.US represents US users.
US US &&
M1
M1 || Plays(1,
10)
!US &&
Tenure(10,
100)
• Country.US && Tenure.M1 comprises of
US users AND also in first membership
month.
• Tenure.M1 || Plays(1, 10)) comprises of
users in their first membership month OR
having 1 <= number-of-plays < 10
• !Country.US && Tenure(10, 100))
comprises of international user profiles
AND with tenure in the range 10 - 100
days.
API Example: Specify rules on counts
new UserSet(
samplingRules = Map(
Country.US -> TargetCount(500),
Country.US && Tenure.M1 -> TargetCount(100),
Country.US && Tenure.M2 -> MinCount(200),
Country(“GB”) && Plays(1) -> MaxCount(200),
…
…
)
)
API Example: Specify rules on percentages
new UserSet(
samplingRules = Map(
Country.US -> TargetPercent(40.0),
Country.US && Tenure.M1 -> TargetPercent(20.0),
Country.US && Tenure.M2 -> MinPercent(10.0),
Country(“GB”) && Plays(1) -> MaxPercent(5.0),
…
…
)
)
API Example: EACH Expander
new UserSet(
samplingRules = Map(
Tenure.M1 -> TargetPercent(10.0),
Country.EACH && Tenure.M2 -> MaxPercent(0.2),
…
)
)
Country(“AD”) && Tenure.M2 -> MaxPercent(0.2),
Country(“AE”) && Tenure.M2 -> MaxPercent(0.2),
….
API Example: Error margin to increase yield
new UserSet(
samplingRules = Map(
Tenure.M1 -> TargetPercent(10.0),
Country.EACH && Tenure.M2 -> MaxPercent(0.2),
…
…
),
allowedErrorMargin = 20.0,
)
Algorithm Complexity
• When there are no overlapping regions in the venn diagram space
• Closed expressions to determine the sampling ratio per region are possible
• When the regions overlap, we formulate the optimization problem
as a Linear Programming problem.
• The sampling rules form the constraints
• Objective is to typically maximize the sample size
LP Formulation
0 <= s1 <= C1
0 <= s2 <= C2
0 <= s12 <= C12
p1 * (C1 + C12) <= (s1 + s12) * 100
p2 * (C2 + C12) >= (s2 + s12) * 100
Maximize (s1 + s2 + s12)
C2
C1
C12
minPercent p1
maxPercent p2
Optimization problem
• Shout out to the vagmcs/optimus third party
idiomatic scala library!
https://github.com/vagmcs/Optimus
Code snippet
targetDistroMap.foreach {
case (samplingExpr, freq @ TargetPercent(percent)) =>
val relevantRegions: Seq[Region] =
existingDistroRegionMap.keys.filter(_.contains(samplingExpr)).toSeq
val lpExpression = relevantRegions.map(regionVariables).foldLeft[Expression](Zero)(_ + _)
val leftErrorMargin = MPFloatVar(samplingExpr.toString + "_leftErrorMargin", 0,
existingDistro.totalCount)
val rightErrorMargin = MPFloatVar(samplingExpr.toString + "_rightErrorMargin", 0,
existingDistro.totalCount)
val toleranceMargin = freq.toleranceMargin.getOrElse(targetToleranceMargin)
add(leftErrorMargin <:= overallSizeVariable * Const(0.01 * percent * toleranceMargin/100.0))
add(rightErrorMargin <:= overallSizeVariable * Const(0.01 * percent * toleranceMargin/100.0))
add(lpExpression := overallSizeVariable * Const(0.01 * percent) - leftErrorMargin +
rightErrorMargin)
leftErrorMarginsSum = leftErrorMarginsSum ++ Seq(leftErrorMargin)
rightErrorMarginsSum = rightErrorMarginsSum ++ Seq(rightErrorMargin)
}
Questions?

More Related Content

PDF
Random Walks on Large Scale Graphs with Apache Spark with Min Shen
PDF
Huawei Advanced Data Science With Spark Streaming
PDF
Building Deep Reinforcement Learning Applications on Apache Spark with Analyt...
PPSX
Metrics at Scale @ UBER (Mantas Klasavicius Technology Stream)
PDF
Best Practices for Hyperparameter Tuning with MLflow
PDF
A Tale of Three Deep Learning Frameworks: TensorFlow, Keras, & Deep Learning ...
PDF
Which Is Deeper - Comparison Of Deep Learning Frameworks On Spark
PDF
Automated Hyperparameter Tuning, Scaling and Tracking
Random Walks on Large Scale Graphs with Apache Spark with Min Shen
Huawei Advanced Data Science With Spark Streaming
Building Deep Reinforcement Learning Applications on Apache Spark with Analyt...
Metrics at Scale @ UBER (Mantas Klasavicius Technology Stream)
Best Practices for Hyperparameter Tuning with MLflow
A Tale of Three Deep Learning Frameworks: TensorFlow, Keras, & Deep Learning ...
Which Is Deeper - Comparison Of Deep Learning Frameworks On Spark
Automated Hyperparameter Tuning, Scaling and Tracking

What's hot (20)

PDF
COCOA: Communication-Efficient Coordinate Ascent
PDF
Petabyte Scale Anomaly Detection Using R & Spark by Sridhar Alla and Kiran Mu...
PPTX
From Pipelines to Refineries: scaling big data applications with Tim Hunter
PDF
Advanced Hyperparameter Optimization for Deep Learning with MLflow
PDF
Ernest: Efficient Performance Prediction for Advanced Analytics on Apache Spa...
PDF
Experimental Design for Distributed Machine Learning with Myles Baker
PDF
Scaling Machine Learning To Billions Of Parameters
PDF
Machine Learning Pipelines
PDF
Degrading Performance? You Might be Suffering From the Small Files Syndrome
PDF
Advanced MLflow: Multi-Step Workflows, Hyperparameter Tuning and Integrating ...
PPTX
Measuring Search Engine Quality using Spark and Python
PDF
Spark Summit EU talk by Rolf Jagerman
PDF
Yelp Ad Targeting at Scale with Apache Spark with Inaz Alaei-Novin and Joe Ma...
PDF
Ray: A Cluster Computing Engine for Reinforcement Learning Applications with ...
PDF
Apply MLOps at Scale by H&M
PDF
Embracing a Taxonomy of Types to Simplify Machine Learning with Leah McGuire
PDF
How to use Apache TVM to optimize your ML models
PDF
Willump: Optimizing Feature Computation in ML Inference
PDF
Spark Uber Development Kit
PDF
Scaling Apache Spark MLlib to Billions of Parameters: Spark Summit East talk ...
COCOA: Communication-Efficient Coordinate Ascent
Petabyte Scale Anomaly Detection Using R & Spark by Sridhar Alla and Kiran Mu...
From Pipelines to Refineries: scaling big data applications with Tim Hunter
Advanced Hyperparameter Optimization for Deep Learning with MLflow
Ernest: Efficient Performance Prediction for Advanced Analytics on Apache Spa...
Experimental Design for Distributed Machine Learning with Myles Baker
Scaling Machine Learning To Billions Of Parameters
Machine Learning Pipelines
Degrading Performance? You Might be Suffering From the Small Files Syndrome
Advanced MLflow: Multi-Step Workflows, Hyperparameter Tuning and Integrating ...
Measuring Search Engine Quality using Spark and Python
Spark Summit EU talk by Rolf Jagerman
Yelp Ad Targeting at Scale with Apache Spark with Inaz Alaei-Novin and Joe Ma...
Ray: A Cluster Computing Engine for Reinforcement Learning Applications with ...
Apply MLOps at Scale by H&M
Embracing a Taxonomy of Types to Simplify Machine Learning with Leah McGuire
How to use Apache TVM to optimize your ML models
Willump: Optimizing Feature Computation in ML Inference
Spark Uber Development Kit
Scaling Apache Spark MLlib to Billions of Parameters: Spark Summit East talk ...
Ad

Similar to Apache Spark-Based Stratification Library for Machine Learning Use Cases at Netflix (20)

DOCX
Dynamic autoselection and autotuning of machine learning models forcloud netw...
PDF
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
PDF
2017 Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit Ea...
PDF
Practical Data Science Workshop - Recommendation Systems - Collaborative Filt...
PDF
Pitfalls of machine learning in production
PPTX
Artificial Intelligence on Data Centric Platform
PDF
Making Netflix Machine Learning Algorithms Reliable
PDF
Nose Dive into Apache Spark ML
PDF
MLlib: Spark's Machine Learning Library
PDF
Ml ops intro session
PDF
Streaming Random Forest Learning in Spark and StreamDM with Heitor Murilogome...
PPTX
Employee Salary Presentation.l based on data science collection of data
PDF
Productionalizing Spark ML
PDF
Building machine learning service in your business — Eric Chen (Uber) @PAPIs ...
PPTX
TE_B_10_INTERNSHIP_PPT_ANIKET_BHAVSAR.pptx
DOCX
Software defect estimation using machine learning algorithms
DOCX
Software defect estimation using machine learning algorithms
PDF
XGBoost @ Fyber
PDF
Machine learning systems for engineers
PDF
Machine learning on streams of data
Dynamic autoselection and autotuning of machine learning models forcloud netw...
Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit East ta...
2017 Netflix's Recommendation ML Pipeline Using Apache Spark: Spark Summit Ea...
Practical Data Science Workshop - Recommendation Systems - Collaborative Filt...
Pitfalls of machine learning in production
Artificial Intelligence on Data Centric Platform
Making Netflix Machine Learning Algorithms Reliable
Nose Dive into Apache Spark ML
MLlib: Spark's Machine Learning Library
Ml ops intro session
Streaming Random Forest Learning in Spark and StreamDM with Heitor Murilogome...
Employee Salary Presentation.l based on data science collection of data
Productionalizing Spark ML
Building machine learning service in your business — Eric Chen (Uber) @PAPIs ...
TE_B_10_INTERNSHIP_PPT_ANIKET_BHAVSAR.pptx
Software defect estimation using machine learning algorithms
Software defect estimation using machine learning algorithms
XGBoost @ Fyber
Machine learning systems for engineers
Machine learning on streams of data
Ad

More from Karthik Murugesan (20)

PDF
Rakuten - Recommendation Platform
PDF
Yahoo's Knowledge Graph - 2014 slides
PDF
Free servers to build Big Data Systems on: Bing's Approach
PDF
Microsoft cosmos
PPTX
Microsoft AI Platform - AETHER Introduction
PDF
BIng NLP Expert - Dl summer-school-2017.-jianfeng-gao.v2
PDF
Lyft data Platform - 2019 slides
PDF
The Evolution of Spotify Home Architecture - Qcon 2019
PDF
Unifying Twitter around a single ML platform - Twitter AI Platform 2019
PDF
The magic behind your Lyft ride prices: A case study on machine learning and ...
PDF
The journey toward a self-service data platform at Netflix - sf 2019
PDF
2019 Slides - Michelangelo Palette: A Feature Engineering Platform at Uber
PDF
Developing a ML model using TF Estimator
PDF
Production Model Deployment - StitchFix - 2018
PDF
Netflix factstore for recommendations - 2018
PDF
Trends in Music Recommendations 2018
PDF
Netflix Ads Personalization Solution - 2017
PDF
State Of AI 2018
PDF
Spotify Machine Learning Solution for Music Discovery
PDF
AirBNB - Zipline: Airbnb’s Machine Learning Data Management Platform
Rakuten - Recommendation Platform
Yahoo's Knowledge Graph - 2014 slides
Free servers to build Big Data Systems on: Bing's Approach
Microsoft cosmos
Microsoft AI Platform - AETHER Introduction
BIng NLP Expert - Dl summer-school-2017.-jianfeng-gao.v2
Lyft data Platform - 2019 slides
The Evolution of Spotify Home Architecture - Qcon 2019
Unifying Twitter around a single ML platform - Twitter AI Platform 2019
The magic behind your Lyft ride prices: A case study on machine learning and ...
The journey toward a self-service data platform at Netflix - sf 2019
2019 Slides - Michelangelo Palette: A Feature Engineering Platform at Uber
Developing a ML model using TF Estimator
Production Model Deployment - StitchFix - 2018
Netflix factstore for recommendations - 2018
Trends in Music Recommendations 2018
Netflix Ads Personalization Solution - 2017
State Of AI 2018
Spotify Machine Learning Solution for Music Discovery
AirBNB - Zipline: Airbnb’s Machine Learning Data Management Platform

Recently uploaded (20)

PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
Programs and apps: productivity, graphics, security and other tools
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Approach and Philosophy of On baking technology
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Machine Learning_overview_presentation.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Empathic Computing: Creating Shared Understanding
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
A Presentation on Artificial Intelligence
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Mobile App Security Testing_ A Comprehensive Guide.pdf
Network Security Unit 5.pdf for BCA BBA.
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
sap open course for s4hana steps from ECC to s4
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Programs and apps: productivity, graphics, security and other tools
The AUB Centre for AI in Media Proposal.docx
Approach and Philosophy of On baking technology
Reach Out and Touch Someone: Haptics and Empathic Computing
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Machine Learning_overview_presentation.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
Empathic Computing: Creating Shared Understanding
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Diabetes mellitus diagnosis method based random forest with bat algorithm
A Presentation on Artificial Intelligence
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx

Apache Spark-Based Stratification Library for Machine Learning Use Cases at Netflix

  • 1. Shiva Chaitanya, Netflix #DSSAIS11 Stratification Library For Machine Learning Use Cases At Netflix
  • 2. • Iterative ML in Netflix • Boson Library • Data Sampling (Stratification) Needs • API Examples Outline
  • 3. Title Ranking Everything is a Recommendation RowSelection&Ordering Recommendations are driven by machine learning algorithms Over 80% of what members watch comes from our recommendations Image
  • 4. • Try an idea offline using historical data to see if it would have made better recommendations • If it would, deploy a live A/B test to see if it performs well in production Running Experiments
  • 5. • When experimenting offline, iterate quickly • When ready to move to production, transition must be smooth • Spark + Scala! ML Research Pipeline Hypothesize Prototype Analyze A/B Test Productize
  • 6. Rapid Iterations • Developing machine learning is iterative • Need a shortened pipeline to rapidly try ideas • Entire pipeline must be amenable to correct experimentation • Down-sampled data should satisfy desired distribution for model training/testing
  • 7. • A high level Spark/Scala API for ML exploration • Focuses on Offline Feature Engineering/Training for both • Ad-hoc exploration • Production • Think “Subset of SKLearn” for Scala/JVM ecosystem • Spark’s Dataframe is the core data abstraction Boson Overview
  • 8. Design Experiment Collect Label Dataset Model Training Compute Validation Metrics Model Testing Design a New Experiment to Test Out Different Ideas Offline ML Experiment Online System Online AB Testing Running Experiments Offline Feature Generation Snapshots Infrastructure Stratify User Cohorts Capture Facts Stratify Training Set Runs once a day
  • 9. Design Experiment Collect Label Dataset Model Training Compute Validation Metrics Model Testing Design a New Experiment to Test Out Different Ideas Offline ML Experiment Online System Online AB Testing Offline Feature Generation Snapshots Infrastructure Stratify User Cohorts Capture Facts Stratify Training Set Runs once a day Stratify User Cohorts Stratify Training Set Running Experiments
  • 10. Data Stratification • A mechanism to down-sample datasets while meeting a desired distribution • Place constraints on snapshotted users while ensuring maximal training data yield • Place constraints on training data to make sure a model learns enough about important/newer demographics • Several criteria: Small Countries, Emerging Markets, New Members ...
  • 11. Flexible Dataframe Stratification API • Extended stratification methods on Spark dataframes • Think sampling rules specified with native spark SQL-like expressions dataframe.stratify(rules = Seq( $(“country”) == ‘US’ maxPercent 8.0, $(“tenure”) > 10 && $(“plays”) > 1 minPercent 0.5, … ))
  • 12. Sampling Netflix Userbase • Spark + Scala DSL with strong type safety • Expressive power to build arbitrary user-sets on demand • Declarative API that informs the library what to do, not how • Large set of supported user attributes to stratify by – E.g Country, Tenure, Plays, Searches, etc
  • 13. User stratification client User Stratification Client De-normalized Data Snapshots Specify sampling rules
  • 14. Building Blocks • Country.US represents US users. US US && M1 M1 || Plays(1, 10) !US && Tenure(10, 100) • Country.US && Tenure.M1 comprises of US users AND also in first membership month. • Tenure.M1 || Plays(1, 10)) comprises of users in their first membership month OR having 1 <= number-of-plays < 10 • !Country.US && Tenure(10, 100)) comprises of international user profiles AND with tenure in the range 10 - 100 days.
  • 15. API Example: Specify rules on counts new UserSet( samplingRules = Map( Country.US -> TargetCount(500), Country.US && Tenure.M1 -> TargetCount(100), Country.US && Tenure.M2 -> MinCount(200), Country(“GB”) && Plays(1) -> MaxCount(200), … … ) )
  • 16. API Example: Specify rules on percentages new UserSet( samplingRules = Map( Country.US -> TargetPercent(40.0), Country.US && Tenure.M1 -> TargetPercent(20.0), Country.US && Tenure.M2 -> MinPercent(10.0), Country(“GB”) && Plays(1) -> MaxPercent(5.0), … … ) )
  • 17. API Example: EACH Expander new UserSet( samplingRules = Map( Tenure.M1 -> TargetPercent(10.0), Country.EACH && Tenure.M2 -> MaxPercent(0.2), … ) ) Country(“AD”) && Tenure.M2 -> MaxPercent(0.2), Country(“AE”) && Tenure.M2 -> MaxPercent(0.2), ….
  • 18. API Example: Error margin to increase yield new UserSet( samplingRules = Map( Tenure.M1 -> TargetPercent(10.0), Country.EACH && Tenure.M2 -> MaxPercent(0.2), … … ), allowedErrorMargin = 20.0, )
  • 19. Algorithm Complexity • When there are no overlapping regions in the venn diagram space • Closed expressions to determine the sampling ratio per region are possible • When the regions overlap, we formulate the optimization problem as a Linear Programming problem. • The sampling rules form the constraints • Objective is to typically maximize the sample size
  • 20. LP Formulation 0 <= s1 <= C1 0 <= s2 <= C2 0 <= s12 <= C12 p1 * (C1 + C12) <= (s1 + s12) * 100 p2 * (C2 + C12) >= (s2 + s12) * 100 Maximize (s1 + s2 + s12) C2 C1 C12 minPercent p1 maxPercent p2
  • 21. Optimization problem • Shout out to the vagmcs/optimus third party idiomatic scala library! https://github.com/vagmcs/Optimus
  • 22. Code snippet targetDistroMap.foreach { case (samplingExpr, freq @ TargetPercent(percent)) => val relevantRegions: Seq[Region] = existingDistroRegionMap.keys.filter(_.contains(samplingExpr)).toSeq val lpExpression = relevantRegions.map(regionVariables).foldLeft[Expression](Zero)(_ + _) val leftErrorMargin = MPFloatVar(samplingExpr.toString + "_leftErrorMargin", 0, existingDistro.totalCount) val rightErrorMargin = MPFloatVar(samplingExpr.toString + "_rightErrorMargin", 0, existingDistro.totalCount) val toleranceMargin = freq.toleranceMargin.getOrElse(targetToleranceMargin) add(leftErrorMargin <:= overallSizeVariable * Const(0.01 * percent * toleranceMargin/100.0)) add(rightErrorMargin <:= overallSizeVariable * Const(0.01 * percent * toleranceMargin/100.0)) add(lpExpression := overallSizeVariable * Const(0.01 * percent) - leftErrorMargin + rightErrorMargin) leftErrorMarginsSum = leftErrorMarginsSum ++ Seq(leftErrorMargin) rightErrorMarginsSum = rightErrorMarginsSum ++ Seq(rightErrorMargin) }