Regresní modelování ve službě Ads Data Hub

Lineární a logistická regrese jsou modely strojového učení, pomocí nichž můžete vytvářet smysluplné předpovědi z dat o reklamách.

  • Lineární regrese vytváří funkci, která daty proloží přímku tak, aby vzdálenost datových bodů od této přímky byla minimální. Pomocí tohoto modelu pak lze předpovídat číselnou hodnotu založenou na vstupech, například předpovídat celkovou hodnotu uživatele z jeho nákupů, předchozích interakcí atd.
  • Logistická regrese slouží k řešení problémů založených na prediktivní klasifikaci. Existují dva typy tohoto modelu podle toho, kolik proměnných do něj vložíte:
    • Binární logistická regrese odpovídá na otázky typu Ano/Ne, například jak je pravděpodobné, že dojde ke konverzní události.
    • Multinominální logistická regrese slouží k předpovídání několika možných hodnot, například ke zjištění, zda má určitý zákazník malou, střední nebo velkou hodnotu.

Lineární i logistická regrese se učí z tréninkových dat (v tomto případě z vašich dat o reklamách) a vytvářejí prediktivní model, na jehož základě se pak rozhodujete o další inzerci. Obvykle platí, že čím víc dat poskytnete a čím kvalitnější tato data jsou, tím přesnější bude model. Oba modely fungují lépe, když mají k dispozici výrazně seskupená tréninková data.

Diferenční soukromí

Lineární i logistická regrese používají diferenční soukromí, což je systém kontrol ochrany soukromí odlišný od toho, který používá služba Ads Data Hub. Diferenční soukromí zajišťuje ochranu soukromí koncových uživatelů tím, že do výsledků během procesu učení vkládá šum. Jde o dostatečně slabý šum na to, aby byly koncové výsledky stále užitečné, ale přitom dost výrazný, aby nebylo možno identifikovat koncové uživatele. Úroveň šumu je navíc nedeterministická, takže se v různých výsledcích liší, což ochranu soukromí koncových uživatelů dále posiluje.

Omezení dotazů

Když používáte výchozí hodnotu EPSILON_PER_MODEL, jste omezeni na 100 dotazů s modelováním pomocí lineární nebo logistické regrese na jeden „datový den“. Datový den představuje události nastalé během určitého dne. Tyto události odpovídají datům zahájení a ukončení, které zadáváte při spouštění dotazu, a datům zahájení a ukončení používaným při vytváření tabulek využívaných příslušným dotazem, tedy například dočasných tabulek při tréninku. To znamená, že data z jednoho dne nelze použít ve více než 100 modelech. Pokud použijete větší EPSILON_PER_MODEL, než je výchozí hodnota, bude povolený počet modelů menší, jejich kvalita však bude vyšší. Naopak jestliže použijete menší EPSILON_PER_MODEL, budete moci natrénovat více modelů, ale s nižší kvalitou.

Jak to funguje

Postup zahrnuje tyto hlavní kroky:

  1. příprava tréninkových dat,
  2. vytvoření modelu,
  3. získání statistik z modelu.

Příprava tréninkových dat

Jak už jsme zmínili, čím větší a kvalitnější je soubor dat, tím lepší budou výsledky. Vstupní data jsou škálována metodou minimum–maximum. Proto mohou model nepříznivě ovlivnit řídce rozmístěná data a výrazné odlehlé hodnoty, protože posunou průměr.

Ve výchozím stavu služba Ads Data Hub provádí ověření náhodně vybraných 18 % tréninkových dat. Procento dat používaných k ověření lze změnit nastavením data_split_eval_fraction.

Vytvoření modelu

Uveďte parametry a vstupní data pro trénink modelu.

Doporučené postupy

