Perakende bankacılığı veri kümesi Codelab için sahtekarlık tahmini ve coğrafi analiz

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ç

  1. Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell'i Etkinleştir düğmesini tıklayın.

3c0c949fe3626208.png

  1. 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
  1. İş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.]

  1. BigQuery Konsolunu açın:

Google Cloud Console'da, Gezinme menüsü > BigQuery'ye gidin.

dfdbd753a900e349.png

  1. 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.

2982953ee582e477.png

  1. 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:

c03442924d2dc7f3.png

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.

9417986e0fa45427.png

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:

cb6b11a01816ba74.png

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

ff47d42700a79544.png

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

edfd13025ed64705.png

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:

c3c25d3652e45c9c.png

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:

6f0dfb6d93c0be11.png

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.