Modül 4 · Veri Ambarı · ⏱ 7 dk

ML in warehouse: BigQuery ML

BigQuery ML

Bu derste neler öğreneceksin

  • CREATE MODEL ile linear regression yazar
  • Forest + boosted regression dener
  • Classification modeli eğitir

Veri Ambarında ML: BQML

Geleneksel ML workflow’u:

  1. Veri ambarından veriyi indir (GB’larca).
  2. Pandas ile temizle, feature engineering yap.
  3. scikit-learn / XGBoost ile eğit.
  4. Modeli serialize et, deploy et.
  5. Prediction’ları tekrar veritabanına yaz.

Bu akış veri hareketi yaratır (GB’larca), ETL boru hattına bağımlıdır, model güncellemesi yavaştır. BigQuery ML (BQML) bunu tek bir SQL cümlesine indirir: veri ambarından hiç çıkmadan model eğit, değerlendir, tahmin yap.

Ne zaman BQML? Veri zaten BigQuery’de, model deployment’ı basit olsun, hızlı prototype isteniyor. Ne zaman geleneksel ML? Büyük neural network, custom feature engineering, fine-tuning, sub-second latency — o zaman Vertex AI ya da custom stack.

Model Türleri

BQML 10+ model türü sunar. En önemli 5’i:

ModelGörevAlgoritma
linear_regRegresyon (sürekli değer)Doğrusal regresyon
logistic_regSınıflandırma (evet/hayır)Lojistik regresyon
random_forest_*Regresyon/sınıflandırmaEnsemble of decision trees
boosted_tree_*Regresyon/sınıflandırmaXGBoost benzeri gradient boosting
kmeansKümeleme (segmentasyon)Centroid-based clustering

Daha gelişmiş: dnn (deep neural network), matrix_factorization (tavsiye sistemleri), automl (AutoMLTables).

Linear Regression: Basit Ama Etkili

NYC taksi verisinde “toplam tutar” tahmin edelim:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_linear`
OPTIONS(
  model_type = 'linear_reg',
  input_label_cols = ['total_amount'],
  data_split_method = 'AUTO_SPLIT',     -- train/test otomatik böl
  l1_reg = 0.1,                          -- L1 regularization (overfit önler)
  l2_reg = 0.1                           -- L2 regularization
) AS
SELECT
  trip_distance,
  passenger_count,
  EXTRACT(HOUR FROM pickup_datetime) AS hour_of_day,
  EXTRACT(DAYOFWEEK FROM pickup_datetime) AS day_of_week,
  total_amount
FROM `bigquery-public-data.new_york_taxi.taxi_trips`
WHERE total_amount > 0
  AND trip_distance > 0
  AND pickup_datetime BETWEEN '2024-01-01' AND '2024-06-30';

data_split_method = 'AUTO_SPLIT' BigQuery’e “verinin %80’ini train, %20’sini test olarak ayır” der. Model eğitilirken iki ayrı eğitim geçer: biri train, diğer eval set üzerinde.

Eğitim ~2-3 dakika sürer. Sonra ML.EVALUATE ile başarıyı ölç:

SELECT * FROM ML.EVALUATE(MODEL `my_dataset.taxi_price_linear`);

Dönen metrikler:

  • r2_score: 0-1 arası, 1’e yakın iyi. ~0.78 beklenir.
  • mean_absolute_error: Ortalama tahmin hatası ($). ~2.5$.
  • mean_squared_error: Hata karesi ortalaması. ~24.

Regresyon katsayılarını görmek için:

SELECT * FROM ML.WEIGHTS(MODEL `my_dataset.taxi_price_linear`)
ORDER BY ABS(weight) DESC;

trip_distance katsayısı ~2.5, passenger_count ~0.8 — yani her km başına $2.5, her ek yolcu $0.8 ek ücret. Model gerçek hayatla tutarlı.

Tahmin Yap

SELECT
  trip_distance,
  passenger_count,
  hour_of_day,
  predicted_total_amount,
  predicted_total_amount - total_amount AS hata
FROM ML.PREDICT(
  MODEL `my_dataset.taxi_price_linear`,
  (
    SELECT
      trip_distance,
      passenger_count,
      EXTRACT(HOUR FROM pickup_datetime) AS hour_of_day,
      total_amount
    FROM `bigquery-public-data.new_york_taxi.taxi_trips`
    WHERE pickup_datetime BETWEEN '2024-07-01' AND '2024-07-07'
    LIMIT 100
  )
);

predicted_total_amount modelin tahmini, hata gerçek değerden farkı.

Tree Modelleri: Daha İyi Doğruluk

Doğrusal model, ilişkileri doğru varsayıyor. Gerçek hayatta ilişkiler karmaşıktır. Tree modelleri bu varsayımı yapmaz:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_xgb`
OPTIONS(
  model_type = 'BOOSTED_TREE_REGRESSOR',
  input_label_cols = ['total_amount'],
  num_parallel_tree = 100,            -- random forest modunda
  max_tree_depth = 8,                 -- her ağacın derinliği
  learn_rate = 0.05,                  -- boosting öğrenme hızı
  data_split_method = 'AUTO_SPLIT'
) AS
SELECT ...;  -- Aynı feature'lar

