Informace o této programovací laboratoři
1. Úvod
V této programovací laboratoři se naučíte zjišťovat pomocí logistické regrese, do jaké míry korelují různé faktory, například pohlaví, věková skupina, čas zobrazení a typ prohlížeče, s pravděpodobností, že uživatel klikne na reklamu.
Požadavky
K dokončení této programovací laboratoře budete potřebovat dostatek vysoce kvalitních dat o kampani, abyste mohli vytvořit model.
2. Výběr kampaně
Nejprve vyberte starou kampaň s velkým množstvím kvalitních dat. Pokud nevíte, která kampaň nejspíš obsahuje nejlepší data, spusťte níže uvedený dotaz na nejstarších datech za celý měsíc, k nimž máte přístup:
SELECT
campaign_id,
COUNT(DISTINCT user_id) AS user_count,
COUNT(*) AS impression_count
FROM adh.google_ads_impressions
ORDER BY user_count DESC;
Jestliže vyberete data stará 12–13 měsíců, budete svůj model moci natrénovat a otestovat na datech, která budou ze služby Ads Data Hub brzy odstraněna. Pokud se u těchto dat setkáte s limity pro trénování modelu, skončí po odstranění dat i tyto limity.
V případě, že je kampaň zvláště aktivní, mohou stačit data za pouhý týden. Dále doporučujeme použít data s alespoň 100 000 unikátními uživateli, zejména pokud při tréninku používáte mnoho funkcí.
3. Vytvoření dočasné tabulky
Až se rozhodnete, kterou kampaň použijete pro trénování modelu, spusťte níže uvedený dotaz.
CREATE TABLE
binary_logistic_regression_example_data
AS(
WITH all_data AS (
SELECT
imp.user_id as user_id,
ROW_NUMBER() OVER(PARTITION BY imp.user_id) AS rowIdx,
imp.browser as browser_name,
gender_name as gender_name,
age_group_name as age_group_name,
DATETIME(TIMESTAMP_MICROS(
imp.query_id.time_usec), "America/Los_Angeles") as impression_time,
CASE # Binary classification of clicks simplifies model weight interpretation
WHEN clk.click_id.time_usec IS NULL THEN 0
ELSE 1
END AS label
FROM adh.google_ads_impressions imp
LEFT JOIN adh.google_ads_clicks clk USING (impression_id)
LEFT JOIN adh.gender ON demographics.gender = gender_id
LEFT JOIN adh.age_group ON demographics.age_group = age_group_id
WHERE
campaign_id IN (YOUR_CID_HERE)
)
SELECT
label,
browser_name,
gender_name,
age_group_name,
# Although BQML could divide impression_time into several useful variables on
# its own, it may attempt to divide it into too many features. As a best
# practice extract the variables that you think will be most helpful.
# The output of impression_time is a number, but we care about it as a
# category, so we cast it to a string.
CAST(EXTRACT(DAYOFWEEK FROM impression_time) AS STRING) AS day_of_week,
# Comment out the previous line if training on a single week of data
CAST(EXTRACT(HOUR FROM impression_time) AS STRING) AS hour,
FROM
all_data
WHERE
rowIdx = 1 # This ensures that there's only 1 row per user.
AND
gender_name IS NOT NULL
AND
age_group_name IS NOT NULL
);
4. Vytvoření a trénování modelu
Doporučujeme postup vytváření tabulky oddělit od postupu vytváření modelu.
Na dočasné tabulce vytvořené v předchozím kroku spusťte níže uvedený dotaz. Data zahájení ani ukončení nemusíte zadávat, budou určena podle dat v dočasné tabulce.
CREATE OR REPLACE
MODEL `binary_logistic_example`
OPTIONS(
model_type = 'adh_logistic_regression'
)
AS (
SELECT *
FROM
tmp.binary_logistic_regression_example_data
);
SELECT * FROM ML.EVALUATE(MODEL `binary_logistic_example`)
5. Interpretace výsledků
Po skončení dotazu získáte tabulku, která vypadá podobně jako ta níže uvedená. Výsledky z vaší kampaně však budou odlišné.
Row (řádek) | precision (přesnost) | recall (výbavnost) | accuracy (správnost) | f1_score | log_loss | roc_auc |
1 | 0,53083894341399718 | 0,28427804486705865 | 0,54530547622568992 | 0,370267971696336 | 0,68728232223722974 | 0,55236263736263735 |
Prozkoumání vah
Jestliže se chcete podívat na váhy a zjistit, které funkce přispívají k pravděpodobnosti, že váš model předpoví kliknutí, spusťte tento dotaz:
SELECT * FROM ML.WEIGHTS(MODEL `binary_logistic_example`)
Dotaz vrátí výsledky podobné těm uvedeným níže. Nástroj BigQuery jednotlivé štítky seřadí, jako „nejmenší“ vybere 0 a jako největší 1. V tomto případě odpovídá 0 hodnotě „clicked“ (kliknuto) a 1 hodnotě „not_clicked“ (nekliknuto). Větší váhy tedy znamenají, že příslušná funkce zmenšuje pravděpodobnost kliknutí. Den 1 znamená neděli.
processed_input (zpracovaný vstup) | weight (váha) | category_weights.category (váhová kategorie: kategorie) | category_weights.weight (váhová kategorie: váha) |
1 | INTERCEPT | −0,0067900886484743364 | |
2 | název prohlížeče | null | neznámý 0,78205563068099249 |
Opera 0,097073700069504443 | |||
Dalvik −0,75233190448454246 | |||
Edge 0,026672464688442348 | |||
Silk −0,72539916969348706 | |||
Jiný −0,10317444840919325 | |||
Samsung Browser 0,49861066525009368 | |||
Yandex 1.3322608977581121 | |||
IE −0,44170947381475295 | |||
Firefox −0,10372609461557714 | |||
Chrome 0,069115931084794066 | |||
Safari 0,10931362123676475 | |||
3 | day_of_week (den v týdnu) | null | 7 0,051780350639992277 |
6 −0,098905011477176716 | |||
4 −0,092395178188358462 | |||
5 −0,010693625983554155 | |||
3 −0,047629987110766638 | |||
1 −0,0067030673140933122 | |||
2 0,061739400111810727 | |||
4 | hour (hodina) | null | 15 −0,12081420778273 |
16 −0,14670467657779182 | |||
1 0,036118460001355934 | |||
10 −0,022111985303061014 | |||
3 0,10146297241339688 | |||
8 0,00032334907570882464 | |||
12 −0,092819888101463813 | |||
19 −0,12158349523248162 | |||
2 0,27252001951689164 | |||
4 0,1389215333278028 | |||
18 −0,13202189122418825 | |||
5 0,030387010564142392 | |||
22 0,0085803647602565782 | |||
13 −0,070696534712732753 | |||
14 −0,0912853928925844 | |||
9 −0,017888651719350213 | |||
23 0,10216569641652029 | |||
11 −0,053494611827240059 | |||
20 −0,10800180853273429 | |||
21 −0,070702105471528345 | |||
0 0,011735200996326559 | |||
6 0,016581239381563598 | |||
17 −0,15602138949559918 | |||
7 0,024077394387953525 | |||
5 | age_group_name (věková skupina: název) | null | 45–54 −0,013192901125032637 |
65+ 0,035681341407469279 | |||
25–34 −0,044038102549733116 | |||
18–24 −0,041488170110836373 | |||
Neznámá 0,025466344709472313 | |||
35–44 0,01582412778809188 | |||
55–64 −0,004832373590628946 | |||
6 | gender_name (pohlaví: název) | null | male (muž) 0,061475274448403977 |
unknown (neznámé) 0,46660611583398443 | |||
female (žena) −0,13635601771194916 |