1. Giriş
Bu laboratuvarda, son işlemlerin sahte olup olmadığını BigQuery'de SQL kullanarak tahmin etmek için doğrusal bir regresyon modeli oluşturacaksınız. Her kart işlemini ve sahtekarlığı en iyi şekilde belirttiğimiz bazı özellikleri (ör. müşterinin evine uzaklık, günün saati ve işlem tutarı) içeren bir eğitim veri kümesi oluşturursunuz.
Ardından, eğitim verilerimize dayanarak bir işlemin sahte olup olmadığını tahmin etmek amacıyla mantıksal bir regresyon modeli oluşturmak için BQML'yi kullanıyorsunuz. BQ ML'nin güzel özelliklerinden biri, aşırı uyum sağlama becerisi. Böylece eğitim verilerimiz, modelin yeni verilerdeki performansını etkilemeyecek. Son olarak, farklı özelliklere sahip üç örnek işlem oluşturur ve bunların sahte olup olmadığını ve modeli kullanıp kullanmadığını tahmin edersiniz.
Öğrenecekleriniz
Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:
- Bir Google Cloud Storage paketinden veri kümesi yükleme
- Eğitim verileri oluşturma
- Mantıksal regresyon modeli oluşturma ve eğitme
- Örnek işlemlerin sahte olup olmadığını tahmin etmek için modeli kullanma
- Jeo-uzamsal analizden yararlanarak sahtekarlık işlemlerini posta koduna göre tanımlama
2. Bir GCS paketinden veri kümesi yükleme
Bu görevde bq_demo adında bir veri kümesi oluşturup bu veri kümesini bir GCS paketindeki perakende bankacılık verileriyle yükleyeceksiniz. Tablolarınızda bulunan tüm mevcut veriler silinir.
Cloud Shell'i aç
- Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell'i Etkinleştir düğmesini tıklayın.

- Cloud Shell yüklendikten sonra şunu yazın:
bq rm -r -f -d bq_demo
bq rm -r -f -d bq_demo_shared
bq mk --dataset bq_demo
bq load --replace --autodetect --source_format=CSV bq_demo.account gs://retail-banking-looker/account
bq load --replace --autodetect --source_format=CSV bq_demo.base_card gs://retail-banking-looker/base_card
bq load --replace --autodetect --source_format=CSV bq_demo.card gs://retail-banking-looker/card
bq load --replace --autodetect --source_format=CSV bq_demo.card_payment_amounts gs://retail-banking-looker/card_payment_amounts
bq load --replace --autodetect --source_format=CSV bq_demo.card_transactions gs://retail-banking-looker/card_transactions
bq load --replace --autodetect --source_format=CSV bq_demo.card_type_facts gs://retail-banking-looker/card_type_facts
bq load --replace --autodetect --source_format=CSV bq_demo.client gs://retail-banking-looker/client
bq load --replace --autodetect --source_format=CSV bq_demo.disp gs://retail-banking-looker/disp
bq load --replace --autodetect --source_format=CSV bq_demo.loan gs://retail-banking-looker/loan
bq load --replace --autodetect --source_format=CSV bq_demo.order gs://retail-banking-looker/order
bq load --replace --autodetect --source_format=CSV bq_demo.trans gs://retail-banking-looker/trans
- İşlem tamamlandığında Cloud Shell terminalini kapatmak için X işaretini tıklayın. Google Cloud Storage paketinden başarıyla veri kümesi yüklediniz.
3. Eğitim verileri oluşturma
Kart türü başına sahte işlemlere yönelik sorgu
Eğitim verilerini oluşturmadan önce, sahte işlemlerin kart türleri arasında nasıl dağıtıldığını analiz edelim. Bireysel bankacılık veritabanımızda, müşterinin hesabında sahte işlem olduğunu bildiren bir işaret bulunur. Bu sorgu, sahte işlemlerin sayısını kart türüne göre gösterir.
[Rekabetçi Konuşma Noktası: Belirli rakiplerin aksine BigQuery, veri ambarınızdaki verileri bir depolama paketine aktarmanızı, makine öğrenimi algoritmaları çalıştırmanızı, ardından sonuçları tekrar veritabanına kopyalamanızı gerektirmez. Tüm bunlar, veri güvenliğini koruyarak ve "verilerin yayılmasına" yol açmayan yöntemlerle gerçekleştirilebilir.]
- BigQuery Konsolunu açın:
Google Cloud Console'da, Gezinme menüsü > BigQuery'ye gidin.