BOOSTED_TREE_REGRESSOR XGBoost benzeri gradient boosting. R2_score ~0.92 (linear’a göre %15 daha iyi), MAE ~1.3$ (yarı yarıya düşer). Eğitim süresi 4-5x uzun ama doğruluk artışı production için buna değer.

RANDOM_FOREST_REGRESSOR benzer performans, eğitim daha hızlı ama prediction biraz daha yavaş. Hangisini seçeceğin: feature sayısı az ise random forest, çok ise boosted tree.

Sınıflandırma: Evet/Hayır

“Yolculuk 20$ üstünde mi” sorusu (binary classification):

CREATE OR REPLACE MODEL `my_dataset.taxi_is_expensive`
OPTIONS(
  model_type = 'BOOSTED_TREE_CLASSIFIER',
  input_label_cols = ['is_expensive'],
  data_split_method = 'AUTO_SPLIT',
  max_tree_depth = 6
) AS
SELECT
  trip_distance,
  passenger_count,
  EXTRACT(HOUR FROM pickup_datetime) AS hour_of_day,
  EXTRACT(DAYOFWEEK FROM pickup_datetime) AS day_of_week,
  total_amount > 20 AS is_expensive
FROM `bigquery-public-data.new_york_taxi.taxi_trips`
WHERE total_amount > 0
  AND trip_distance > 0;

is_expensive boolean label. Model TRUE/FALSE tahmin eder. Olasılık dahili olarak hesaplanır:

SELECT
  trip_distance,
  predicted_is_expensive,
  -- Olasılık: evet olma olasılığı
  (SELECT prob FROM UNNEST(predicted_is_expensive_probs) WHERE label = TRUE) AS evet_olasiligi
FROM ML.PREDICT(
  MODEL `my_dataset.taxi_is_expensive`,
  (SELECT 8.0 AS trip_distance, 2 AS passenger_count, 18 AS hour_of_day)
);

evet_olasiligi 0.7 ise, model “8 km, 2 yolcu, 18:00 yolculuğu %70 ihtimalle 20$ üstü” diyor.

Sınıflandırma metrikleri:

SELECT * FROM ML.CONFUSION_MATRIX(MODEL `my_dataset.taxi_is_expensive`);
SELECT * FROM ML.ROC_CURVE(MODEL `my_dataset.taxi_is_expensive`);

ROC AUC 0.5-1 arası, 0.9 üstü iyi. Confusion matrix true positive / false positive sayılarını verir — eşik değerini (default 0.5) değiştirerek trade-off ayarlanır.

Feature Engineering SQL’de

