ML.PREDICT
kullanmadan hatta modelin kendisine erişmeden bilinen ağırlıklara sahip mevcut bir doğrusal veya mantıksal regresyon modelinden yararlanarak tahminde bulunabilirsiniz. Bu işlemi yapmak için Ads Data Hub'daki kitle etkinleştirme sorgularının içinde yer alan diferansiyel gizli (DP) regresyon modelleri kullanmaya yönelik bir geçici çözüm uygulamanız gerekir.
Bu adım adım açıklamalı örnekte, gerçek doğrusal ve ikili mantıksal regresyon modelleri için simüle edilmiş çıkarımı nasıl gerçekleştireceğinizi, ardından sonuçları ML.PREDICT
sonuçlarıyla karşılaştırarak simüle edilmiş sonuçların doğruluğunu nasıl göstereceğinizi öğreneceksiniz.
Burada ayrıca ikili mantıksal model ile nasıl kitle listesi oluşturacağınızı açıklayan uygulamalı bir örnek gösterilmektedir. Bu örnek kitle etkinleştirmeye dönüşüm modeli uygulama işleminde kullanılacaktır.
Örneğe genel bakış:
- Veri oluşturma
- Modeli eğitme
- Ağırlıkları ve kesme noktasını alma
- Tahmini simüle etme
- Sonuçları karşılaştırma
Adım adım açıklamalı örnek
1. Veri oluşturma
Modeli eğitmek için simülasyon verilerin bulunduğu bir tablo oluşturun. Engel kümesi için satırların bir kısmını işaretleyin.
Doğrusal regresyon
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
İkili mantıksal regresyon
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. Modeli eğitme
Eğitim kümesinden bir regresyon modelini eğitin.
Doğrusal regresyon
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
R2 = 0,9009 değerine sahip bir model elde etmek için simüle edilen verilere yeterli gürültü eklediğimizi unutmayın.
Ölçüm | Değer |
---|---|
Ortalama mutlak hata | 0,7359 |
Ortalama karesel hata | 0,8432 |
Ortalama karesel günlük hatası | 0,0810 |
Ortanca değer mutlak hatası | 0,6239 |
R kare | 0,9009 |
İkili mantıksal regresyon
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
Sonuçlardan bir örnek kümesi alın. Doğruluk değerinin 0,9260 olduğunu unutmayın.
Ölçüm | Değer |
---|---|
Pozitif sınıf | 1 |
Negatif sınıf | 0 |
Hassasiyet | 0,0810 |
Geri çağırma | 0,9315 |
Doğruluk | 0,9260 |
F1 puanı | 0,9328 |
Bu karışıklık matrisinde kalın karakterlerle gösterilen değerler, modelin her bir etiketi ne sıklıkta doğru şekilde sınıflandırdığını, kalın olmayan karakterlerle gösterilen değerler ise modelin her bir etiketi ne sıklıkla yanlış sınıflandırdığını belirtir.
Doğru etiket | Tahmin edilen etiket 1 | Tahmin edilen etiket 2 |
---|---|---|
1 | %93 | %7 |
0 | %8 | %92 |
3. Ağırlıkları ve kesme noktasını alma
Modelle ilgili ağırlıkları ve kesme noktasını alın:
Doğrusal regresyon
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
weight | 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 |
İkili mantıksal regresyon
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
weight | 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. Tahmini simüle etme
Doğrusal regresyon
ML.PREDICT
kullanmadan standart SQL kullanarak tahminde bulunmak için ağırlıklarla birlikte özellik değerlerinin nokta çarpımını kullanın ve kesme noktasını ekleyin. Bu sorgu, bu tekniği kullanan tahminleri ML.PREDICT
kullanan tahminlerle karşılaştırır. Kalın karakterlerle gösterilen SQL satırlarının model ağırlıklarını içeren satır için özellik değerlerinin nokta çarpımını nasıl gerçekleştirdiğine, ardından kesme noktasını nasıl eklediğine dikkat edin.
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
İkili mantıksal regresyon
İkili mantıksal regresyonda, tahminleri simüle etme tekniği doğrusal regresyona çok benzer. Bu teknikte ek olarak son adımda, istenen eşikle birlikte sigmoid işlevi de uygulanır.
ML.PREDICT
kullanmadan standart SQL kullanarak tahminde bulunmak için ağırlıklarla birlikte özellik değerlerinin nokta çarpımını kullanın ve kesme noktasını ekleyin.
Ardından 0 veya 1 değerini tahmin etmek için sonuçta 0,5 eşiğiyle sigmoid işlevini kullanın. Bu sorgu, bu tekniği kullanan tahminleri ML.PREDICT
kullanan tahminlerle karşılaştırır.
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
Yukarıdaki sorguda kalın karakterlerle gösterilen SQL kod bloku modelin ağırlıklarıyla her satır için özellik değerlerinin nokta çarpımını gerçekleştirip kesme noktasını ekleyerek doğrusal regresyon tahminini elde eder:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Ardından standart SQL kullanarak Y = 1 / (1+e^-z)
sigmoid işlevini nokta çarpımına ve kesme noktasına uygular:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Son olarak, sigmoid işlevinin sonucu 0,5 eşik değeriyle karşılaştırılarak ikili mantıksal regresyon tahminine ulaşılır. İkili mantıksal regresyon tahmini 0,5'ten küçük eşik değerleri için 0, 0,5'ten büyük eşik değerleri için 1 olarak gösterilir. 0 ile 1 arasında herhangi bir eşik değeri kullanabilirsiniz.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Bu teknik çok sınıflı mantıksal regresyona da uygulanabilir. Bu durumda modelin ağırlıkları vektör yerine nxn matrisi; ağırlıklar ise skaler yerine vektör olur. Özellik değerleri vektörünü ağırlıklar matrisiyle çarpıp kesme noktası vektörünü eklersiniz. Sonuçta ortaya çıkan vektör her etiket için bir puana sahip olur. Tahmininiz için en yüksek puana sahip etiketi seçebilirsiniz. Bir olasılık dizisi döndürmek istiyorsanız sigmoid işlevini dizinin her bir öğesine uygulayabilirsiniz.
5. Sonuçları karşılaştırma
Doğrusal regresyon
Küçük bir yuvarlama hatası hariç örnek sonuçları neredeyse aynıdır.
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 |
İkili mantıksal regresyon
Simüle edilen çıkarım ML.PREDICT
ile elde edilen gerçek sonuçlarla karşılaştırıldığında mükemmel bir sonuç alınır. 10.000 satırlık engel kümesinde tek bir çelişki bile olmaz. Hem ML.PREDICT
hem de simüle edilen çıkarımın gerçek etiketle farklılık gösterdiği birkaç satır vardır. Model doğruluğu %93 olduğundan ve karışıklık matrisindeki diyagonal dışı hücrelerde küçük ama sıfır olmayan değerler bulunduğundan bu beklenen bir durumdur.
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 |
ML ile kitle etkinleştirme listesi oluşturma
Tipik kullanım alanlarından biri, dönüşümleri tahmin etmek için diferansiyel gizli ikili mantıksal regresyon modeli oluşturup ardından kitle listesi oluştururken çıkarımı bu modele uygulamaktır. Yukarıdaki örnekte oluşturulan ikili mantıksal modelin dönüşümleri modellediğini, eğitim ve değerlendirme gruplarındaki her bir satırın da farklı bir kullanıcıyı temsil ettiğini varsayalım.
Aşağıdaki sorgu, modelin dönüşüm gerçekleştireceğini tahmin ettiği kullanıcıları içeren bir kitle listesinin nasıl oluşturulacağını gösterir:
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;