Modelowanie regresji w Centrum danych reklam

Regresje liniowa i logistyczna to modele systemów uczących się, które umożliwiają generowanie trafnych prognoz na podstawie danych reklamowych.

  • Regresja liniowa tworzy funkcję, która dopasowuje linię do danych w taki sposób, aby zminimalizować odległość między linią a punktami danych. Ten model może służyć do prognozowania wartości liczbowej na podstawie danych wejściowych, np. do przewidywania wartości użytkownika od początku śledzenia na podstawie jego zakupów, wcześniejszych interakcji itp.
  • Regresja logistyczna służy do rozwiązywania problemów z klasyfikacją prognostyczną. Ten model może występować w 2 odmianach w zależności od liczby podanych przez Ciebie zmiennych:
    • Binarna regresja logistyczna odpowiada „tak/nie” na pytania dotyczące np. możliwości wystąpienia zdarzenia konwersji.
    • Wieloklasowa regresja logistyczna służy do prognozowania większej liczby możliwych wartości, np. do określania, czy klient będzie mieć „małą wartość”, „średnią wartość” czy „dużą wartość”.

Regresje liniowa i logistyczna uczą się na podstawie danych treningowych (w tym przypadku danych reklamowych), aby udostępnić Ci model prognostyczny do podejmowania decyzji reklamowych. Działanie modelu jest tym dokładniejsze, im więcej dostarczysz mu danych o wysokiej jakości. Oba modele lepiej sobie radzą, gdy mają silnie ujednolicone tematycznie dane treningowe.

Prywatność różnicowa

Regresje liniowa i logistyczna korzystają z prywatności różnicowej, która jest systemem kontroli prywatności działającym na innej zasadzie niż pozostałe operacje w Centrum danych reklam. Prywatność różnicowa zapewnia ochronę prywatności użytkowników poprzez dodawanie szumu do wyników podczas procesu trenowania. Ten poziom szumu jest na tyle niski, że wyniki końcowe są nadal przydatne, ale zarazem dostatecznie wysoki, aby nie udało się zidentyfikować użytkowników. Poza tym poziom szumu jest niedeterministyczny, czyli nie ma stałej wartości, co jeszcze bardziej polepsza ochronę prywatności użytkowników.

Ograniczenia zapytań

Jeśli używasz domyślnej wartości parametru EPSILON_PER_MODEL, możesz utworzyć maksymalnie 100 zapytań związanych z modelowaniem regresji liniowej i logicznej na „dzień danych”. Termin „dzień danych” oznacza zdarzenia wygenerowane w określonym dniu. Zdarzenia te mieszczą się w datach rozpoczęcia i zakończenia podanych przez Ciebie podczas wykonywania zapytania oraz datach rozpoczęcia i zakończenia używanych podczas tworzenia tabel służących Twojemu zapytaniu, np. tabel tymczasowych wykorzystywanych do trenowania. Oznacza to, że danych z jednego dnia można używać w maksymalnie 100 modelach. Jeśli określisz wartość parametru EPSILON_PER_MODEL wyższą od domyślnej, będziesz mieć możliwość utworzenia niższej liczby modeli, ale o lepszej jakości. Po wybraniu niższych wartości parametru EPSILON_PER_MODEL możesz wytrenować więcej modeli, ale o gorszej jakości.

Jak to działa

Ten proces składa się z takich podstawowych kroków:

  1. przygotowanie danych do trenowania,
  2. tworzenie modelu,
  3. zbieranie statystyk wygenerowanych przez model.

Przygotowanie danych do trenowania

Jak już wspomnieliśmy, używanie większych zbiorów danych o wysokiej jakości sprzyja ogólnie uzyskiwaniu lepszych wyników. Poza tym dane wejściowe są skalowane za pomocą metody minimum–maksimum, więc słabo ujednolicone tematycznie dane lub takie, które zawierają wartości znacznie odstające od reszty, mogą negatywnie wpływać na model przez przesunięcie wartości średniej.

Domyślnie Centrum danych reklam wybiera losowo 18% danych treningowych do weryfikacji. Odsetek danych używanych do weryfikacji można określać za pomocą opcji data_split_eval_fraction.

Tworzenie modelu

Określ parametry i dane wejściowe do trenowania modelu.

Sprawdzone metody