Jedním z nejvýznamnějších faktorů kvality modelu je velikost tréninkového souboru dat. Ideální vyvážení velikosti a kvality se nicméně bude lišit podle konkrétního problému a níže uvedených faktorů. Podělte se s námi o své zkušenosti. * V případě logistické regrese jsme přesnost > 0,70 zaznamenali u modelů vytvořených z tréninkových souborů dat o alespoň 100 000 uživatelích. * V případě lineární regrese jsme R kvadrát > 0,70 zaznamenali u modelů vytvořených z tréninkových souborů dat o alespoň 800 000 uživatelích.

Kvalitu modelu mohou zhoršit i další faktory. * Výrazně větší zastoupení určité třídy oproti třídám ostatním v logistickém modelu. Konkrétně pokud má jeden štítek v tréninkových datech jen několik uživatelů, nepomůže přesnosti modelu pro tento štítek nejspíš ani to, když ostatní štítky budou mít v datech hodně uživatelů. Například mít 20 000 a 1 000 uživatelů u dvou štítků v tréninkových datech je horší, než mít jich 10 000 a 2 000. * Data proměnných, které štítkům neposkytují jasné signály. * Nezpracovaná data, která potřebují rozsáhlejší zpracování proměnných. Například pokud některá pole obsahují velmi vysoký počet možných hodnot. Jednou z možností, jak taková data vylepšit, je transformovat hodnoty na proměnnou s menším počtem kategorií, případně na segmenty.

Získání statistik

K dispozici jsou funkce, kterými můžete vyhodnocovat výkon modelu na ověřovacích datech, prohlížet si proměnné a informace o tréninkových iteracích (například související váhy, které model během předpovídání používá), a vytvářet předpovědi pro dosud nepoužitá data.

Příkaz CREATE MODEL

Příkaz CREATE MODEL vytvoří model s uvedeným názvem a datovou sadou. Pokud model daného jména už existuje, příkaz CREATE MODEL jej nahradí.

Syntax příkazu CREATE MODEL

