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:
- przygotowanie danych do trenowania,
- tworzenie modelu,
- 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
lubwarm_start
, używana jest strategiabatch_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 MIN
i MAX
.
Te same wartości MIN
i MAX
są automatycznie używane w prognozie. Jeśli dane prognozy nie mieszczą się w zakresie MIN
–MAX
, 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 STDDEV
i MEAN
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