- Cloud Console'da BigQuery'ye Hoş Geldiniz mesaj kutusu açılır. Bu mesaj kutusunda, hızlı başlangıç kılavuzunun bağlantısı ve sürüm notları bulunur.
Bitti'yi tıklayın.
BigQuery konsolu açılır.

- Sorguyu Sorgu Düzenleyici'de çalıştırın:
SELECT c.type, count(trans_id) as fraud_transactions
FROM bq_demo.card_transactions AS t
JOIN bq_demo.card c ON t.cc_number = c.card_number
WHERE t.is_fraud=1
GROUP BY type
Peki, bu verileri müşteri fark etmeden bile sahtekarlık içeren işlemleri tahmin etmek için kullanabilseydik ne olurdu? Makine öğrenimi yalnızca uzmanlara yönelik değildir. Analistler BigQuery sayesinde SQL aracılığıyla doğrudan veri ambarı verileri üzerinde birinci sınıf makine öğrenimi modelleri çalıştırabilir.
Eğitim verileri oluşturma
Her kart işlemini ve sahtekarlığı en iyi şekilde belirttiğimiz bazı özellikleri (ör. müşterinin evine uzaklık, günün saati ve işlem tutarı) içeren bir eğitim veri kümesi oluşturun.
Sorguyu Sorgu Düzenleyici'de çalıştırın:
CREATE OR REPLACE TABLE bq_demo.training_data as (
SELECT
card_transactions.trans_id AS trans_id,
card_transactions.is_fraud AS is_fraud,
--amount for transaction: higher amounts are more likely to be fraud
cast(card_transactions.amount as FLOAT64) AS card_transactions_amount,
--distance from the customers home: further distances are more likely to be fraud
ST_DISTANCE((ST_GEOGPOINT((cast(card_transactions.merchant_lon as FLOAT64)),
(cast(card_transactions.merchant_lat as FLOAT64)))), (ST_GeogPoint((cast(SPLIT(client.address,'|')[OFFSET(4)] as float64)),
(cast(SPLIT(client.address,'|')[OFFSET(3)] as float64))))) AS card_transactions_transaction_distance,
--hour that transaction occured: fraud occurs in middle of night (usually between midnight and 4 am)
EXTRACT(HOUR FROM TIMESTAMP(CONCAT(card_transactions.trans_date,' ',card_transactions.trans_time)) ) AS card_transactions_transaction_hour_of_day
FROM bq_demo.card_transactions AS card_transactions
LEFT JOIN bq_demo.card AS card ON card.card_number = card_transactions.cc_number
LEFT JOIN bq_demo.disp AS disp ON card.disp_id = disp.disp_id
LEFT JOIN bq_demo.client AS client ON disp.client_id = client.client_id );
"Sonuçlar" bölümünde "Tabloya git"i tıklayın. Aşağıdaki sonucu göreceksiniz:

4. Model oluşturma ve eğitme
Bir önceki adımda oluşturulan eğitim verilerimize dayanarak bir işlemin sahte olup olmadığını tahmin etmek amacıyla mantıksal bir regresyon modeli oluşturmak için BQML'yi kullanın. BQML'nin güzel özelliklerinden biri, aşırı uyum sağlamaya çalışması, böylece eğitim verilerimizin modelin yeni verilerdeki performansını etkilememesidir.
Sorguyu Sorgu Düzenleyici'de çalıştırın:
CREATE OR REPLACE MODEL bq_demo.fraud_prediction
OPTIONS(model_type='logistic_reg', labels=['is_fraud']) AS
SELECT * EXCEPT(trans_id)
FROM bq_demo.training_data
WHERE (is_fraud = 1) OR
(is_fraud = 0 AND rand() <=
(SELECT SUM(is_fraud)/COUNT(*) FROM bq_demo.training_data));
Model ayrıntılarını göster
"Sonuçlar" bölümünde "Modele Git"i tıklayın.

