{"id":14205,"date":"2026-08-05T18:25:40","date_gmt":"2026-08-05T18:25:40","guid":{"rendered":"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/model-scoring-overview"},"modified":"2026-08-07T22:40:02","modified_gmt":"2026-08-07T22:40:02","slug":"model-scoring-overview","status":"publish","type":"docs","link":"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/model-scoring-overview","title":{"rendered":"Model Scoring Overview"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>How it works<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Building and Interpreting a Model<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Pontiac models, including User Defined Models, evaluate bid requests using scores assigned to individual attributes and combinations. For User Defined Models, these entries are supplied in an uploaded JSON or CSV file and may optionally include custom field weights.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The model acts as a lookup table. It does not calculate a prediction directly from the raw request. Instead, the classifier identifies the model entries that match each bid request, combines their scores, and produces a request-level score that the bidder uses to determine bidding behavior based on the line\u2019s configured model settings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This article explains how Pontiac interprets and applies model scores. For the supported fields, file formats, field-weight configuration, and structure required to create a custom model, see <a href=\"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/user-defined-models\">User Defined Models<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Building a Model File<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A model file may contain three entry types:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Individual attribute entries<\/li>\n\n\n\n<li>Two-variable combination entries<\/li>\n\n\n\n<li>Three-variable combination entries<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You may mix all three entry types within the same JSON array. Their order in the file does not affect scoring, and a model does not need to contain every entry type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n  { \"feature\": \"geo_zip\", \"value\": \"10025\", \"score\": 0.95 },\n  { \"feature\": \"geo_zip\", \"value\": \"07302\", \"score\": -0.60 },\n  { \"feature\": \"device_type\", \"value\": \"4\", \"score\": 0.30 },\n  { \"feature\": \"publisher_name\", \"value\": \"iheartmedia\", \"score\": 0.40 },\n  { \"feature\": \"publisher_name\", \"value\": \"lowvaluenet\", \"score\": -0.85 },\n\n  {\n    \"feature1\": \"geo_zip\",\n    \"feature2\": \"device_type\",\n    \"combination\": \"10025 \u00d7 4\",\n    \"score\": 0.90\n  },\n\n  {\n    \"feature1\": \"geo_zip\",\n    \"feature2\": \"publisher_name\",\n    \"feature3\": \"device_type\",\n    \"combination\": \"10025 \u00d7 iheartmedia \u00d7 4\",\n    \"score\": 0.85\n  }\n]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For combination entries, the values in <code>combination<\/code> must appear in the same order as the corresponding <code>feature1<\/code>, <code>feature2<\/code>, and <code>feature3<\/code> fields and must be separated by <code>\u00d7<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"feature1\": \"geo_zip\"\n\"feature2\": \"device_type\"\n\"combination\": \"10025 \u00d7 4\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>geo_zip = 10025 AND device_type = 4\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Recommended Model Structure<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Individual attributes should form the foundation of the model. They provide the broadest coverage and are the entries most likely to match available bid requests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add two-variable combinations when the interaction provides information that is not already represented by the individual attributes. For example, a publisher-and-device combination is useful when that publisher performs materially differently on that device type than would be expected from the publisher and device scores independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid adding combinations that merely repeat the same information as their component attributes. Because every matching entry participates in the combined score, an unnecessary combination may dilute stronger signals without improving the model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use three-variable combinations selectively. They are highly specific, match less frequently, and may be more likely to represent patterns that do not generalize beyond the source dataset.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A practical order for developing a model is:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the strongest individual attributes.<\/li>\n\n\n\n<li>Add two-variable combinations that show a meaningful interaction.<\/li>\n\n\n\n<li>Add three-variable combinations only when there is strong evidence that the specific interaction is reliable.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">An existing Pontiac Analytics report may provide a useful starting point. The Downloads tab of a completed targeting report includes per-value and combination scores using the same feature vocabulary and \u22121-to-1 score scale. These scores can be reviewed, pruned, and adjusted before being used in a User Defined Model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pontiac Analytics models apply the same principle when selecting combinations. Every single-value entry that clears the evidence requirements is included, while two- and three-variable combinations are capped at <strong>400 total entries<\/strong>, selected by absolute signal strength across both positive and negative directions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The combination limit is deliberate. Because every matching entry participates in the combined score, a weak combination does not remain inert simply because its signal is small. When it matches, it takes a share of the average and can pull the result toward neutral.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testing across 10 reports found that a 400-combination limit ranked inventory better than a 1,500-combination limit. In the same evaluation, including no combinations at all also performed better than including 1,500.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As a result, the combination entries available from a Pontiac Analytics report are intentionally pruned. A report used as the starting point for a User Defined Model does not represent every combination identified during analysis; it contains the strongest combinations retained for model scoring.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">What Model Scores Mean<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Model-entry scores are relative signals. They are not literal probabilities, predicted conversion rates, or guarantees of performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a model score of <code>0.80<\/code> does not mean that a request has an 80% probability of converting. It means that the value represents a stronger positive signal for the model\u2019s objective than a value scored <code>0.60<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scores in the model file use a scale from \u22121 to 1:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Model Score<\/th><th>General Interpretation<\/th><\/tr><\/thead><tbody><tr><td>0.8 to 1.0<\/td><td>Strong positive signal<\/td><\/tr><tr><td>0.3 to 0.7<\/td><td>Moderate positive signal<\/td><\/tr><tr><td>\u22120.3 to 0.3<\/td><td>Weak or inconclusive signal<\/td><\/tr><tr><td>\u22120.7 to \u22120.3<\/td><td>Moderate negative signal<\/td><\/tr><tr><td>\u22121.0 to \u22120.8<\/td><td>Strong negative signal<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The most important considerations are the ordering of the scores and the distance between them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Values near <code>1<\/code> and <code>\u22121<\/code> should be reserved for the strongest and most reliable signals. If every entry is assigned a similarly high score, the model has little ability to distinguish between inventory opportunities and may behave more like an include list than an optimization model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weak or inconclusive entries are generally better omitted. A score of <code>0<\/code> is not ignored. It is treated as a matching entry and contributes to the average, pulling the final result toward the neutral midpoint.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">What Is Inside a Pontiac Analytics Model<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A User Defined Model contains the scores supplied in the uploaded model file. A model produced by Pontiac Analytics is assembled from multiple sources.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><strong>Entry Type<\/strong><\/th><th><strong>Score Source<\/strong><\/th><\/tr><tr><td>Individual attribute<\/td><td>50% normalized SHAP + 50% empirical-Bayes signal from observed rates<\/td><\/tr><tr><td>Individual attribute with no SHAP available<\/td><td>Empirical-Bayes signal only<\/td><\/tr><tr><td>Two- and three-variable combinations<\/td><td>Empirical-Bayes signal only<\/td><\/tr><tr><td>Per-field weights<\/td><td>SHAP-derived<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The 50\/50 blend used for individual attributes is a measured choice rather than a default. Across temporal validation splits, it performed better than either pure SHAP or pure observed-rate scoring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this reason, the scores produced by Pontiac Analytics should be understood as <strong>attribution-informed evidence scores<\/strong>, not SHAP values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction is especially important for combinations, which contain no SHAP component. SHAP contributes to individual-attribute scoring where available and to the field-importance weights used when matching scores are combined, but it is not the sole source of the model\u2019s scores.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Model Confidence<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Each Pontiac Analytics report includes a model confidence rating of <strong>high, medium, low, or none<\/strong>. The rating is displayed at the top of the report\u2019s executive summary and stored with the report.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Confidence considers three areas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The number of observed conversions or clicks relative to measured minimums<\/li>\n\n\n\n<li>The model\u2019s cross-validated ranking ability<\/li>\n\n\n\n<li>The amount of training data supporting each field<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The overall confidence rating reflects the weakest of these components because insufficient support in any one area can undermine the reliability of the model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For practical use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Low<\/strong> \u2014 treat the model as directional. Do not scale spend based on the model alone.<\/li>\n\n\n\n<li><strong>None<\/strong> \u2014 no bid model was produced.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">ser Defined Models do not receive a confidence rating. Confidence represents a measurement of the data supporting an Analytics-generated model, and a hand-written model file does not contain that measured evidence.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How Bid Requests Are Evaluated<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">For each bid request, the classifier reviews the fields referenced by the model and attempts to match:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each individual value<\/li>\n\n\n\n<li>Each available two-variable combination<\/li>\n\n\n\n<li>Each available three-variable combination<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Empty request fields are skipped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a request containing <code>geo_zip<\/code>, <code>device_type<\/code>, and <code>publisher_name<\/code> may generate seven possible lookups:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Three individual values<\/li>\n\n\n\n<li>Three two-variable combinations<\/li>\n\n\n\n<li>One three-variable combination<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Only entries that both exist in the model and fully match the request contribute to the request-level score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An entry for a different value does not contribute. A combination entry contributes only when every feature and value in the combination matches the request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When no model entry matches, the request receives a bidder score of exactly <code>0.5<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the neutral score. It does not mean there is a 50% probability of conversion. It means the model has no applicable positive or negative signal for that request.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How Matching Scores Are Combined<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">When multiple entries match, the classifier combines them into a weighted average.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Analytics-generated models, weights are based on <strong>field importance<\/strong>, which reflects how strongly each field contributes to the modeled outcome based on the model\u2019s training data. Weights are normalized so that the average field has a weight of <code>1<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Individual attribute entries use the weight assigned to that field.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For two- and three-variable combinations, the entry weight is the mean of the weights of its component fields. A combination does not receive additional weight simply because it contains more variables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>geo_zip weight = 1.2\ndevice_type weight = 0.8\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>geo_zip \u00d7 device_type combination weight =\n(1.2 + 0.8) \u00f7 2 = 1.0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Combined model score =\nSum of each matching score \u00d7 its weight\n\u00f7\nSum of all matching weights<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">How field weights are determined depends on the model type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pontiac Analytics-generated models may include field-importance weights measured automatically from the model\u2019s training data. When the model is built from fewer than 50 training rows per field, there is not enough data to apply field-importance weighting reliably and the model falls back to equal weighting. Models built before field-importance weighting was introduced also continue to score as they did previously.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">User Defined Models use equal field weighting by default, with each field effectively weighted <code>1<\/code>. Users may optionally supply custom field weights in the model file when there is a specific reason to give one field more influence than another.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">User-supplied weights are normalized so that the average field weight is <code>1<\/code>. Only the relative relationship between weights affects scoring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>site_domain weight = 3\nhour weight = 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">has the same relative effect as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>site_domain weight = 30\nhour weight = 10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For User Defined Models, fields without a custom weight use the default field weight of <code>1<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The combined score remains on the original \u22121-to-1 scale. It is then converted to the 0-to-1 bidder scale:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Bidder score = (Combined model score + 1) \u00f7 2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Combined Model Score<\/strong><\/th><th><strong>Bidder Score<\/strong><\/th><\/tr><\/thead><tbody><tr><td>\u22121.0<\/td><td>0.0<\/td><\/tr><tr><td>\u22120.4<\/td><td>0.3<\/td><\/tr><tr><td>\u22120.2<\/td><td>0.4<\/td><\/tr><tr><td>0.0<\/td><td>0.5<\/td><\/tr><tr><td>0.3<\/td><td>0.65<\/td><\/tr><tr><td>0.6<\/td><td>0.8<\/td><\/tr><tr><td>1.0<\/td><td>1.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A bidder score above <code>0.5<\/code> represents a net-positive model result. A bidder score below <code>0.5<\/code> represents a net-negative result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For instructions on supplying custom field weights in JSON or CSV, see <a href=\"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/user-defined-models\">User Defined Models<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How Multiple Signals Interact<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A request\u2019s score depends on the strength and direction of all matching entries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More matches do not automatically produce a higher score. Because the classifier calculates an average, adding an entry that is weaker than the existing average can lower the final score even when that entry is positive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the following example, assume no custom field weights are supplied, so each matching entry contributes equally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider a request matching:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>geo_zip = 10025<\/code>: <code>0.95<\/code><\/li>\n\n\n\n<li><code>device_type = 4<\/code>: <code>0.30<\/code><\/li>\n\n\n\n<li><code>10025 \u00d7 4<\/code>: <code>0.90<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For this example, assume each matching entry contributes equally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The combined model score is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(0.95 + 0.30 + 0.90) \u00f7 3 = 0.7167<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The bidder score is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(0.7167 + 1) \u00f7 2 = 0.858<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Adding a positive entry scored <code>0.40<\/code> could reduce this result because <code>0.40<\/code> is weaker than the existing combined score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Positive and negative signals can also cancel one another. For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>geo_zip score:       0.95\npublisher score:    -0.85\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Their combined model score is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(0.95 \u2212 0.85) \u00f7 2 = 0.05<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The bidder score is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(0.05 + 1) \u00f7 2 = 0.525<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Although the request contains a strong positive signal, the strong negative signal nearly offsets it and produces a result close to neutral.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Custom field weights can change how strongly each matching signal affects this average. They do not change the underlying entry scores themselves.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Worked Example<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Assume the model contains the following entries and that no custom field weights are supplied, so each matching entry contributes equally.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Entry<\/th><th>Model score<\/th><\/tr><\/thead><tbody><tr><td><code>geo_zip = 10025<\/code><\/td><td>0.95<\/td><\/tr><tr><td><code>geo_zip = 07302<\/code><\/td><td>\u22120.60<\/td><\/tr><tr><td><code>device_type = 4<\/code><\/td><td>0.30<\/td><\/tr><tr><td><code>publisher_name = iheartmedia<\/code><\/td><td>0.40<\/td><\/tr><tr><td><code>publisher_name = lowvaluenet<\/code><\/td><td>\u22120.85<\/td><\/tr><tr><td><code>10025 \u00d7 4<\/code><\/td><td>0.90<\/td><\/tr><tr><td><code>10025 \u00d7 iheartmedia \u00d7 4<\/code><\/td><td>0.85<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The following bidder scores are produced:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Request<\/th><th>Matching Entries<\/th><th>Bidder Score<\/th><\/tr><\/thead><tbody><tr><td>10025, device 4, iheartmedia<\/td><td>5<\/td><td>0.840<\/td><\/tr><tr><td>10025, device 4, unknown publisher<\/td><td>3<\/td><td>0.858<\/td><\/tr><tr><td>Unknown ZIP, device 4, unknown publisher<\/td><td>1<\/td><td>0.650<\/td><\/tr><tr><td>Unknown ZIP, device 2, unknown publisher<\/td><td>0<\/td><td>0.500<\/td><\/tr><tr><td>10025, device 2, lowvaluenet<\/td><td>2<\/td><td>0.525<\/td><\/tr><tr><td>07302, device 2, lowvaluenet<\/td><td>2<\/td><td>0.138<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The second request scores slightly higher than the first, even though the first request matches more positive entries. This occurs because the additional matching signals for the first request are weaker than its stronger positive signals and lower the overall average.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If custom field weights were supplied, the same matching entries could produce a different combined score because fields with higher weights would contribute more heavily to the result.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Writing Model Values<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Values must correspond to the format used in Pontiac impression logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Matching is case-insensitive and leading and trailing whitespace are removed. Other transformations should not be assumed.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Field<\/th><th class=\"has-text-align-left\" data-align=\"left\">Group<\/th><th class=\"has-text-align-left\" data-align=\"left\">How to write the value<\/th><\/tr><\/thead><tbody><tr><td><code>geo_region<\/code><\/td><td>Geography<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>geo_zip<\/code><\/td><td>Geography<\/td><td>Postal code as it appears in the logs. US ZIPs must keep their leading zero (&#8216;04501&#8217;). Non-US formats are fine (&#8216;1000-001&#8217;, &#8216;SW1A 1AA&#8217;).<\/td><\/tr><tr><td><code>publisher_name<\/code><\/td><td>Inventory<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>site_domain<\/code><\/td><td>Inventory<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>app_bundle<\/code><\/td><td>Inventory<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>exchange<\/code><\/td><td>Inventory<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>deal_id<\/code><\/td><td>Inventory<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_channel<\/code><\/td><td>Content<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_network<\/code><\/td><td>Content<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_series<\/code><\/td><td>Content<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_title<\/code><\/td><td>Content<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_genre<\/code><\/td><td>Content<\/td><td>Lowercase, exactly as it appears in the logs.<\/td><\/tr><tr><td><code>content_livestream<\/code><\/td><td>Content<\/td><td>&#8216;0&#8217; or &#8216;1&#8217;.<\/td><\/tr><tr><td><code>device_type<\/code><\/td><td>Device<\/td><td>IAB code as a whole number \u2014 &#8216;3&#8217;, never &#8216;3.0&#8217; and never &#8216;Connected TV&#8217;.<\/td><\/tr><tr><td><code>day<\/code><\/td><td>Time<\/td><td>Lowercase three-letter code (mon, tue, wed, thu, fri, sat, sun), in UTC.<\/td><\/tr><tr><td><code>hour<\/code><\/td><td>Time<\/td><td>Whole number 0-23, in the user&#8217;s LOCAL time.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Do not create entries for an empty string or for a placeholder value such as <code>missing<\/code>. When an attribute is absent, the bidder provides an empty field, and empty fields are skipped during matching.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entries that cannot match a bid request are also removed automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a User Defined Model is uploaded, entries containing unreachable values, such as empty values or placeholders like <code>missing<\/code>, are dropped and the uploader reports how many entries were removed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Pontiac Analytics pipeline applies the same cleanup before the combination limit is applied.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As a result, an uploaded or generated model may contain fewer entries than the source data if unreachable entries were removed.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How Thresholds Affect Bidding<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The model produces a bidder score between <code>0<\/code> and <code>1<\/code>. In standard probability-based, or <code>prob<\/code>, output mode, two thresholds determine how that score affects bidding:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Minimum threshold \u2014 scores at or below this value never bid.<\/li>\n\n\n\n<li>Maximum threshold \u2014 scores at or above this value always bid.<\/li>\n\n\n\n<li>Between the minimum and maximum \u2014 the request bids with probability equal to its bidder score.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In <code>prob<\/code> mode, bidding behavior is controlled by a minimum and maximum threshold. When a <strong>Single Value<\/strong> threshold is selected, the same value is used for both thresholds, producing a hard cutoff. When <strong>Spread<\/strong> is selected, separate minimum and maximum values define a probabilistic band.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Bidder Score<\/strong><\/td><td><strong>Outcome<\/strong><\/td><\/tr><tr><td>At or below the minimum (<code>0.30<\/code> by default)<\/td><td>Never bids<\/td><\/tr><tr><td>Between the minimum and maximum<\/td><td>Bids with probability equal to the bidder score<\/td><\/tr><tr><td>At or above the maximum (<code>0.80<\/code> by default)<\/td><td>Always bids<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The bidder score is used directly as the probability within the band. It is not rescaled based on the minimum and maximum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, with the default <code>0.30<\/code> to <code>0.80<\/code> band:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Score 0.29 \u2192   0% bid probability<\/li>\n\n\n\n<li>Score 0.40 \u2192  40% bid probability<\/li>\n\n\n\n<li>Score 0.50 \u2192  50% bid probability<\/li>\n\n\n\n<li>Score 0.70 \u2192  70% bid probability<\/li>\n\n\n\n<li>Score 0.81 \u2192 100% bid probability<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This means the thresholds define where probabilistic bidding begins and ends rather than converting the score range between them into a new 0%-to-100% scale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The minimum and maximum thresholds are selected when the model is activated on a line. They are not stored within the model file, allowing the same model to be used with different bidding behavior on different lines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Setting the minimum and maximum to the same value produces hard-cutoff behavior: scores at or below that value never bid, while scores above it always bid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The equivalent point on the original \u22121-to-1 model scale can be calculated for either threshold as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Equivalent model score = (2 \u00d7 bidder threshold) \u2212 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example, the default thresholds correspond to:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Bidder Threshold<\/strong><\/td><td><strong>Equivalent Model Score<\/strong><\/td><\/tr><tr><td>Minimum: <code>0.30<\/code><\/td><td>-0.40<\/td><\/tr><tr><td>Maximum: <code>0.80<\/code><\/td><td>0.60<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In classification, or <code>cls<\/code>, output mode, the configurable minimum and maximum thresholds do not apply. Classification uses a fixed <code>0.5<\/code> cutoff. A request is eligible only when its result is above <code>0.5<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Why the Neutral 0.5 Score Matters<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A request that matches no model entry always receives the neutral bidder score of <code>0.5<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In <code>prob<\/code> mode, how that unmatched request behaves depends on where <code>0.5<\/code> falls relative to the minimum and maximum thresholds:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Minimum at or above <\/strong><code><strong>0.5<\/strong><\/code> \u2014 unmatched inventory never bids.<\/li>\n\n\n\n<li><strong>Maximum at or below <\/strong><code><strong>0.5<\/strong><\/code> \u2014 unmatched inventory always bids.<\/li>\n\n\n\n<li><code><strong>0.5<\/strong><\/code><strong>between the minimum and maximum<\/strong> \u2014 unmatched inventory bids approximately 50% of the time.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With the default minimum of <code>0.30<\/code> and maximum of <code>0.80<\/code>, <code>0.5<\/code> falls inside the probability band. An unmatched request therefore bids approximately half the time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Where the thresholds sit relative to <code>0.5<\/code> can materially change how the model behaves.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A minimum of <code>0.5<\/code> or higher prevents neutral, unmatched inventory from bidding, making the model behave more like an allowlist of inventory with positive model signals.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A maximum of <code>0.5<\/code> or lower causes neutral, unmatched inventory to always bid, making the model behave more like a blocklist against negatively scored inventory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When <code>0.5<\/code> falls inside the band, as it does by default, unmatched inventory remains available probabilistically while positive and negative model signals increase or decrease the likelihood of bidding.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Example Threshold Decisions<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Assume the following requests receive these bidder scores:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Request Result<\/th><th>Bidder Score<\/th><\/tr><\/thead><tbody><tr><td>Strong positive alignment<\/td><td>0.875<\/td><\/tr><tr><td>Moderate positive alignment<\/td><td>0.650<\/td><\/tr><tr><td>Positive and negative signals nearly cancel<\/td><td>0.525<\/td><\/tr><tr><td>No model entry matches<\/td><td>0.500<\/td><\/tr><tr><td>Moderate negative alignment<\/td><td>0.400<\/td><\/tr><tr><td>Strong negative alignment<\/td><td>0.138<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">With the default minimum of <code>0.30<\/code> and maximum of <code>0.80<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Bidder Score<\/th><th>Bidding Behavior<\/th><\/tr><\/thead><tbody><tr><td>0.875<\/td><td>Always bids<\/td><\/tr><tr><td>0.650<\/td><td>Bids approximately 65% of the time<\/td><\/tr><tr><td>0.525<\/td><td>Bids approximately 52.5% of the time<\/td><\/tr><tr><td>0.500<\/td><td>Bids approximately 50% of the time<\/td><\/tr><tr><td>0.400<\/td><td>Bids approximately 40% of the time<\/td><\/tr><tr><td>0.138<\/td><td>Never bids<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The minimum controls which lower-scoring requests are completely excluded. For example, increasing the minimum to <code>0.50<\/code> means requests scoring <code>0.500<\/code> or below never bid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The maximum controls which higher-scoring requests are guaranteed to bid. For example, decreasing the maximum to <code>0.50<\/code> means requests scoring <code>0.500<\/code> or above always bid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Requests that remain between the two thresholds continue to bid probabilistically according to their bidder score.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Score Distribution and Delivery<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A model\u2019s bidder scores may occupy only a narrow portion of the theoretical 0-to-1 range.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a model may produce observed bidder scores only between <code>0.42<\/code> and <code>0.61<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With the default minimum of <code>0.30<\/code> and maximum of <code>0.80<\/code>, every score in that observed range falls inside the probability band. Those requests therefore bid between approximately 42% and 61% of the time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the minimum is increased to <code>0.50<\/code>, requests scoring at or below <code>0.50<\/code> no longer bid, while requests above <code>0.50<\/code> and below the maximum continue bidding probabilistically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the maximum is decreased to <code>0.50<\/code>, requests scoring at or above <code>0.50<\/code> always bid, while scores below <code>0.50<\/code> but above the minimum continue bidding probabilistically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the minimum is set above the model\u2019s entire observed score range, none of those scored requests bid. If the maximum is set below the entire observed range, all of those scored requests always bid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Threshold selection should therefore account for the score distribution the model actually produces, not only the theoretical 0-to-1 scale.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Coverage and Signal Agreement<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Two factors are especially important when evaluating how a model will affect bidding.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li> Coverage<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Coverage describes how frequently the model contains an entry that matches available bid requests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a model containing only ZIP-code entries can strongly influence requests whose ZIP codes are represented in the model. Requests with ZIP codes not represented in the model receive the neutral bidder score of <code>0.5<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Other request fields do not dilute a matching ZIP score unless corresponding entries for those fields also exist in the model and match the request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The limitation of a ZIP-only model is therefore the percentage of inventory covered by the listed ZIP codes, not the number of additional attributes present in each request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Coverage is especially important because a request that matches nothing receives <code>0.5<\/code>, meaning the model has no positive or negative signal for that request. Its bidding behavior then depends entirely on where <code>0.5<\/code> falls within the configured threshold band.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Signal Agreement<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Matching entries that point in the same direction and have similar strength can produce a decisive positive or negative result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conflicting entries pull the combined score toward the neutral midpoint. Adding more entries does not necessarily widen the model\u2019s score distribution, particularly when those entries are weak or contradictory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A useful model should provide meaningful separation between preferred and discouraged inventory rather than simply maximizing the number of entries.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Selecting Initial Thresholds<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Pontiac Analytics models are evaluated against a sample of real bid requests during the model-building process. This makes it possible to review the distribution of bidder scores across observed marketplace inventory and understand how different minimum and maximum thresholds may affect bidding behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A manually or externally created User Defined Model may not initially have an observed score distribution. It should therefore be evaluated against sample bid requests whenever possible before being used for live bidding.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When activating a new model:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Review the range and distribution of request-level bidder scores.<\/li>\n\n\n\n<li>Identify the percentage of requests receiving the neutral score of <code>0.5<\/code>.<\/li>\n\n\n\n<li>Determine how much inventory falls at or below the minimum and therefore will never bid.<\/li>\n\n\n\n<li>Determine how much inventory falls at or above the maximum and therefore will always bid.<\/li>\n\n\n\n<li>Review the inventory between the thresholds, where bid probability equals the bidder score.<\/li>\n\n\n\n<li>Pay particular attention to where <code>0.5<\/code> falls within the band because this determines how unmatched inventory behaves.<\/li>\n\n\n\n<li>Adjust the minimum and maximum while monitoring delivery and performance.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The thresholds should not be selected based only on how strict the values appear. They should reflect the model\u2019s actual score distribution, inventory coverage, desired bidding behavior, campaign delivery requirements, and optimization objective.<\/p>\n","protected":false},"author":17,"featured_media":0,"parent":12691,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_is_vendor_doc":"0","footnotes":""},"doc_tag":[],"class_list":["post-14205","docs","type-docs","status-publish","hentry","no-post-thumbnail"],"comment_count":0,"_links":{"self":[{"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/14205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14205"}],"version-history":[{"count":38,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/14205\/revisions"}],"predecessor-version":[{"id":14625,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/14205\/revisions\/14625"}],"up":[{"embeddable":true,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/12691"}],"next":[{"title":"User Defined Models","link":"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/user-defined-models","href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/13913"}],"prev":[{"title":"Overview","link":"https:\/\/wiki.pontiac.media\/?docs=analytics-documentation\/overview","href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=\/wp\/v2\/docs\/13090"}],"wp:attachment":[{"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14205"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/wiki.pontiac.media\/index.php?rest_route=%2Fwp%2Fv2%2Fdoc_tag&post=14205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}