1. Genel Bakış
Bu laboratuvarda, doğrudan bir BigQuery veri kümesini alıp Google Cloud AI Platform'da TensorFlow Enterprise ile sahtekarlık algılama modelini eğiteceksiniz.
Öğrendikleriniz
Öğrenecekleriniz:
- BigQuery'de verileri analiz etme
- TensorFlow Enterprise'da BigQuery bağlayıcısını kullanarak verileri alma
- Dengesiz bir veri kümesiyle sahtekarlığı tespit etmek için derin öğrenme modeli oluşturma
2. BigQuery'deki verileri analiz etme
Bu codelab'i çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projesine ihtiyacınız var. Proje oluşturmak için buradaki talimatları uygulayın.
1. Adım: BigQuery herkese açık veri kümesine erişin
Google Cloud Console'da herkese açık BigQuery veri kümelerine erişmek için bu bağlantıyı kullanın.
Sol alt köşedeki Kaynaklar Ağacı'nda bir veri kümesi listesi görürsünüz. Mevcut veri kümelerinde ml-Veri kümeleri'ni bulana kadar gezinin, ardından içindeki ulb-fraud-detection tablosunu seçin:
Veri kümesi hakkında daha fazla bilgi edinmek için sekmeleri tıklayın:
- Şema sekmesinde veri türleri açıklanmaktadır.
- Ayrıntılar sekmesinde bunun 492'si sahte olan 284.407 işlem içeren dengesiz bir veri kümesi olduğu açıklanmaktadır.
- Önizleme sekmesi, veri kümesindeki kayıtları gösterir.
2. Adım: Tabloyu sorgulayın
Ayrıntılar sekmesi bize verilerle ilgili bilgi verir:
- Süre, veri kümesindeki ilk işlem ile seçilen işlemin zamanı arasındaki saniye sayısıdır.
- V1-V28, verileri anonimleştiren PCA adlı bir boyut azaltma tekniği kullanılarak dönüştürülmüş sütunlardır.
- Tutar, işlem tutarıdır.
Bir sorgu çalıştırmak için Sorgu Tablosu'nu tıklayarak daha yakından inceleyelim:
Tüm sütunları görüntülemek için ifadeyi * ekleyerek güncelleyin ve Çalıştır'ı tıklayın.
SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000
3. Adım: Verileri analiz edin
BigQuery bir dizi istatistiksel işlev sağlar. Verilerin, Sınıf hedef değişkeniyle nasıl ilişkilendirildiğine göz atalım.
SELECT CORR(Time,Class) as TimeCorr, CORR(V1,Class) as V1Corr, CORR(V2,Class) as V2Corr, CORR(Amount,Class) as AmountCorr FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
Korelasyon, -1 (negatif korelasyon) ile 1 (pozitif korelasyon) aralığında bir değer sağlar. 0 bağımsızdır.
V1 ve V2'nin, hedef değişkenimizle (sırasıyla -0,1 ve 0,1 civarında) küçük bir ilişkisi olduğunu unutmayın.
Zaman ile pek büyük bir bağıntı yok. Küçük bir negatif korelasyon, veri kümesinde zaman içinde daha az sahtekarlık içeren işlem olduğunu gösterebilir.
Tutar daha da düşük bir korelasyona sahiptir. Bu, sahte işlemlerin daha yüksek işlem tutarlarında gerçekleşme olasılığının çok daha yüksek olduğunu gösterir.
4. Adım: Özellik ölçeklendirme için ortalama değerleri hesaplayın
Özellik değerlerini normalleştirmek, bir sinir ağının daha hızlı yakınlaşmasına yardımcı olabilir. Yaygın bir şema, değerleri 1 standart sapması ile 0 civarında ortalamaktır. Aşağıdaki sorgu, ortalama değerleri getirir. Daha sonra kod snippet'i sunacağımızdan, sonucu kaydetmenize gerek yoktur.
Ayrıca, sorgunun ilginç bir WHERE ifadesi içerdiğini de fark edeceksiniz. Bir sonraki bölümde, verilerin eğitim ve test kümeleri arasında nasıl bölüneceğini ele aldığımızda bunu açıklayacağız.
SELECT
AVG(Time), AVG(V1), AVG(V2), AVG(V3), AVG(V4), AVG(V5), AVG(V6), AVG(V7), AVG(V8),
AVG(V9), AVG(V10),AVG(V11), AVG(V12), AVG(V13), AVG(V14), AVG(V15), AVG(V16),
AVG(V17), AVG(V18), AVG(V19), AVG(V20), AVG(V21), AVG(V22), AVG(V23), AVG(V24),
AVG(V25), AVG(V26), AVG(V27),AVG(V28), AVG(Amount)
FROM
`bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE
MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),
SAFE_CAST(Amount AS STRING)))),10) < 8
5. Adım: Verileri bölme
Makine öğrenimi modeli oluştururken 3 veri kümesi kullanılması yaygın bir uygulamadır:
- Eğitim: Parametreleri yinelemeli olarak ayarlayarak modeli oluşturmak için kullanılır
- Doğrulama: Eğitim sürecinde bağımsız veriler üzerinde doğrulama gerçekleştirerek modelin fazla uyumlu olup olmadığını değerlendirmek için kullanılır
- Test: Doğruluğu değerlendirmek için model oluşturulduktan sonra kullanılır
Bu codelab'de 80/10/10 tren/doğrulama/test grubunu kullanacağız.
Her bir veri kümesini BigQuery'de kendi tablosuna koyacağız. İlk adım, bir BigQuery "veri kümesi" oluşturmaktır , alakalı tabloların kapsayıcısıdır. Projeniz seçiliyken Veri Kümesi Oluştur'u seçin.
Ardından eğitim, doğrulama ve test tablolarını içerecek tfe_codelab adında bir veri kümesi oluşturun.
Şimdi eğitim, test ve doğrulama için 3 sorgu çalıştıracak ve verileri yeni tfe_codelab veri kümesine kaydedeceğiz.
Sorgu düzenleyicide, eğitim verilerini oluşturmak için bir sorgu çalıştırın:
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) < 8
Sorgu tamamlandığında sonuçları bir BigQuery tablosuna kaydedin.
Yeni oluşturduğunuz tfe_codelab veri kümesinde tabloyu ulb_fraud_detection_train olarak adlandırın ve verileri kaydedin.
WHERE yan tümcesi, ilk olarak birkaç sütuna bir karma değeri hesaplayarak verileri böler. Ardından, karmanın 10'a bölünmesiyle elde edilen sayının 80'in altında olduğu satırları seçer. Bu durumda, %80 elde edilir.
Şimdi, doğrulama ve test kümeleri için her birinde verilerin% 10'unu seçen benzer sorgularla aynı işlemi tekrarlayalım.
Doğrulama
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 8
Bu sorgunun sonuçlarını ulb_fraud_detection_val adlı bir tabloya kaydedin.
Test etme
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 9
Bu sorgunun sonuçlarını ulb_fraud_detection_test adlı bir tabloya kaydedin.
3. Not Defteri ortamınızı ayarlama
Verilere kısa bir giriş yaptığımıza göre şimdi model geliştirme ortamımızı oluşturalım.
1. Adım: API'leri etkinleştirin
BigQuery bağlayıcısı BigQuery Storage API'yi kullanır. Konsolda BigQuery Storage API'yi arayın ve devre dışıysa API'yi etkinleştirin.
2. Adım: AI Platform Notebooks örneği oluşturun
Cloud Console'un AI Platform Notebooks bölümüne gidin ve New Instance'ı (Yeni Örnek) tıklayın. Ardından, GPU'suz en son TensorFlow Enterprise 1.x örnek türünü seçin:
Varsayılan seçenekleri kullanın ve ardından Oluştur'u tıklayın. Örnek oluşturulduktan sonra JupyterLab'i aç'ı seçin:
Ardından, JupyterLab'den bir Python 3 not defteri oluşturun:
4. BigQuery'den kayıtları alma
1. Adım: Python paketlerini içe aktarın
Not defterinizin ilk hücresine aşağıdaki içe aktarma işlemlerini ekleyin ve hücreyi çalıştırın. Üst menüde sağ ok tuşuna veya Command-Enter tuşuna basarak çalıştırabilirsiniz:
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
from tensorflow_io.bigquery import BigQueryClient
import functools
tf.enable_eager_execution()
2. adım: Sabit değerleri tanımlayın
Şimdi, projede kullanılacak bazı sabit değerler tanımlayalım. GCP_PROJECT_ID'yi kullandığınız gerçek proje kimliğiyle değiştirin. Devam edin ve yeni hücreleri oluştururken çalıştırın.
GCP_PROJECT_ID = '<YOUR_PROJECT_ID>'
DATASET_GCP_PROJECT_ID = GCP_PROJECT_ID # A copy of the data is saved in the user project
DATASET_ID = 'tfe_codelab'
TRAIN_TABLE_ID = 'ulb_fraud_detection_train'
VAL_TABLE_ID = 'ulb_fraud_detection_val'
TEST_TABLE_ID = 'ulb_fraud_detection_test'
FEATURES = ['Time','V1','V2','V3','V4','V5','V6','V7','V8','V9','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','Amount']
LABEL='Class'
DTYPES=[tf.float64] * len(FEATURES) + [tf.int64]
3. adım: Yardımcı işlevleri tanımlayın
Şimdi birkaç fonksiyon tanımlayalım. read_session(), BigQuery tablosundaki verileri okur. extract_labels(), etiket sütununu diğerlerinden ayıran yardımcı bir işlevdir. Böylece, veri kümesi daha sonra keras.model_fit() tarafından beklenen biçimde olur.
client = BigQueryClient()
def read_session(TABLE_ID):
return client.read_session(
"projects/" + GCP_PROJECT_ID, DATASET_GCP_PROJECT_ID, TABLE_ID, DATASET_ID,
FEATURES + [LABEL], DTYPES, requested_streams=2
)
def extract_labels(input_dict):
features = dict(input_dict)
label = tf.cast(features.pop(LABEL), tf.float64)
return (features, label)
4. Adım: Verileri kullanın
Son olarak her bir veri kümesini oluşturalım ve eğitim veri kümesindeki ilk grubu yazdıralım. 32 adet BATCH_SIZE olarak tanımladığımızı unutmayın. Bu, eğitimin hızını ve doğruluğunu etkileyen önemli bir parametredir.
BATCH_SIZE = 32
raw_train_data = read_session(TRAIN_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_val_data = read_session(VAL_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_test_data = read_session(TEST_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
next(iter(raw_train_data)) # Print first batch
5. Derleme modeli
1. Adım: Verileri ön işleme
Şimdi, veri kümesindeki her bir özellik için özellik sütunu oluşturalım. Bu özel veri kümesinde, tüm sütunlar sayısal_sütun türündedir ancak başka birkaç sütun türü de (ör. kategorik_sütun) vardır.
Daha önce de belirttiğimiz gibi, ağın daha hızlı bir şekilde yakınlaşabilmesi için verileri sıfır merkezde olacak şekilde norm haline getireceğiz. Bu hesaplamada kullanılacak her özelliğin ortalamalarını önceden hesapladık.
MEANS = [94816.7387536405, 0.0011219465482001268, -0.0021445914636999603, -0.002317402958335562,
-0.002525792169927835, -0.002136576923287782, -3.7586818983702984, 8.135919975738768E-4,
-0.0015535579268265718, 0.001436137140461279, -0.0012193712736681508, -4.5364970422902533E-4,
-4.6175444671576083E-4, 9.92177789685366E-4, 0.002366229151475428, 6.710217226762278E-4,
0.0010325807119864225, 2.557260815835395E-4, -2.0804190062322664E-4, -5.057391100818653E-4,
-3.452114767842334E-6, 1.0145936326270006E-4, 3.839214074518535E-4, 2.2061197469126577E-4,
-1.5601580596677608E-4, -8.235017846415852E-4, -7.298316615408554E-4, -6.898459943652376E-5,
4.724125688297753E-5, 88.73235686453587]
def norm_data(mean, data):
data = tf.cast(data, tf.float32) * 1/(2*mean)
return tf.reshape(data, [-1, 1])
numeric_columns = []
for i, feature in enumerate(FEATURES):
num_col = tf.feature_column.numeric_column(feature, normalizer_fn=functools.partial(norm_data, MEANS[i]))
numeric_columns.append(num_col)
numeric_columns
2. Adım: Modeli oluşturun
Şimdi bir model oluşturmaya hazırız. Az önce oluşturduğumuz sütunları ağa aktaracağız. Ardından modeli derleriz. Dengesiz veri kümeleri için kullanışlı olan Hassasiyet/Geri Çağırma AUC metriğini ekledik.
model = keras.Sequential([
tf.keras.layers.DenseFeatures(numeric_columns),
layers.Dense(64, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy', tf.keras.metrics.AUC(curve='PR')])
3. Adım: Modeli eğitin
Dengesiz verileri işlemek için aşırı örnekleme (azınlık sınıfında yeni veriler oluşturma) ve yetersiz örnekleme (çoğunluk sınıfta verileri azaltma) gibi çeşitli teknikler bulunur.
Bu codelab'in amacı doğrultusunda, azınlık sınıfını yanlış sınıflandırırken kayıplara fazla ağırlık verecek bir teknik kullanalım. Eğitim ve ağırlık "1" sırasında bir class_weight parametresi belirtiriz (sahtekarlık) daha yüksek olabilir.
Eğitimin daha hızlı olması için bu laboratuvarda 3 dönem (veriler üzerinden geçişler) kullanacağız. Gerçek dünyayı yansıtan bir senaryoda, doğrulamayı, doğrulama kümesinin doğruluğunda artık görmenin artacağı noktaya kadar çalıştırmak isteriz.
CLASS_WEIGHT = {
0: 1,
1: 100
}
EPOCHS = 3
train_data = raw_train_data.shuffle(10000)
val_data = raw_val_data
test_data = raw_test_data
model.fit(train_data, validation_data=val_data, class_weight=CLASS_WEIGHT, epochs=EPOCHS)
4. Adım: Modeli değerlendirin
Değerlendirme işlevi, modelin daha önce hiç görmediği verileri test ederek objektif bir değerlendirme sağlayabilir. Neyse ki, test verilerini bunun için kenara ayırdık.
model.evaluate(test_data)
5. adım: Keşif
Bu laboratuvarda, büyük bir veri kümesinin BigQuery'den doğrudan TensorFlow Keras modeline nasıl aktarılacağını gösterdik. Ayrıca bir model oluşturmanın tüm adımlarını ele aldık. Son olarak, dengesiz sınıflandırma problemlerinin nasıl ele alınacağı hakkında biraz bilgi edindik.
Doğruluğu artırıp artıramayacağınızı görmek için dengesiz veri kümesiyle ilgili farklı mimarileri ve yaklaşımları denemeye devam edebilirsiniz.
6. Temizleme
Bu not defterini kullanmaya devam etmek istiyorsanız, kullanılmadığında devre dışı bırakmanız önerilir. Cloud Console'daki Not Defteri kullanıcı arayüzünden not defterini ve ardından Durdur'u seçin:
Bu laboratuvarda oluşturduğunuz tüm kaynakları silmek istiyorsanız not defteri örneğini durdurmak yerine silin.
Cloud Console'daki gezinme menüsünü kullanarak Storage'a gidin ve model öğelerinizi depolamak için oluşturduğunuz her iki paketi de silin.