Schema, Training ve Evaluation (Şema, Eğitim ve Değerlendirme) sekmelerini görürsünüz.
"Eğitim sekmesi" altında şu ekranı göreceksiniz:

"Değerlendirme sekmesi" altında şunu görürsünüz:

"Şema sekmesi" altında şu gösterilir:

5. Sahtekarlığı tahmin etmek için modeli kullanma
Şimdi bir işlemin sahte olup olmadığını tahmin etmek için modelimizi kullanalım. Farklı özelliklere sahip 3 örnek işlem oluşturacağız.
Sorgu düzenleyicide şu sorguyu çalıştırın:
SELECT * FROM ML.PREDICT(MODEL bq_demo.fraud_prediction, (
SELECT '001' as trans_id, 500.00 as card_transactions_amount, 600 as card_transactions_transaction_distance, 2 as card_transactions_transaction_hour_of_day
UNION ALL
SELECT '002' as trans_id, 5.25 as card_transactions_amount, 2 as card_transactions_transaction_distance, 13 as card_transactions_transaction_hour_of_day
UNION ALL
SELECT '003' as trans_id, 175.50 as card_transactions_amount, 45 as card_transactions_transaction_distance, 10 as card_transactions_transaction_hour_of_day
), STRUCT(0.55 AS threshold)
);
Aşağıdakine benzer sonuçlar görmeniz gerekir:

Gördüğünüz gibi, modelimize göre ilk işlemin sahte olması neredeyse kesindir. 2. ve 3. işlemlerin sahte olmadığı tahmin edilir. Eşiği, varsayılan %50 olan %55 olarak ayarladık. Modelimizi ek verilerle eğitebilir veya doğruluğu artırmak için başka özellikler ekleyebiliriz.
6. Jeo-uzamsal analizden yararlanarak sahtekarlık işlemlerini posta koduna göre tanımlama
BigQuery, coğrafi veriler için zengin destek sunar. Aşağıda, posta kodu sınırlarına ait herkese açık bir veri kümesi kullanılarak satıcı işlemlerinin enlem ve boylamlarına göre belirlenen posta kodunu belirlemek için ST_WITHIN Coğrafi Bilgi Sistemi işlevinin kullanıldığı bir örnek verilmiştir.
Sorgu Düzenleyici'de aşağıdaki kodu çalıştırın:
WITH trans_by_zip as (
SELECT
card_transactions.trans_id,
zip_code AS merchant_zip,
city as merchant_city,
county as merchant_county,
state_name as merchant_state
FROM
bq_demo.card_transactions AS card_transactions,
bigquery-public-data.geo_us_boundaries.zip_codes AS zip_codes
WHERE ST_Within(ST_GEOGPOINT((cast(card_transactions.merchant_lon as FLOAT64)),(cast(card_transactions.merchant_lat as FLOAT64))),zip_codes.zip_code_geom)
)
SELECT merchant_zip, 1.0 * (SUM(is_fraud)) / nullif((COUNT(*)),0) AS percent_transactions_fraud
FROM bq_demo.card_transactions t, trans_by_zip
WHERE t.trans_id = trans_by_zip.trans_id
GROUP BY merchant_zip
ORDER BY percent_transactions_fraud DESC;
Aşağıdaki sonuçları göreceksiniz:

Gördüğünüz gibi, çoğu posta kodundaki sahtekarlık oranı nispeten düşük (%2'nin altında) ancak 69345'teki sahtekarlık oranı şaşırtıcı bir %11'dir. Bu, büyük olasılıkla araştırmamız gereken bir konudur.