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

Kütüphanede Robot Asistan

Şimdiye kadar BigQuery’ye “şu kadar yolculuk var mı”, “ortalama ne kadar” gibi sayım ve ortalama soruları sorduk. Peki ya “yarın kaç taksi yolculuğu olacak, yağmur yağarsa kaç tane artar?” gibi tahmin soruları sorsak? Normal SQL bunu yapamaz — bunun için makine öğrenmesi (ML) lazım.

Ama ML demek “Python kur, pandas, scikit-learn, veri indir, eğit, geri yükle” demek. BigQuery ML (BQML) diyor ki: “Veri zaten burada, SQL biliyorsun — ML modelini de SQL ile kur, eğit, kullan.” Veri kütüphaneden dışarı çıkmıyor, kütüphanenin içindeki robot onu okuyup öğreniyor.

CREATE MODEL: Sihirli Söz

BigQuery ML’de bir model oluşturmak tek bir SQL komutu:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_model`
OPTIONS(
  model_type = 'linear_reg',   -- doğrusal regresyon
  input_label_cols = ['total_amount']
) AS
SELECT
  trip_distance,
  passenger_count,
  pickup_datetime,
  total_amount
FROM `bigquery-public-data.new_york_taxi.taxi_trips`
WHERE total_amount > 0
  AND pickup_datetime BETWEEN '2024-01-01' AND '2024-12-31';

Bu komutu çalıştırdığında BigQuery arka planda:

  1. Veriyi hazırlar: total_amount etiket (label), diğerleri özellik (feature).
  2. Model eğitir: doğrusal bir denklem bulur, örneğin toplam = 2.5 * mesafe + 5 * yolcu_sayısı + 0.001 * saat.
  3. Modeli kaydeder: my_dataset.taxi_price_model adıyla bir “model objesi” oluşturur — tıpkı bir tablo gibi sorgulayabilirsin.

Birkaç dakika sürer. Şimdi bu modeli kullanarak tahmin yap:

SELECT
  trip_distance,
  passenger_count,
  predicted_total_amount
FROM ML.PREDICT(
  MODEL `my_dataset.taxi_price_model`,
  (SELECT 5.0 AS trip_distance, 2 AS passenger_count, CURRENT_TIMESTAMP() AS pickup_datetime)
);

Sonuç: “5 km, 2 yolcu için beklenen tutar ~17.5$”. Bu kadar.

Hangi Model Türü?

BigQuery ML birçok model sunar. En yaygın 3’ü:

ModelNe ZamanKullanım
linear_regBasit düz çizgi ilişkisiFiyat = mesafe × k
random_forest (veya boosted_tree)Karmaşık ilişkilerMesafe + saat + hava durumu + bölge → fiyat
logistic_regSınıflandırma (evet/hayır)Yağmur yağacak mı? Müşteri iptal eder mi?

Daha güçlü model istersen sadece model_type değiştir:

CREATE OR REPLACE MODEL `my_dataset.taxi_price_forest`
OPTIONS(
  model_type = 'random_forest_regressor',
  num_parallel_tree = 100,    -- 100 ağaç büyüt
  input_label_cols = ['total_amount']
) AS
SELECT
  trip_distance,
  passenger_count,
  EXTRACT(HOUR FROM pickup_datetime) AS saat,
  total_amount
FROM `bigquery-public-data.new_york_taxi.taxi_trips`
WHERE total_amount > 0;

Aynı veri, 100 karar ağacı birleşimi olan random forest ile eğitildi. Doğrusal modele göre daha doğru tahmin yapar ama eğitim süresi 2-3 kat uzar.

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

Bir gün “yolculuk 20$ üstünde mi” sorusu sormak istersen (evet/hayır), logistic regression kullan:

CREATE OR REPLACE MODEL `my_dataset.taxi_is_expensive`
OPTIONS(
  model_type = 'logistic_reg',
  input_label_cols = ['is_expensive']
) AS
SELECT
  trip_distance,
  passenger_count,
  EXTRACT(HOUR FROM pickup_datetime) AS saat,
  total_amount > 20 AS is_expensive
FROM `bigquery-public-data.new_york_taxi.taxi_trips`
WHERE total_amount > 0;

Model eğitildikten sonra tahmin olasılığını bile görebilirsin:

SELECT
  predicted_is_expensive,
  predicted_is_expensive_probs[OFFSET(0)].prob AS evet_olasiligi
FROM ML.PREDICT(
  MODEL `my_dataset.taxi_is_expensive`,
  (SELECT 8.0 AS trip_distance, 3 AS passenger_count, 18 AS saat)
);

evet_olasiligi ne kadar 1’e yakınsa, model “evet, 20$ üstü olur” diyor.

Modelin Ne Kadar İyi Olduğunu Nasıl Anlarsın?

ML.EVALUATE sihirli komutu:

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

linear_reg için r2_score ve mean_squared_error döner. r2_score ne kadar 1’e yakınsa o kadar iyi (0.7 üstü genelde iyidir). logistic_reg için accuracy ve roc_auc döner. Eğer sonuç kötüyse, daha çok veri ekle ya da farklı sütunları özellik olarak kullan.

Ne Öğrendik?

  • BigQuery ML ile veri dışarı çıkmadan SQL içinde model eğitebilirsin.
  • CREATE MODEL ... AS SELECT ... tek komutla eğitim.
  • ML.PREDICT ile tahmin, ML.EVALUATE ile başarı ölçümü.
  • Üç ana tür: linear_reg (basit tahmin), random_forest (karmaşık), logistic_reg (sınıflandırma).
  • ML öğrenmek için artık Python uzmanı olmak gerekmez — SQL yeterli.

Sıradaki

Modül 4: dbt ile tarif defteri yazma →