CREATE MODEL
model_name
OPTIONS
(
  // model_option_list:
  // Required parameter.
  MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}

  // Optional tuning parameters.
  [, L1_REG = float64_value ]
  [, L2_REG = float64_value ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
                           'NORMAL_EQUATION' } ]
  [, MAX_ITERATIONS = int64_value ]
  [, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
  [, LEARN_RATE = float64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, LS_INIT_LEARN_RATE = float64_value ]
  [, EPSILON_PER_MODEL = float64_value ]
  [, AUTOMATIC_IMPUT_SCALING = bool_value ]
  [, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
  [, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
  [, QUANTILE_BUCKETIZED_COLS = [
        STRUCT(string_value AS col_name, int64_value AS num_buckets), 
       STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement

model_name

Alfanumerický název. Může obsahovat podtržítka a pomlčky. Nesmí obsahovat tečky. Pokud model se zadaným názvem už existuje, bude přepsán.

query_statement

Obsahuje standardní dotaz v jazyce SQL sloužící k vytvoření tréninkových dat. Pokud vytváříte několik modelů ze stejných tréninkových dat, vytvořte pro ně dočasnou tabulku a zde se na ni odkažte. Tím se vyhnete možným chybám při rozdílových kontrolách způsobených vymazáním nebo pozdní klasifikaci spamu.

model_option_list

model_type

(Povinné) Jediný povinný parametr. Lze použít hodnotu adh_linear_regression nebo adh_logistic_regression.

l1_reg

(Nepovinné) Rozsah použité standardizace na úrovni L1. Tato standardizace penalizuje váhy úměrně k sumě jejich absolutních hodnot. Může jít o jakékoli nezáporné číslo. Výchozí hodnota je nula.

l2_reg

(Nepovinné) Rozsah použité standardizace na úrovni L2. Tato standardizace penalizuje váhy úměrně ke druhé odmocnině sumy čtverců těchto vah. Může jít o jakékoli nezáporné číslo. Výchozí hodnota je nula.

data_split_eval_fraction

(Nepovinné) Tato hodnota musí být mezi 0,01 a 0,99. Výchozí hodnota je 0,18. Určuje, jaká část dat bude použita ve vyhodnocovacím souboru dat. To ovlivňuje přesnost modelu zmenšením počtu řádků, které model používá. Zároveň to ale zvětšuje počet modelů, které může uživatel spustit. Níže je uveden graf tohoto vztahu za předpokladu, že všechny modely vycházející z daného souboru dat používají jeho stejnou část.

Ověřovací část Povolený počet dotazů
0,01 7
0,1 8
0,15 8
0,18 9
0,2 9
0,3 10
0,5 14
0,9 50

optimize_strategy

(Nepovinné) Strategie pro trénování modelů využívajících lineární regresi.

Argumenty

AUTO_STRATEGY určuje strategii trénování takto:

  • Jestliže je uvedena hodnota l1_reg nebo warm_start, je použita strategie batch_gradient_descent.
  • Pokud celková mohutnost tréninkových proměnných přesahuje 10 000, je použita strategie batch_gradient_descent.
  • V případě, že nastane problém s nadměrným přizpůsobením (počet tréninkových příkladů je menší než 10 × celková mohutnost), je použita strategie batch_gradient_descent.
  • Ve všech ostatních případech se používá strategie NORMAL_EQUATION.

BATCH_GRADIENT_DESCENT (pouze u logistické regrese) trénuje model pomocí metody dávkového postupného sestupu (batch gradient descent), která omezuje ztrátovou funkci pomocí funkce gradientu.

NORMAL_EQUATION (pouze u lineární regrese) počítá pomocí analytického vzorce nejmenší čtvereční řešení lineárně regresního problému. Normálovou rovnici nelze použít v těchto případech:

  • Je uvedeno l1_reg.
  • Je uvedeno warm_start.
  • Celková mohutnost tréninkových proměnných je větší než 10 000.
  • Výchozí hodnota je AUTO_STRATEGY.

max_iterations

(Nepovinné) Počet tréninkových iterací nebo kroků. Protože tento dotaz vytváří pro každou iteraci jeden strom, jde zároveň o počet stromů. Musí jít o celé číslo větší než 1. Výchozí hodnota je 20.

learn_rate_strategy

(Nepovinné, pouze u logistické regrese) Strategie pro určení rychlosti učení během tréninku.

Argumenty

LINE_SEARCH používá k výpočtu rychlosti učení metodu prohledávání řádků. Počáteční rychlost učení této metody je hodnota uvedená v parametru LS_INIT_LEARN_RATE.

  • Prohledávání řádků zpomaluje učení a zvětšuje množství zpracovaných bajtů. Zpravidla však konverguje i v případě, že je určena větší počáteční rychlosti učení.

CONSTANT nastaví rychlost učení na hodnotu uvedenou v parametru LEARN_RATE.

Výchozí hodnota je LINE_SEARCH.

learn_rate

(Nepovinné, pouze u logistické regrese) Rychlost učení pro postupný sestup, jestliže je parametr LEARN_RATE_STRATEGY nastaven na CONSTANT. Pokud je parametr LEARN_RATE_STRATEGY nastaven na LINE_SEARCH, vrátí systém chybu.

Argumenty

float64_value může být jakékoli 64bitové číslo s pohyblivou řádovou čárkou. Výchozí hodnota je 0,1 (10 %).

early_stop

(Nepovinné) Určuje, zda má trénink skončit po první iteraci, ve které je relativní zlepšení ztráty menší než hodnota uvedená v parametru MIN_REL_PROGRESS.

Argumenty

TRUE znamená Ano, FALSE znamená Ne. Výchozí hodnota je TRUE.

min_rel_progress

(Nepovinné) Minimální relativní zlepšení ztráty, které je potřeba, aby trénink pokračoval, jestliže je parametr EARLY_STOP nastaven na True. Hodnota 0,01 například znamená, že trénink bude pokračovat pouze tehdy, jestliže v aktuální iteraci byla ztráta zmenšena alespoň o 1 %.

Argumenty

float64_value může být jakékoli 64bitové číslo s pohyblivou řádovou čárkou. Výchozí hodnota je 0,1 (10 %).

ls_init_learn_rate

(Nepovinné) Nastaví počáteční rychlost učení, kterou používá LEARN_RATE_STRATEGY='LINE_SEARCH'. Tento parametr lze použít pouze v případě, že je uvedeno LINE_SEARCH.

Pokud se zdá, že se hodnota LEARN_RATE modelu s každou iterací zdvojnásobuje (což je vidět z ML.TRAINING_INFO), zkuste nastavit LS_INIT_LEARN_RATE na poslední zdvojnásobenou rychlost učení. Optimální počáteční rychlost učení se liší podle konkrétního modelu. Počáteční rychlost vhodná pro jeden model se nemusí hodit pro jiný model.

Argumenty

float64_value může být jakékoli 64bitové číslo s pohyblivou řádovou čárkou.

epsilon_per_model

(Nepovinné) Určuje, kolik z limitu soukromí má být využito na trénování tohoto modelu. Každá data o reklamách mají na každý datový den přidělen limit soukromí 10,0. Úspěšně natrénovaný model využije EPSILON_PER_MODEL z tohoto limitu každého dne obsaženého v období uvedeném při spuštění dotazu. Při použití výchozí hodnoty ln(3)/10 můžete vytvořit zhruba 100 modelů. Jestliže použijete větší hodnotu, budete moci vytvořit méně modelů, které však budou kvalitnější. V případě menší hodnoty budete moci vytvořit více modelů, ale s menší kvalitou.

Argumenty

float64_value může být jakékoli kladné 64bitové číslo s plovoucí řádovou čárkou menší než ln(3), což je zhruba 1,0986. Výchozí hodnota je ln(3)/10.

automatic_input_scaling

(Nepovinné) Pokud je tento parametr nastaven na hodnotu TRUE, je na všechny sloupce numerických proměnných automaticky použito min_max_scaling, stejně jako kdyby byly názvy těchto sloupců výslovně uvedeny v parametru min_max_scaled_cols. Výjimkou jsou sloupce výslovně uvedené v parametrech standard_scaled_cols nebo quantile_bucketized_cols.

Argumenty

bool_value je BOOL, výchozí hodnota je TRUE.

min_max_scaled_cols

(Nepovinné) Škáluje každý z uvedených sloupců proměnných typu numerical_expression v rozsahu od 0 do 1, přičemž hranicí je MINMAX v rámci všech řádků. Stejné hodnoty MINMAX jsou automaticky použity při předpovědích. Pokud jsou data pro předpověď mimo rozsah daný hodnotami MINMAX jsou omezeny buď na 0, nebo na 1.

Argumenty

Pole hodnot string_value, v němž je každý prvek string_value hodnotou typu STRING představující název sloupce, který má být transformován.

standard_scaled_cols

(Nepovinné) Standardizuje uvedené řádky proměnných typu numerical_expression v rámci všech řádků. Hodnoty STDDEVMEAN, vypočtené při standardizaci výrazu, jsou automaticky použity při předpovědích.

Argumenty

Pole hodnot string_value, v němž je každý prvek string_value hodnotou typu STRING představující název sloupce, který má být transformován.

quantile_bucketized_cols

Segmentuje uvedené sloupce průběžné numerické proměnné na hodnoty typu STRING, přičemž název segmentu je hodnota založená na kvantilech. Stejné kvantily jsou automaticky použity při předpovědích.

Argumenty

Pole struktur STRUCT(string_value AS col_name, int64_value AS num_buckets), v nichž je každý prvek string_value hodnotou typu STRING představující název kontinuálního numerického sloupce, který má být transformován, a každý prvek int64_value je počet segmentů, do nichž mají být číselné hodnoty rozděleny.

Ověření

  • Každému datovému dnu v období používaném tímto dotazem musí zbývat dostatečný limit soukromí, tedy více než EPSILON_PER_MODEL. V opačném případě se provedení dotazu nezdaří.
  • Pokud budou uvedeny nepovinné ladicí parametry, budou ověřeny pro výše uvedené rozsahy.
  • Je třeba výslovně uvést pouze jeden povinný parametr model_type.
  • Jeden sloupec v trénovacím souboru dat musí být nazván „label“ (štítek). Použití více štítků není v současnosti podporováno.
  • Sloupec se štítky nesmí obsahovat hodnoty NULL. Pokud nějaké obsahuje, provedení dotazu se nezdaří.
  • Žádný ze sloupců proměnných nesmí být odvozen od user_id.
  • Každý řádek musí představovat přesně jednoho unikátního uživatele. Jeden řádek nesmí obsahovat data od více než jednoho uživatele. To může nastat při použití některých spojení, například křížového (CROSS JOIN).
  • Žádný uživatel nesmí být zastoupen ve dvou různých řádcích.
  • Z důvodu ochrany soukromí lze použít pouze možnosti popsané v části Syntax. Jiné možnosti, které mohou být uvedeny v dokumentaci dotazu BQML CREATE MODEL, nejsou v současnosti podporovány.

Vyhodnocovací funkce

ML.EVALUATE

Pomocí funkce ML.EVALUATE můžete vyhodnocovat metriky modelu. Funkci ML.EVALUATE lze použít s modely na bázi lineární nebo logistické regrese.

SELECT
  *
FROM ML.EVALUATE(MODEL `linear_model_test`);

ML.ROC_CURVE

Pomocí funkce ML.ROC_CURVE můžete vyhodnocovat metriky platné pouze pro logistickou regresi. Funkce ML.ROC_CURVE vyhodnocuje pouze modely na bázi logistické regrese.

SELECT
  *
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);

Prediktivní funkce

ML.PREDICT

Pomocí funkce ML.PREDICT můžete modelovat výsledky. Na výsledky získané funkcí ML.PREDICT se vztahují stejné kontroly ochrany soukromí jako na jiné výsledky ve službě Ads Data Hub. Další informace o kontrolách zajišťujících ochranu soukromí

Lineární regrese

/* This example outputs the average value for labels that the model predicted */
SELECT
  AVG(predicted_label) AS average_predicted_label
FROM
  ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);

Logistická regrese

/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
  label,
  predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
  COUNT(*) AS num /* a tally of users */
FROM
  ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;

Funkce pro kontrolu modelu a funkcí

ML.TRAINING_INFO

Pomocí funkce ML.TRAINING_INFO se můžete podívat na informace o tréninkových iteracích modelu.

SELECT
  *
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);

ML.FEATURE_INFO

Pomocí funkce ML.FEATURE_INFO se můžete podívat na informace o vstupních proměnných použitých k trénování modelu.

SELECT
  *
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);

ML.WEIGHTS

Pomocí funkce ML.WEIGHTS se můžete podívat na základní váhy, které model používá během predikcí.

SELECT
  *
FROM ML.WEIGHTS(MODEL `linear_model_test`);

Příklady

Vytvoření modelu

Všechny níže uvedené příklady ilustrují vytváření modelu na ukázkové tabulce natality.

Tréninková data ve vnitřním výběru (lineární)

Níže uvedený příklad používá k predikci porodní hmotnosti dítěte porodní hmotnost, pohlaví, délku těhotenství v týdnech, věk matky a rasu matky.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_linear_regression') AS
SELECT
  weight_pounds as label,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

Tréninková data ve vnitřním výběru (logistická)

Níže uvedený příklad používá k predikci pohlaví dítěte porodní hmotnost, pohlaví, délku těhotenství v týdnech, věk matky a rasu matky.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_logistic_regression') AS
SELECT
  weight_pounds,
  is_male as label,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL