線性和邏輯迴歸是兩種機器學習模型,可根據廣告資料產生有意義的預測結果。
- 「線性迴歸」會建立函式,在資料中取適當位置插入一條線,盡量縮短資料點與這條線的距離。接著,系統便可使用這個模型,根據輸入內容預測數值,例如參考購買資料和過往互動等因素,預測使用者的生命週期價值。
- 「邏輯迴歸」可用於解決預測分類問題。視您提供的變數數量而定,這個模型分為 2 種類型:
- 「二元邏輯迴歸」可解答是非題,例如轉換事件發生的可能性。
- 「多類別邏輯迴歸」可用來預測多個可能的值,例如判斷顧客屬於「低價值」、「中等價值」或「高價值」。
線性和邏輯迴歸都會從訓練資料 (本例為廣告資料) 中學習,讓您能運用預測模型做出廣告決策。一般來說,提供更多資料並確保提供的資料品質優良,能夠提升模型的準確度。若訓練資料集群緊密度高,這兩種模型的成效會更加出色。
差異化隱私
線性和邏輯迴歸皆採用差異化隱私,這個隱私權檢查系統與廣告資料中心其他作業所使用的不同。差異化隱私可在訓練過程中為結果加入雜訊,以便維護使用者隱私。雜訊強度會維持在可兼顧最終結果實用性及使用者身分保密性的平衡點。此外,雜訊強度並非定值,而是會隨結果彈性調控,進一步確保使用者隱私。
查詢限制
使用預設的 EPSILON_PER_MODEL
時,每個「資料天」最多只能執行 100 次線性和邏輯迴歸模擬查詢。資料天是指在特定日期產生的事件。這類事件會對應至您在執行查詢時提供的開始和結束日期,以及在建立查詢使用的所有資料表 (例如用於訓練的暫存資料表) 時,所設定的開始和結束日期。換言之,1 天的資料最多只能供 100 個模型使用。如果您指定的 EPSILON_PER_MODEL 值大於預設值,可建立的模型會變少,而品質會上升。如果選用較小的 EPSILON_PER_MODEL 值,則雖然可訓練的模型增加了,但品質會下降。
運作方式
此工作流程的基本步驟如下:
- 準備訓練資料。
- 建立模型。
- 從模型中收集洞察資料。
準備訓練資料
如前所述,使用規模較大的高品質資料集,通常可以帶來更加出色的成效。此外,輸入的資料會從最小到最大尺度依序調整,因此結構鬆散或有明顯離群值的資料,可能就會因為改變平均值而對模型造成負面影響。
根據預設,廣告資料中心會隨機選出 18% 的訓練資料進行驗證。data_split_eval_fraction
選項可控制用於驗證的資料百分比。
建立模型
指定用於訓練模型的參數和輸入資料。
最佳做法
影響模型品質最重要的因素之一,就是訓練集的大小。不過,大小/品質方面的取捨也因問題和下列因素而異。歡迎與我們分享您的使用體驗。
- 從我們過往的經驗來看,如果邏輯迴歸模型是以包含至少 100,000 位使用者的訓練集建立而成,準確率會大於 0.70。
- 從我們過往的經驗來看,如果線性迴歸模型是以包含至少 800,000 位使用者的訓練集建立而成,R 平方值會大於 0.70。
還有其他因素可能會降低模型的品質。
- 邏輯模型中有個類別的資料量高出其他類別許多。具體來說,如果有個標籤的訓練集使用者人數不多,但其他標籤的訓練集使用者人數很多,對於人數不多的標籤而言,模型的準確度可能就不高。例如,兩個標籤的使用者分別為 20,000 位和 1,000 位的訓練集,準確度便不如兩個標籤的使用者分別為 10,000 位和 2,000 位的訓練集。
- 無法為標籤提供強烈訊號的特徵資料。
- 需要進行更大量特徵工程的原始資料。舉例來說,某些欄位可能有非常多的可用值。要改善這類資料,其中一種方法就是將這些值轉換為類別 (亦即值區) 較少的特徵。
收集洞察資料
您可以呼叫函式來評估模型處理驗證資料的成效、查看訓練疊代的特徵和資訊 (例如模型在預測期間使用的基礎權重),以及根據未顯示的資料進行預測。
CREATE MODEL 陳述式
CREATE MODEL
陳述式會使用您指定的名稱和資料集建立模型。如果模型名稱已存在,CREATE MODEL
會取代現有模型。
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
英數名稱,包含底線和連字號,不得包含半形句號。如果您提供的模型名稱已存在,系統會覆寫舊版模型。
query_statement
指定用來產生訓練資料的標準 SQL 查詢。如要使用相同的訓練資料建立多個模型,請建立包含訓練資料的暫存資料表,並在這裡參照。這種策略可避免差異檢查因資料清除或逾期垃圾內容而發生錯誤。
model_option_list
model_type
(必要) 唯一的必要選項,可以是「adh_linear_regression
」或「adh_logistic_regression
」。
l1_reg
(選用) 套用的 L1 正則化總量。L1 正則化會根據權重絕對值的總和,按比例進行加權。可以是任何非負數,預設值為零。
l2_reg
(選用) 套用的 L2 正則化總量。L2 正則化會根據權重平方總和的平方根,按比例進行加權。可以是任何非負數,預設值為零。
data_split_eval_fraction
(選用) 必須介於 .01 到 .99 之間,預設值為 .18。這個語法決定評估集內最終的資料比例。這會減少模型內最終的列數,同時增加使用者可執行的模型數量,因此會影響模型的準確度。上述關係如下表所示,其中假設指定資料集的「每個」模型都有相同的比例:
驗證比例 | 允許的查詢數 |
---|---|
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
(選用) 訓練線性迴歸模型的策略。
引數
「AUTO_STRATEGY
」決定訓練策略的方式如下:
- 如果指定
l1_reg
或warm_start
,則使用batch_gradient_descent
策略。 - 如果訓練特徵的總基數超過 10,000,則使用
batch_gradient_descent
策略。 - 如果出現過度擬合的問題 (訓練範例數量少於總基數的 10 倍),則使用
batch_gradient_descent
策略。 NORMAL_EQUATION
策略用於所有其他情況。
「BATCH_GRADIENT_DESCENT
」(僅限邏輯) 使用批次梯度下降法訓練模型,該方法使用梯度函式調整損失函式。
「NORMAL_EQUATION
」(僅限線性) 使用分析公式直接計算線性迴歸問題的最小平方解。下列情況無法使用正規方程式:
- 已指定
l1_reg
。 - 已指定
warm_start
。 - 訓練特徵的總基數超過 10,000。
- 預設值為「
AUTO_STRATEGY
」。
max_iterations
(選用) 訓練疊代或步驟的數量。這項查詢會為每項疊代建立一個樹狀結構,因此這也是樹狀結構的數量。必須為大於 1 的整數,預設值為 20。
learn_rate_strategy
(選用,僅限邏輯) 在訓練期間指定學習率的策略。
引數
「LINE_SEARCH
」使用線性搜尋方法計算學習率。線性搜尋初始學習率為 LS_INIT_LEARN_RATE
的指定值。
- 線性搜尋會減慢訓練速度並增加處理的位元組數,但即使初始指定的學習率較大,通常也會趨於同樣結果。
「CONSTANT
」將學習率設為 LEARN_RATE
的指定值。
預設值為「LINE_SEARCH
」。
learn_rate
(選用,僅限邏輯) 當 LEARN_RATE_STRATEGY
設為 CONSTANT
時,梯度下降法的學習率。如果將 LEARN_RATE_STRATEGY
設為「LINE_SEARCH
」,系統會傳回錯誤。
引數
float64_value
可以是任何 64 位元浮點數,預設值為 0.1 (10%)。
early_stop
(選用) 是否應在第一次疊代後停止訓練,其中相對損失改善率小於 MIN_REL_PROGRESS
的指定值。
引數
TRUE
代表「是」,FALSE
代表「否」,預設值為 TRUE
。
min_rel_progress
(選用) 當 EARLY_STOP
設為 true 時,繼續訓練所需的最小相對損失改善率。舉例來說,如果值為 0.01,則指定每次疊代均必須將損失減少 1% 才能使訓練繼續進行。
引數
float64_value
可以是任何 64 位元浮點數,預設值為 0.1 (10%)。
ls_init_learn_rate
(選用) 設定 LEARN_RATE_STRATEGY='LINE_SEARCH'
使用的初始學習率。只有在指定 LINE_SEARCH
時才能使用此選項。
如果模型的 LEARN_RATE
似乎隨每次疊代加倍 (如 ML.TRAINING_INFO
所示),請試著將 LS_INIT_LEARN_RATE
設為上次加倍的學習率。每種模型的最佳初始學習率均不同,適合某個模型的初始學習率可能不適合另一個模型。
引數
float64_value
可以是任何 64 位元浮點數。
epsilon_per_model
(選用) 指定用於訓練此模型的隱私公開程度上限。每位廣告資料客戶的「隱私公開程度上限」為每個資料天 10.0。模型訓練成功後,執行查詢時指定日期範圍內的每個資料天,都會花費公開程度上限的 EPSILON_PER_MODEL。如果使用 ln(3)/10 的預設值,可建立約 100 個模型。使用的值越大,能建立的模型越少,而品質會上升;使用的值越小,能建立的模型越多,但品質會下降。
引數
float64_value
可以是小於 ln(3) 的任何 64 位元正浮點數,約為 1.0986。預設值為 ln(3)/10。
automatic_input_scaling
(選用) 如果為 TRUE
,所有數值特徵欄都會自動套用 min_max_scaling
,如同在 min_max_scaled_cols
選項中明確呼叫資料欄名稱一樣,但在 standard_scaled_cols
或 quantile_bucketized_cols
選項中明確呼叫的任何資料欄,則不包含在內。
引數
bool_value
為 BOOL
,預設值為 TRUE
。
min_max_scaled_cols
(選用) 調整每個指定的 numerical_expression 特徵欄,範圍介於 0 到 1 之間,所有資料列都設有 MIN
和 MAX
的限制。預測時會自動使用相同的 MIN
和 MAX
。如果預測資料超出 MIN
和 MAX
的範圍,則會限制在 0 或 1。
引數
string_value
的陣列,其中每個 string_value
都是 STRING,代表要轉換的資料欄名稱。
standard_scaled_cols
(選用) 將所有資料列的指定 numerical_expression
特徵欄標準化。為了將運算式標準化而算出的 STDDEV
和 MEAN
,會自動用於預測。
引數
string_value
的陣列,其中每個 string_value
都是 STRING
,代表要轉換的資料欄名稱。
quantile_bucketized_cols
將指定連續數值特徵欄值區化為 STRING
,並將值區名稱做為以分位數為準的值。預測時會自動使用相同的分位數。
引數
STRUCT(string_value AS col_name, int64_value AS num_buckets)
的陣列,其中每個 string_value 為 STRING
,代表要轉換的連續數值欄名稱,而每個 int64_value
是指用於拆分數值的值區數量。
驗證
- 在這項查詢指定日期範圍內的每個資料天,都必須有足夠的隱私公開程度上限 (也就是超過 EPSILON_PER_MODEL),否則查詢就會失敗。
- 系統會按照上述範圍驗證選用的調整參數 (如有指定)。
- 只有 model_type 這個必要參數必須明確指定。
- 訓練集中的某個資料欄必須命名為「label」。目前不支援多個標籤。
- 標籤資料欄不得包含空值。如果標籤資料欄含有空值,查詢就會失敗。
- 所有特徵欄均不得從 user_id 衍生。
- 每列只能代表一位不重複使用者,無法代表多位使用者的資料。某些彙整作業可能會發生這種情況,例如 CROSS JOIN。
- 任一使用者皆不得出現在兩個不同的資料列中。
- 基於隱私考量,只有語法章節所述的選項可用。系統目前不支援 BQML CREATE MODEL 查詢說明文件中的其他選項。
評估函式
ML.EVALUATE
使用 ML.EVALUATE
函式評估模型指標。ML.EVALUATE
函式可與線性迴歸或邏輯迴歸模型搭配使用。
SELECT
*
FROM ML.EVALUATE(MODEL `linear_model_test`);
ML.ROC_CURVE
使用 ML.ROC_CURVE
函式評估邏輯迴歸專用指標。ML.ROC_CURVE
只會評估邏輯迴歸模型。
SELECT
*
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);
預測函式
ML.PREDICT
ML.PREDICT
函式可用來透過模型預測結果。使用 ML.PREDICT
取得的結果,必須接受與廣告資料中心其他結果相同的隱私權檢查。進一步瞭解隱私權檢查
線性迴歸
/* 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);
邏輯迴歸
/* 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;
模型與特徵檢查函式
ML.TRAINING_INFO
ML.TRAINING_INFO
函式會顯示模型訓練疊代相關資訊。
SELECT
*
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);
ML.FEATURE_INFO
ML.FEATURE_INFO
函式會顯示用於訓練模型的輸入特徵相關資訊
SELECT
*
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);
ML.WEIGHTS
ML.WEIGHTS
函式會顯示模型在預測期間使用的基礎權重。
SELECT
*
FROM ML.WEIGHTS(MODEL `linear_model_test`);
範例
建立模型
下列範例均使用 natality
範例資料表示範如何建立模型。
在內部 Select 陳述式中訓練資料 (線性)
以下範例會根據出生體重、性別、妊娠週數、母親年齡和母親種族,來預測兒童的出生體重。
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
在內部 Select 陳述式中訓練資料 (邏輯)
以下範例會根據出生體重、性別、妊娠週數、母親年齡和母親種族,預測兒童的性別。
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