Bạn có thể đưa ra dự đoán bằng mô hình hồi quy tuyến tính hoặc hồi quy logistic hiện có với các trọng số đã biết mà không cần dùng ML.PREDICT, ngay cả khi không có quyền truy cập vào chính mô hình đó. Để làm như vậy, bạn cần sử dụng giải pháp thay thế để sử dụng các mô hình hồi quy riêng tư khác biệt (DP) trong các truy vấn kích hoạt đối tượng trong Ads Data Hub.
Ví dụ từng bước này sẽ hướng dẫn bạn cách thực hiện suy luận mô phỏng cho các mô hình hồi quy tuyến tính và hồi quy logistic nhị phân thực tế, sau đó so sánh kết quả với kết quả của ML.PREDICT để cho thấy độ chính xác của kết quả mô phỏng.
Lớp học này cũng sẽ minh hoạ một ví dụ thực tế về cách tạo danh sách đối tượng bằng mô hình hồi quy logistic nhị phân. Mô hình này sẽ được dùng để áp dụng mô hình chuyển đổi cho hoạt động kích hoạt đối tượng.
Tổng quan về ví dụ:
- Tạo dữ liệu
- Huấn luyện mô hình
- Nhận trọng số và hệ số chặn
- Mô phỏng thông tin dự đoán
- So sánh kết quả
Ví dụ từng bước
1. Tạo dữ liệu
Tạo một bảng có dữ liệu mô phỏng để huấn luyện mô hình. Đánh dấu một phần của các hàng cho nhóm giữ lại.
Hồi quy tuyến tính
CREATE OR REPLACE TABLE DATASET_NAME.LIN_REG_TRAINING_SET AS
WITH
A AS (
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(1, 100000)) AS row_number),
B AS (
SELECT
row_number,
RAND() AS rand_label,
RAND() AS rand_feature_1,
RAND() AS rand_feature_2,
RAND() AS rand_feature_3,
RAND() AS rand_feature_4,
RAND() AS rand_feature_5,
RAND() AS rand_feature_6,
RAND() AS rand_feature_7,
RAND() AS rand_feature_8,
RAND() AS rand_feature_9,
RAND() AS rand_feature_10
FROM
A),
C AS (
SELECT
rand_label AS label,
*
FROM
B),
D AS (
SELECT
row_number,
CAST(round(10 * label) AS INT64) AS label,
(rand_label + rand_feature_1) / 2 AS feature_1,
(rand_label + rand_feature_2) / 2 AS feature_2,
(rand_label + rand_feature_3) / 2 AS feature_3,
(rand_label + rand_feature_4) / 2 AS feature_4,
(rand_label + rand_feature_5) / 2 AS feature_5,
(rand_label + rand_feature_6) / 2 AS feature_6,
(rand_label + rand_feature_7) / 2 AS feature_7,
(rand_label + rand_feature_8) / 2 AS feature_8,
(rand_label + rand_feature_9) / 2 AS feature_9,
(rand_label + rand_feature_10) / 2 AS feature_10
FROM
C)
SELECT
label,
feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10,
RAND() < 0.1 AS holdback -- Ten percent will be true.
FROM
D
Hồi quy logistic nhị phân
SELECT
CASE
WHEN label < 5 THEN 0
WHEN label >= 5 THEN 1
END
AS label,
* EXCEPT (label)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
2. Huấn luyện mô hình
Huấn luyện một mô hình hồi quy từ tập dữ liệu huấn luyện.
Hồi quy tuyến tính
CREATE OR REPLACE MODEL `DATASET_NAME.LIN_REG_MODEL` OPTIONS (model_type="linear_reg") AS
SELECT
* except (holdback)
FROM
`DATASET_NAME.LIN_REG_TRAINING_SET`
WHERE
NOT holdback
Xin lưu ý rằng chúng tôi đã thêm đủ nhiễu vào dữ liệu mô phỏng để có được một mô hình với R2 = 0,9009.
| Đo lường | Giá trị |
|---|---|
| Sai số tuyệt đối trung bình | 0,7359 |
| Sai số bình phương trung bình | 0,8432 |
| Sai số bình phương trung bình của logarit | 0,0810 |
| Sai số tuyệt đối trung bình | 0,6239 |
| R bình phương | 0,9009 |
Hồi quy logistic nhị phân
CREATE OR REPLACE MODEL `DATASET_NAME.BIN_LOG_REG_MODEL` OPTIONS (model_type="logistic_reg") AS
SELECT
* EXCEPT (holdback)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
NOT holdback
Kết quả mẫu. Lưu ý độ chính xác là 0,9260.
| Đo lường | Giá trị |
|---|---|
| Lớp dương | 1 |
| Hạng mục âm | 0 |
| Chính xác | 0,0810 |
| Về kênh trước | 0,9315 |
| Độ chính xác | 0,9260 |
| Điểm F1 | 0,9328 |
Các giá trị in đậm trong ma trận nhầm lẫn này cho biết tần suất mô hình phân loại chính xác từng nhãn và các giá trị không in đậm cho biết tần suất mô hình phân loại sai từng nhãn.
| Nhãn thực | Nhãn dự đoán 1 | Nhãn dự đoán 2 |
|---|---|---|
| 1 | 93% | 7% |
| 0 | 8% | 92% |
3. Nhận trọng số và hệ số chặn
Lấy trọng số và hệ số chặn cho mô hình:
Hồi quy tuyến tính
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
| cân nặng | category_weights.category |
|---|---|
| feature_1 | 1,8263055528635743 |
| feature_2 | 1,8143804404490813 |
| feature_3 | 1,8601204874033492 |
| feature_4 | 1,8507603439031859 |
| feature_5 | 1,7899764387123640 |
| feature_6 | 1.8645246630251291 |
| feature_7 | 1.8698005281925356 |
| feature_8 | 1,7904637080330201 |
| feature_9 | 1,8036887855406274 |
| feature_10 | 1,8117115890624449 |
| INTERCEPT | -4,1428754911504306 |
Hồi quy logistic nhị phân
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
| cân nặng | category_weights.category |
|---|---|
| feature_1 | 3,823533928 |
| feature_2 | 3,734812819 |
| feature_3 | 3,842239823 |
| feature_4 | 3,785488823 |
| feature_5 | 3,737386716 |
| feature_6 | 3,567663961 |
| feature_7 | 3,819643052 |
| feature_8 | 3.734673763 |
| feature_9 | 3,839301406 |
| feature_10 | 3,787306994 |
| INTERCEPT | -17,922169920 |
4. Mô phỏng thông tin dự đoán
Hồi quy tuyến tính
Sử dụng tích vô hướng của các giá trị đặc trưng với trọng số và thêm hệ số chặn để đưa ra dự đoán bằng cách sử dụng SQL tiêu chuẩn mà không cần dùng ML.PREDICT. Truy vấn này so sánh các dự đoán bằng kỹ thuật này với các dự đoán bằng ML.PREDICT. Lưu ý cách các dòng SQL in đậm đang thực hiện tích vô hướng của các giá trị đối tượng cho hàng có trọng số mô hình, sau đó thêm hệ số chặn.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[1.8263055528635743,
1.8143804404490813,
1.8601204874033492,
1.8507603439031859,
1.789976438712364,
1.8645246630251291,
1.8698005281925356,
1.7904637080330201,
1.8036887855406274,
1.8117115890624449] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.LIN_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.LIN_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
SUM(element1 * element2) - 4.1428754911504306
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ABS(ml_predicted_label - sql_predicted_label) < 0.00000000001 AS diff_is_negligible
FROM
P
Hồi quy logistic nhị phân
Đối với hồi quy logistic nhị phân, kỹ thuật mô phỏng các dự đoán rất giống với hồi quy tuyến tính, với việc bổ sung thêm bước áp dụng hàm sigmoid ở bước cuối cùng với ngưỡng mong muốn.
Sử dụng tích vô hướng của các giá trị đặc trưng với trọng số và thêm phần chặn để đưa ra dự đoán bằng cách sử dụng SQL tiêu chuẩn mà không cần dùng ML.PREDICT.
Sau đó, hãy dùng hàm sigmoid với ngưỡng 0,5 trên kết quả để dự đoán 0 hoặc 1. Truy vấn này so sánh các dự đoán bằng kỹ thuật này với các dự đoán bằng ML.PREDICT.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ml_predicted_label = sql_predicted_label AS simulation_is_accurate
FROM
P
Khối mã SQL được in đậm trong truy vấn ở trên đang thực hiện tích vô hướng của các giá trị đặc trưng cho từng hàng với trọng số của mô hình và thêm hệ số chặn để nhận được dự đoán hồi quy tuyến tính:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Sau đó, hàm này sẽ áp dụng hàm sigmoid Y = 1 / (1+e^-z) cho tích vô hướng và hệ số chặn, bằng cách sử dụng SQL chuẩn:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Cuối cùng, kết quả của hàm sigmoid được so sánh với giá trị ngưỡng là 0,5 để đưa ra dự đoán hồi quy logistic nhị phân là 0 (nếu nhỏ hơn 0,5) hoặc 1 (nếu không). Xin lưu ý rằng bạn có thể sử dụng bất kỳ giá trị ngưỡng nào trong khoảng từ 0 đến 1.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Kỹ thuật này cũng có thể được mở rộng sang hồi quy logistic đa lớp. Trong trường hợp đó, trọng số của mô hình sẽ là ma trận nxn, thay vì vectơ và trọng số sẽ là vectơ thay vì đại lượng vô hướng. Bạn sẽ nhân vectơ giá trị của đối tượng với ma trận trọng số và thêm vectơ chặn. Vectơ kết quả sẽ có điểm số cho từng nhãn và bạn có thể chọn nhãn có điểm số cao nhất cho dự đoán của mình. Nếu muốn trả về một mảng xác suất, bạn sẽ áp dụng hàm sigmoid cho từng phần tử của mảng.
5. So sánh kết quả
Hồi quy tuyến tính
Kết quả mẫu gần như giống hệt nhau, ngoại trừ một lỗi làm tròn nhỏ.
| actual_label | ml_predicted_label | sql_predicted_label | diff_is_negligible |
|---|---|---|---|
| 6 | 5.2062349420751834 | 5,2062349420751826 | true |
| 0 | 0,40318472770048075 | 0,403184727700479 | true |
| 3 | 3,0703766078249597 | 3,0703766078249597 | true |
| 7 | 7,0588171538562 | 7,0588171538562 | true |
| 6 | 6,7802375930646 | 6,7802375930646 | true |
| 6 | 5.1088569571339368 | 5,1088569571339377 | true |
| 4 | 4,051839078116874 | 4,051839078116874 | true |
| 4 | 5,1810254680219243 | 5.1810254680219234 | true |
| 6 | 6,1440349466401223 | 6,1440349466401205 | true |
| 1 | 2,0842399472783519 | 2,0842399472783519 | true |
| 2 | 2.1911209811886847 | 2.1911209811886838 | true |
| 3 | 3,0236086790006622 | 3,0236086790006613 | true |
| 2 | 2,573083132964213 | 2,5730831329642125 | true |
| 7 | 5,68662973136732 | 5.6866297313673186 | true |
| 9 | 8,1860026312677938 | 8,1860026312677938 | true |
Hồi quy logistic nhị phân
Việc so sánh suy luận mô phỏng với kết quả thực tế của ML.PREDICT là hoàn hảo – không có một mâu thuẫn nào trong bộ giữ lại 10 nghìn hàng. Có một số hàng mà cả ML.PREDICT và suy luận mô phỏng đều không đồng ý với nhãn thực tế. Điều này là điều dễ hiểu vì độ chính xác của mô hình là khoảng 93% và có các giá trị nhỏ nhưng khác 0 trong các ô không theo đường chéo của ma trận nhầm lẫn.
| actual_label | ml_predicted_label | sql_predicted_label | simulation_is_accurate |
|---|---|---|---|
| 0 | 1 | 1 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 0 | 0 | true |
| 0 | 1 | 1 | true |
| 0 | 0 | 0 | true |
Tạo danh sách kích hoạt đối tượng bằng công nghệ máy học
Một trường hợp sử dụng điển hình là tạo mô hình hồi quy logistic nhị phân riêng tư khác biệt để dự đoán lượt chuyển đổi, sau đó áp dụng suy luận cho mô hình này trong khi tạo danh sách đối tượng. Giả sử mô hình hồi quy logistic nhị phân được tạo trong ví dụ trên đang mô hình hoá lượt chuyển đổi và mỗi hàng trong các tập hợp huấn luyện và đánh giá đại diện cho một người dùng riêng biệt.
Truy vấn sau đây cho biết cách tạo danh sách đối tượng gồm những người dùng mà mô hình dự đoán sẽ chuyển đổi:
WITH
T AS (
SELECT
*,
label AS actual_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
holdback),
P AS (
SELECT
*,
(
SELECT
IF
((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) predicted_label,
features,
weights
FROM
T),
SELECT
user_id
FROM
P
WHERE
predicted_label = 1;