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:
- Veri ambarından veriyi indir (GB’larca).
- Pandas ile temizle, feature engineering yap.
- scikit-learn / XGBoost ile eğit.
- Modeli serialize et, deploy et.
- 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:
| Model | Görev | Algoritma |
|---|---|---|
linear_reg | Regresyon (sürekli değer) | Doğrusal regresyon |
logistic_reg | Sınıflandırma (evet/hayır) | Lojistik regresyon |
random_forest_* | Regresyon/sınıflandırma | Ensemble of decision trees |
boosted_tree_* | Regresyon/sınıflandırma | XGBoost benzeri gradient boosting |
kmeans | Kü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
- Data drift: Model 2024 verisiyle eğitildi, 2026’da pattern değişti. Düzenli yeniden eğitim şart.
- Feature freshness: Tahmin anında feature’lar güncel mi? Yoksa streaming insert ile yeni feature’ları mı besliyorsun?
- Cost: BQML eğitimi slot-saat üzerinden faturalandırır. Karmaşık tree modelleri saatlerce sürebilir, $5-50 arası bir eğitim normal.
- 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.EVALUATEperformans,ML.WEIGHTSkatsayılar,ML.PREDICTtahmin.ML.CONFUSION_MATRIXveML.ROC_CURVEsınıflandırma metrikleri.- Feature engineering
TRANSFORMclause ile SQL’de kalır. - Vertex AI registry/endpoint entegrasyonu ile production deployment.
- Hyperparameter tuning BQML’de built-in (
HPARAM_RANGE).