Kitle listeleri için regresyon modellemesi

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ış:

  1. Veri oluşturma
  2. Modeli eğitme
  3. Ağırlıkları ve kesme noktasını alma
  4. Tahmini simüle etme
  5. 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;