Jednym z najważniejszych czynników wpływających na jakość modelu jest rozmiar zbioru do trenowania. Jednak w zależności od problemu i wymienionych niżej czynników stosunek rozmiaru do jakości będzie się zmieniał. Podziel się swoimi doświadczeniami.

  • W przypadku modeli regresji logistycznej utworzonych na podstawie zbiorów treningowych, które obejmują co najmniej 100 tys. użytkowników, odnotowaliśmy dokładność > 0,70.
  • W przypadku modeli regresji liniowej utworzonych na podstawie zbiorów treningowych, które obejmują co najmniej 800 tys. użytkowników, odnotowaliśmy wartość r kwadrat > 0,70.

Występują też inne czynniki, które mogą obniżać jakość modelu.

  • Modele logistyczne, w których jedna klasa jest znacznie lepiej reprezentowana niż pozostałe. W szczególności, gdy jednej etykiecie odpowiada tylko kilku użytkowników w treningowym zbiorze danych, to nawet duża liczba użytkowników w treningowym zbiorze danych przypadająca na pozostałe etykiety nie pomoże raczej w zwiększeniu dokładności modelu w odniesieniu do tej pierwszej etykiety. Jeśli np. na 2 etykiety przypada odpowiednio 20 tys. i 1000 użytkowników w zbiorze treningowym, przyniesie to gorszą jakość modelu, niż gdyby użytkowników było odpowiednio 10 tys. i 2000.
  • Dane cech, które nie dostarczają silnego sygnału dotyczącego etykiet.
  • Nieprzetworzone dane, które wymagają bardziej pracochłonnej ekstrakcji wyróżników. Na przykład niektóre pola mogą mieć bardzo dużą liczbę możliwych wartości. Jednym ze sposobów polepszania danych tego typu jest przekształcenie wartości w cechę o mniejszej liczbie kategorii lub zasobników.

Zbieranie statystyk

Możesz wywoływać funkcje służące do oceny skuteczności modelu w przypadku danych weryfikacyjnych, sprawdzać cechy i informacje dotyczące iteracji trenowania (np. wagi źródłowe używane przez model podczas prognozowania) oraz prognozować niewidoczne dane.

Instrukcja CREATE MODEL

Instrukcja CREATE MODEL tworzy model o określonej przez Ciebie nazwie i wybranym zbiorze danych. Jeśli nazwa modelu już istnieje, instrukcja CREATE MODEL zastąpi obecny model.

Składnia instrukcji CREATE MODEL