BQML’in en güçlü tarafı: feature engineering SQL’in parçası. TRANSFORM clause:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_engineered`
OPTIONS(
  model_type = 'BOOSTED_TREE_REGRESSOR',
  input_label_cols = ['total_amount'],
  data_split_method = 'AUTO_SPLIT'
) AS
SELECT
  total_amount,
  -- Ham feature'lar
  trip_distance,
  passenger_count,
  -- Türetilmiş feature'lar
  trip_distance * passenger_count AS mesafe_x_yolcu,
  CASE
    WHEN EXTRACT(HOUR FROM pickup_datetime) BETWEEN 7 AND 9 THEN 'rush_morning'
    WHEN EXTRACT(HOUR FROM pickup_datetime) BETWEEN 17 AND 19 THEN 'rush_evening'
    ELSE 'normal'
  END AS saat_kategorisi,
  -- ML.PRICING SQL fonksiyonu otomatik feature çıkarımı yapar
FROM ...;

Bu feature’lar sadece eğitimde değil, tahmin sırasında da otomatik hesaplanır — feature store’a gerek yok.

Model Registry ve Deployment

Bir modeli eğittikten sonra başka dataset’te tahmin için kullanabilirsin. Model export ile Vertex AI Model Registry’ye de gönderebilirsin:

-- Vertex AI'ye export
CREATE OR REPLACE MODEL `my_dataset.taxi_for_vertex`
OPTIONS(
  model_type = 'BOOSTED_TREE_REGRESSOR',
  input_label_cols = ['total_amount'],
  model_registry = 'vertex_ai'    -- otomatik Vertex'e kayıt
) AS SELECT ...;

Vertex AI’de model version’ları, A/B test, monitoring var. Üretim için Vertex AI endpoint en iyisi — sub-50ms latency.

Hyperparameter Tuning

num_parallel_tree, max_tree_depth, learn_rate gibi parametrelerin en iyi kombinasyonunu bulmak için:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_tuned`
OPTIONS(
  model_type = 'BOOSTED_TREE_REGRESSOR',
  input_label_cols = ['total_amount'],
  num_parallel_tree = HPARAM_RANGE(50, 200),    -- 50-200 arası dene
  max_tree_depth = HPARAM_CANDIDATES([4, 6, 8, 10]),
  learn_rate = HPARAM_RANGE(0.01, 0.3),
  num_trials = 20,                              -- 20 kombinasyon dene
  hparam_tuning_objectives = ['mean_squared_error']
) AS SELECT ...;

BigQuery otomatik 20 kombinasyon dener, en düşük MSE’yi vereni seçer. Vertex AI olmadan hyperparameter tuning yapabilmek büyük avantaj.

Production Considerations

  1. Data drift: Model 2024 verisiyle eğitildi, 2026’da pattern değişti. Düzenli yeniden eğitim şart.
  2. Feature freshness: Tahmin anında feature’lar güncel mi? Yoksa streaming insert ile yeni feature’ları mı besliyorsun?
  3. Cost: BQML eğitimi slot-saat üzerinden faturalandırır. Karmaşık tree modelleri saatlerce sürebilir, $5-50 arası bir eğitim normal.
  4. Latency: BQML tahminleri BigQuery sorgu süresiyle sınırlı. Real-time (< 100ms) için Vertex AI endpoint kullan.

Ne Öğrendik?

  • BQML, veri ambarından çıkmadan SQL ile model eğitimi + tahmin yapar.
  • Beş ana tür: linear_reg, logistic_reg, boosted_tree, random_forest, kmeans.
  • ML.EVALUATE performans, ML.WEIGHTS katsayılar, ML.PREDICT tahmin.
  • ML.CONFUSION_MATRIX ve ML.ROC_CURVE sınıflandırma metrikleri.
  • Feature engineering TRANSFORM clause ile SQL’de kalır.
  • Vertex AI registry/endpoint entegrasyonu ile production deployment.
  • Hyperparameter tuning BQML’de built-in (HPARAM_RANGE).

Sıradaki

Modül 4: dbt ile transformasyon katmanı →