Loglab การถดถอยแบบโลจิสติก

1. ข้อมูลเบื้องต้น

Codelab นี้จะสอนวิธีใช้การถดถอยแบบโลจิสติกเพื่อทำความเข้าใจระดับที่คุณลักษณะต่างๆ เช่น เพศ กลุ่มอายุ เวลาในการแสดงผล และประเภทเบราว์เซอร์ที่มีความสัมพันธ์กับแนวโน้มที่ผู้ใช้จะคลิกโฆษณา

ข้อกำหนดเบื้องต้น

คุณต้องมีข้อมูลแคมเปญคุณภาพสูงมากพอที่จะสร้างรูปแบบเพื่อให้ Codelab นี้เสร็จสมบูรณ์

2. เลือกแคมเปญ

เริ่มต้นโดยเลือกแคมเปญเก่าที่มีข้อมูลคุณภาพสูงจำนวนมาก หากคุณไม่ทราบว่าแคมเปญใดน่าจะมีข้อมูลที่ดีที่สุด ให้เรียกใช้การค้นหาต่อไปนี้กับข้อมูลเต็มเดือนที่เก่าที่สุดที่คุณเข้าถึงได้

SELECT
  campaign_id,
  COUNT(DISTINCT user_id) AS user_count,
  COUNT(*) AS impression_count
FROM adh.google_ads_impressions

ORDER BY user_count DESC;

การเลือกข้อมูลที่มีอายุ 12-13 เดือนจะช่วยให้คุณฝึกและทดสอบโมเดลกับข้อมูลที่จะถูกนำออกจาก Ads Data Hub เร็วๆ นี้ได้ หากข้อมูลนี้มีขีดจำกัดการฝึกโมเดล ขีดจำกัดดังกล่าวจะสิ้นสุดลงเมื่อลบข้อมูล

แต่หากแคมเปญทำงานเป็นพิเศษ ข้อมูลเพียง 1 สัปดาห์ก็อาจเพียงพอแล้ว สุดท้าย จำนวนผู้ใช้ที่ไม่ซ้ำกันควรมี 100,000 คนขึ้นไป โดยเฉพาะเมื่อกำลังฝึกโดยใช้ฟีเจอร์หลายรายการ

3. สร้างตารางสำรอง

เมื่อระบุแคมเปญที่คุณจะใช้ฝึกโมเดลแล้ว ให้เรียกใช้การค้นหาด้านล่าง

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. สร้างและฝึกโมเดล

แนวทางปฏิบัติแนะนำคือการแยกขั้นตอนการสร้างตารางออกจากขั้นตอนการสร้างโมเดล

เรียกใช้การค้นหาต่อไปนี้ในตารางชั่วคราวที่คุณสร้างขึ้นในขั้นตอนก่อนหน้า ไม่ต้องกังวลกับการระบุวันที่เริ่มต้นและสิ้นสุด เนื่องจากข้อมูลเหล่านี้ได้รับการอนุมานตามข้อมูลในตารางชั่วคราว

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. ตีความผลลัพธ์

เมื่อการค้นหาทำงานเสร็จแล้ว คุณจะได้รับตารางที่มีลักษณะคล้ายกับตารางด้านล่าง ผลลัพธ์จากแคมเปญจะแตกต่างกัน

แถว

ความแม่นยำ

การจำได้

ความแม่นยำ

f1_score

log_loss

roc_auc

1

0.53083894341399718

0.28427804486705865

0.54530547622568992

0.370267971696336

0.68728232223722974

0.55236263736263735

ตรวจสอบน้ำหนัก

เรียกใช้ข้อความค้นหาต่อไปนี้เพื่อดูน้ำหนัก เพื่อดูว่าคุณลักษณะใดทำให้โมเดลของคุณมีแนวโน้มที่จะคาดการณ์การคลิก

SELECT * FROM ML.WEIGHTS(MODEL `binary_logistic_example`)

การค้นหานี้จะให้ผลลัพธ์ที่คล้ายกับรายการด้านล่าง โปรดทราบว่า BigQuery จะจัดเรียงป้ายกำกับที่ระบุและเลือก "เล็กที่สุด" ให้เป็น 0 และใหญ่ที่สุดให้เป็น 1 ในตัวอย่างนี้ คลิก 0 และ not_clicked คือ 1 ดังนั้น ตีความว่าน้ำหนักที่มากกว่าเป็นตัวบ่งชี้ว่าคุณลักษณะดังกล่าวทำให้มีโอกาสได้รับคลิกน้อยลง นอกจากนี้ วันที่ 1 ตรงกับวันอาทิตย์

processed_input

น้ำหนัก

category_weights.category

category_weights.weight

1

แยก

-0.0067900886484743364

2

browser_name

null

ไม่ทราบ 0.78205563068099249

Opera 0.097073700069504443

Dalvik -0.75233190448454246

ขอบ 0.026672464688442348

ไหม -0.72539916969348706

อื่นๆ -0.10317444840919325

เบราว์เซอร์ Samsung 0.49861066525009368

Yandex 1.3322608977581121

IE -0.44170947381475295

Firefox -0.10372609461557714

Chrome 0.069115931084794066

Safari 0.10931362123676475

3

day_of_week

ค่าว่าง

7 0.051780350639992277

6 -0.098905011477176716

4 -0.092395178188358462

5 -0.010693625983554155

3 -0.047629987110766638

1 -0.0067030673140933122

2 0.061739400111810727

4

hour

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

ค่าว่าง

45-54 -0.013192901125032637

65+ 0.035681341407469279

25-34 -0.044038102549733116

18-24 -0.041488170110836373

ไม่รู้จัก 0.025466344709472313

35-44 0.01582412778809188

55-64 -0.004832373590628946

6

gender_name

ค่าว่าง

ชาย 0.061475274448403977

ไม่ทราบ 0.46660611583398443

หญิง -0.13635601771194916