CREATE MODEL
model_name
OPTIONS
(
  // model_option_list:
  // Required parameter.
  MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}

  // Optional tuning parameters.
  [, L1_REG = float64_value ]
  [, L2_REG = float64_value ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
                           'NORMAL_EQUATION' } ]
  [, MAX_ITERATIONS = int64_value ]
  [, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
  [, LEARN_RATE = float64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, LS_INIT_LEARN_RATE = float64_value ]
  [, EPSILON_PER_MODEL = float64_value ]
  [, AUTOMATIC_IMPUT_SCALING = bool_value ]
  [, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
  [, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
  [, QUANTILE_BUCKETIZED_COLS = [
        STRUCT(string_value AS col_name, int64_value AS num_buckets), 
       STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement

model_name

Nazwa zawierająca znaki alfanumeryczne, w tym znaki podkreślenia i łączniki. Nie może zawierać kropek. Jeśli podana nazwa modelu już istnieje, stary model zostanie zastąpiony.

query_statement

Określa standardowe zapytanie SQL służące do generowania danych treningowych. Jeśli tworzysz większą liczbę modeli za pomocą tych samych danych treningowych, utwórz tabelę tymczasową z danymi treningowymi i odwołuj się do niej tutaj. Ta metoda pozwoli uniknąć potencjalnych błędów wykrytych podczas sprawdzania różnic, a wynikających z wyczyszczenia danych lub z opóźnionego spamu.

model_option_list

model_type

(Wymagane) Jedyna wymagana opcja. Może mieć wartość „adh_linear_regression” lub „adh_logistic_regression”.

l1_reg

(Opcjonalnie) Wielkość zastosowanej regularyzacji L1. Regularyzacja L1 powoduje nakładanie kar na wagi proporcjonalnie do ich sumy wartości bezwzględnych. Może być dowolną liczbą nieujemną, a domyślnie przyjmuje wartość 0.

l2_reg

(Opcjonalnie) Wielkość zastosowanej regularyzacji L2. Regularyzacja L2 powoduje nakładanie kar na wagi proporcjonalnie do pierwiastka kwadratowego z sumy ich kwadratów. Może być dowolną liczbą nieujemną, a domyślnie przyjmuje wartość 0.

data_split_eval_fraction

(Opcjonalnie) Musi mieścić się w przedziale od 0,01 do 0,99, a domyślnie przyjmuje wartość 0,18. Określa, jaka część danych trafi do zbioru weryfikacyjnego. Ma to wpływ na dokładność modelu, ponieważ ogranicza liczbę wierszy, które trafiają do modelu, ale zarazem zwiększa liczbę modeli dostępnych dla użytkownika. Oto wykres tej relacji przy założeniu, że KAŻDY model w zbiorze danych ma taki sam odsetek:

Odsetek weryfikacji Dozwolone zapytania
0,01 7
0,1 8
0,15 8
0,18 9
0,2 9
0,3 10
0,5 14
0,9 50

optimize_strategy

(Opcjonalnie) Strategia trenowania modeli regresji liniowej.

Argumenty

AUTO_STRATEGY” określa strategię trenowania w taki sposób:

  • Jeśli określono l1_reg lub warm_start, używana jest strategia batch_gradient_descent.
  • Jeśli łączna moc zbioru cech trenowania przekracza 10 tys., używana jest strategia batch_gradient_descent.
  • W przypadku nadmiernego dopasowania (czyli gdy liczba przykładów treningowych jest mniejsza niż 10-krotność łącznej mocy zbioru) używana jest strategia batch_gradient_descent.
  • W pozostałych przypadkach używana jest strategia NORMAL_EQUATION.

Strategia „BATCH_GRADIENT_DESCENT” (dotyczy tylko regresji logistycznej) trenuje model za pomocą metody zbiorczego gradientu prostego, która optymalizuje funkcję utraty przy użyciu funkcji gradientu.

Strategia „NORMAL_EQUATION” (dotyczy tylko regresji liniowej) bezpośrednio oblicza najmniejsze kwadraty dla danej regresji liniowej za pomocą formuły analitycznej. Zwykłego równania nie można używać w tych przypadkach:

  • Określona jest wartość l1_reg.
  • Określona jest wartość warm_start.
  • Łączna moc zbioru cech treningowych przekracza 10 tys.
  • Wartością domyślną jest „AUTO_STRATEGY”.

max_iterations

(Opcjonalnie) Liczba iteracji (czyli kroków) trenowania. To zapytanie tworzy po jednym drzewie na każdą iterację, więc jest to zarazem liczba drzew. Musi to być liczba całkowita większa od 1. Wartość domyślna to 20.

learn_rate_strategy

(Opcjonalnie, dotyczy tylko regresji logistycznej) Strategia określania tempa uczenia się podczas trenowania.

Argumenty

LINE_SEARCH” oblicza tempo uczenia się za pomocą metody wyszukiwania liniowego. Początkowe tempo uczenia się określone na podstawie wyszukiwania liniowego jest wartością parametru LS_INIT_LEARN_RATE.

  • Wyszukiwanie liniowe spowalnia trenowanie i zwiększa liczbę przetwarzanych bajtów, ale ogólnie zbiega się nawet z większym określonym początkowo tempem uczenia się.

CONSTANT” podaje dla tempa uczenia się wartość określoną dla parametru LEARN_RATE.

Wartością domyślną jest „LINE_SEARCH”.

learn_rate

(Opcjonalnie, dotyczy tylko regresji logistycznej) Tempo uczenia się w przypadku metody gradientu prostego, gdy opcja LEARN_RATE_STRATEGY ma ustawienie CONSTANT. Jeśli opcja LEARN_RATE_STRATEGY ma ustawienie „LINE_SEARCH”, zwracany jest błąd.

Argumenty

float64_value może być dowolną 64-bitową liczbą zmiennoprzecinkową. Wartość domyślna to 0,1 (10%).

early_stop

(Opcjonalnie) Określa, czy trenowanie powinno zostać przerwane po pierwszej iteracji, w ramach której względna poprawa strat jest mniejsza niż wartość określona dla opcji MIN_REL_PROGRESS.

Argumenty

TRUE – „tak”, FALSE – „nie”. Wartość domyślna to TRUE.

min_rel_progress

(Opcjonalnie) Minimalna względna poprawa strat, która jest niezbędna do kontynuacji trenowania, gdy dla opcji EARLY_STOP ustawiona jest wartość „true”. Na przykład wartość 0,01 oznacza, że aby trenowanie było kontynuowane, każda iteracja musi zmniejszyć stratę o 1%.

Argumenty

float64_value może być dowolną 64-bitową liczbą zmiennoprzecinkową. Wartość domyślna to 0,1 (10%).

ls_init_learn_rate

(Opcjonalnie) Określa początkową szybkość uczenia się, której używa strategia LEARN_RATE_STRATEGY='LINE_SEARCH'. Z tej opcji można korzystać tylko wtedy, gdy określono ustawienie opcji LINE_SEARCH.

Jeśli okaże się, że strategia LEARN_RATE modelu podwaja każdą iterację zgodnie z ustawieniem ML.TRAINING_INFO, spróbuj podać dla opcji LS_INIT_LEARN_RATE ostatnie podwójne tempo uczenia się. Optymalne początkowe tempo uczenia się różni się w zależności od modelu. Dobre początkowe tempo uczenia się w przypadku jednego modelu może być niekorzystne w przypadku innego.

Argumenty

float64_value może być dowolną 64-bitową liczbą zmiennoprzecinkową.

epsilon_per_model

(Opcjonalnie) Określa kwotę budżetu na potrzeby prywatności, która służy do trenowania tego modelu. Każdy klient korzystający z danych reklam otrzymuje budżet na potrzeby prywatności wynoszący 10,0 na dzień danych. Wytrenowany model przeznaczy część budżetu podaną w parametrze EPSILON_PER_MODEL na każdy dzień danych w zakresie dat określonym podczas wykonywania zapytania. Użycie wartości domyślnej ln(3)/10 umożliwi utworzenie około 100 modeli. Jeśli określisz wyższą wartość, możesz utworzyć mniej modeli, ale o lepszej jakości. Jeśli użyjesz niższej wartości, możesz utworzyć więcej modeli, ale o gorszej jakości.

Argumenty

float64_value może być dowolną dodatnią 64-bitową liczbą zmiennoprzecinkową niższą od ln(3), czyli wynoszącą około 1,0986. Wartość domyślna to ln(3)/10.

automatic_input_scaling

(Opcjonalnie) Gdy ustawiona jest wartość TRUE, we wszystkich kolumnach cech numerycznych automatycznie stosowana jest opcja min_max_scaling, jak gdyby nazwy kolumn były jawnie wywoływane w opcji min_max_scaled_cols. Wyjątkiem są kolumny, które zostały jawnie wywołane w opcji standard_scaled_cols lub quantile_bucketized_cols.

Argumenty

bool_value jest wartością logiczną (BOOL), a domyślnie przyjmuje ustawienie TRUE.

min_max_scaled_cols

(Opcjonalnie) Skaluje każdą wskazaną kolumnę cech będących wyrażeniami liczbowymi z zakresu od 0 do 1, przy czym we wszystkich wierszach obowiązują limity określone wartościami MINMAX. Te same wartości MINMAX są automatycznie używane w prognozie. Jeśli dane prognozy nie mieszczą się w zakresie MINMAX, są ograniczane do wartości 0 lub 1.

Argumenty

Tablica string_value, w której każdy element string_value to ciąg znaków reprezentujący nazwę kolumny do przekształcenia.

standard_scaled_cols

(Opcjonalnie) Standaryzuje wskazane kolumny cech numerical_expression we wszystkich wierszach. Wartości STDDEVMEAN obliczone na potrzeby standaryzacji wyrażenia są automatycznie używane w prognozie.

Argumenty

Tablica string_value, w której każdy element string_value ma typ STRING i reprezentuje nazwę kolumny do przekształcenia.

quantile_bucketized_cols

Grupuje wskazane kolumny ciągłych cech liczbowych w elementy typu STRING, podając nazwę zasobnika jako wartość obliczoną na podstawie kwantyli. Te same kwantyle są automatycznie używane w prognozie.

Argumenty

Tablica STRUCT(string_value AS col_name, int64_value AS num_buckets), w której każda wartość ciągu to element typu STRING reprezentujący nazwę kolumny do przekształcenia z ciągłymi wartościami liczbowymi, a każdy element typu int64_value to liczba zasobników, na jaką mają zostać podzielone wartości liczbowe.

Weryfikacja

  • Każdy dzień danych w zakresie dat określonym dla tego zapytania musi mieć wystarczający budżet na potrzeby prywatności, czyli wynosić więcej niż wartość parametru EPSILON_PER_MODEL. W przeciwnym razie zapytanie zakończy się niepowodzeniem.
  • Opcjonalne parametry dostrajania (jeśli są określone) zostaną zweryfikowane pod kątem nieprzekraczania wymienionych powyżej zakresów.
  • Należy jawnie podać tylko jeden wymagany parametr model_type.
  • Jedna kolumna w zbiorze treningowym musi mieć nazwę „label” (etykieta). Obecnie nie można używać większej liczby etykiet.
  • Kolumna „label” nie może zawierać wartości NULL. Jeśli kolumna „label” zawiera wartości NULL, wykonanie zapytania zakończy się niepowodzeniem.
  • Żadnej kolumny cech nie można utworzyć na podstawie parametru user_id.
  • Każdy wiersz musi zawierać dokładnie jednego unikalnego użytkownika. Jeden wiersz nie może zawierać danych pochodzących od więcej niż 1 użytkownika. Może je czasem zawierać w przypadku niektórych złączeń, np. CROSS JOIN (połączenie iloczynowe).
  • Żaden użytkownik nie może się znaleźć w 2 osobnych wierszach.
  • Ze względu na ochronę prywatności można używać tylko opcji opisanych w sekcji dotyczącej składni. Inne opcje, które można znaleźć w dokumentacji zapytania BQML CREATE MODEL, nie są obecnie obsługiwane.

Funkcje oceny

ML.EVALUATE

Funkcji ML.EVALUATE możesz używać do oceny danych modelu. Funkcję ML.EVALUATE można stosować z modelami regresji liniowej lub logistycznej.

SELECT
  *
FROM ML.EVALUATE(MODEL `linear_model_test`);

ML.ROC_CURVE

Funkcji ML.ROC_CURVE możesz używać do oceny danych dotyczących regresji logistycznej. Funkcja ML.ROC_CURVE ocenia tylko modele regresji logistycznej.

SELECT
  *
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);

Funkcje prognostyczne

ML.PREDICT

Funkcji ML.PREDICT możesz używać do prognozowania wyników za pomocą modelu. Rezultaty uzyskane za pomocą funkcji ML.PREDICT podlegają tym samym kontrolom prywatności co inne wyniki w Centrum danych reklam. Więcej informacji o mechanizmach kontroli prywatności

Regresja liniowa

/* This example outputs the average value for labels that the model predicted */
SELECT
  AVG(predicted_label) AS average_predicted_label
FROM
  ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);

Regresja logistyczna

/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
  label,
  predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
  COUNT(*) AS num /* a tally of users */
FROM
  ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;

Funkcje badania modeli i cech

ML.TRAINING_INFO

Funkcja ML.TRAINING_INFO umożliwia Ci wyświetlanie informacji o iteracjach trenowania modelu.

SELECT
  *
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);

ML.FEATURE_INFO

Funkcja ML.FEATURE_INFO umożliwia Ci wyświetlanie informacji o cechach wejściowych służących do trenowania modelu.

SELECT
  *
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);

ML.WEIGHTS

Funkcja ML.WEIGHTS umożliwia Ci sprawdzanie wag źródłowych używanych przez model podczas prognozowania.

SELECT
  *
FROM ML.WEIGHTS(MODEL `linear_model_test`);

Przykłady

Tworzenie modelu

Wszystkie podane niżej przykłady tworzenia modeli korzystają z tabeli poglądowej natality.

Dane treningowe na potrzeby wyboru wewnętrznego (regresja liniowa)

W tym przykładzie użyliśmy masy urodzeniowej, płci, liczby tygodni ciąży oraz wieku i rasy matki, aby przewidzieć masę urodzeniową dziecka.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_linear_regression') AS
SELECT
  weight_pounds as label,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

Dane treningowe na potrzeby wyboru wewnętrznego (regresja logistyczna)

W tym przykładzie użyliśmy masy urodzeniowej, płci, liczby tygodni ciąży oraz wieku i rasy matki, aby przewidzieć płeć dziecka.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_logistic_regression') AS
SELECT
  weight_pounds,
  is_male as label,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL