Utwórz model wykrywania oszustw w Cloud AI Platform za pomocą TensorFlow Enterprise i BigQuery

1. Omówienie

W tym module bezpośrednio pozyskasz zbiór danych BigQuery i wytrenujesz model wykrywania oszustw za pomocą TensorFlow Enterprise w Google Cloud AI Platform.

Czego się dowiesz

Poznasz takie zagadnienia jak:

  • Analizowanie danych w BigQuery
  • Pozyskiwanie danych przy użyciu oprogramowania sprzęgającego BigQuery w TensorFlow Enterprise
  • Utwórz model deep learning do wykrywania oszustw za pomocą niezrównoważonego zbioru danych

2. Analizowanie danych w BigQuery

Aby uruchomić to ćwiczenia z programowania, musisz mieć projekt Google Cloud Platform z włączonymi płatnościami. Aby utworzyć projekt, postępuj zgodnie z tymi instrukcjami.

Krok 1. Uzyskaj dostęp do publicznego zbioru danych BigQuery

Kliknij ten link, aby uzyskać dostęp do publicznych zbiorów danych BigQuery w konsoli Google Cloud.

W drzewie zasobów w lewym dolnym rogu zobaczysz listę zbiorów danych. Przejrzyj dostępne zbiory danych, aż znajdziesz zbiór ml-datasets, a następnie wybierz znajdującą się w nim tabelę ulb-fraud-detection:

d5e78261514a90ef.png

Klikaj poszczególne karty, by dowiedzieć się więcej o zbiorze danych:

  • Karta Schemat opisuje typy danych.
  • Na karcie Szczegóły podano,że jest to niezrównoważony zbiór danych zawierający 284 407 transakcji, z czego 492 to fałszywe transakcje.
  • Na karcie Podgląd zobaczysz rekordy ze zbioru danych.

Krok 2. Utwórz zapytanie do tabeli

Karta Szczegóły zawiera następujące informacje o danych:

  • Czas to liczba sekund między pierwszą transakcją w zbiorze danych a czasem wybranej transakcji.
  • V1–V28 to kolumny, które zostały przekształcone za pomocą techniki redukcji wymiarów zwanej PCA, w ramach której nastąpiła anonimizacja danych.
  • Kwota to kwota transakcji.

Aby wysłać zapytanie, kliknij Zapytanie do tabeli:

581e596426a98383.png

Dodaj do instrukcji znak *, aby wyświetlić wszystkie kolumny, a następnie kliknij Uruchom.

SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000

Krok 3. Przeanalizuj dane

BigQuery udostępnia wiele funkcji statystycznych. Zobaczmy, jak dane korelują ze zmienną docelową Class.

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`

e1e98a8315b62e9e.png

Korelacja będzie wskazywać zakres od -1 (skorelowana ujemnie) do 1 (skorelowana dodatnia), przy czym 0 oznacza niezależność.

V1 i V2 mają niewielki związek z naszą zmienną docelową (około -0,1 i 0,1 odpowiednio).

Nie widzimy zbyt dużego związku z czasem. Nieznacznie negatywna korelacja może wskazywać, że w danym zbiorze danych liczba fałszywych transakcji jest z czasem mniejsza.

Korelacja między wartością Kwota jest jeszcze mniejsza, co wskazuje, że istnieje większe prawdopodobieństwo, że wyższe kwoty transakcji liczą się w fałszywych transakcjach.

Krok 4. Oblicz średnie wartości na potrzeby skalowania cech

Normalizowanie wartości cech może pomóc w szybszym połączeniu sieci neuronowej. Typowym schematem jest wyśrodkowanie wartości w pobliżu 0 z odchyleniem standardowym o wartości 1. Następujące zapytanie pobierze wartości średnie. Zapisywanie wyniku nie jest wymagane, ponieważ później utworzymy do tego fragment kodu.

Zauważysz również, że zapytanie zawiera interesującą klauzulę WHERE. Omówimy to w następnej sekcji, gdy omówimy sposób dzielenia danych między zbiór treningowy i testowy.

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

Krok 5. Podziel dane

Powszechną praktyką jest używanie 3 zbiorów danych podczas tworzenia modelu systemów uczących się:

  • Trenowanie: używane do tworzenia modelu przez iteracyjne dostosowywanie parametrów.
  • Walidacja: służy do oceny, czy model jest nadmiarowy, na podstawie niezależnych danych podczas procesu trenowania.
  • Test: używany po utworzeniu modelu do oceny dokładności.

W tym ćwiczeniu w Codelabs użyjemy podziału 80/10/10 na trenowanie, weryfikację i testy.

Umieścimy każdy zbiór danych w osobnej tabeli w BigQuery. Pierwszym krokiem jest utworzenie „zbioru danych” BigQuery – kontener na powiązane tabele. Po wybraniu projektu kliknij Utwórz zbiór danych.

1084d9f5edbf760b.png

Następnie utwórz zbiór danych o nazwie tfe_codelab zawierający tabele trenowania, walidacji i testów.

e5b8646ebdf5f272.png

Teraz uruchomimy 3 zapytania dotyczące trenowania, testowania i walidacji, a następnie zapiszemy dane w nowym zbiorze danych tfe_codelab.

W Edytorze zapytań uruchom zapytanie, aby wygenerować dane treningowe:

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

Gdy zapytanie zostanie wykonane, zapisz wyniki w tabeli BigQuery.

49d20c9b4b62f6a7.png

W utworzonym właśnie zbiorze danych tfe_codelab nadaj tabeli nazwę ulb_fraud_detection_train i zapisz dane.

6d83cf113a0682e1.png

Klauzula WHERE dzieli dane przez obliczenie hasza na kilku kolumnach. Następnie wybiera wiersze, w których pozostała część hasza podzielona przez 10 wynosi poniżej 80, co daje 80%.

Powtórzmy teraz ten sam proces dla walidacji i zbiorów testowych z podobnymi zapytaniami, które zaznaczają po 10% danych.

Weryfikacja

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

Zapisz jego wyniki w tabeli ulb_fraud_detection_val.

Testuj

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

Zapisz jego wyniki w tabeli ulb_fraud_detection_test.

3. Skonfiguruj środowisko notatnika

Po krótkim omówieniu danych możemy teraz skonfigurować środowisko programistyczne modelu.

Krok 1. Włącz interfejsy API

Oprogramowanie sprzęgające BigQuery używa interfejsu BigQuery Storage API. Wyszukaj w konsoli interfejs BigQuery Storage API i włącz go, jeśli jest obecnie wyłączony.

9895a2fd3cdf8f8c.png

Krok 2. Utwórz instancję Notatników w AI Platform

Przejdź do sekcji Notatników AI Platform w konsoli Cloud i kliknij Nowa instancja. Następnie wybierz najnowszy typ instancji TensorFlow Enterprise 1.x bez GPU:

35301141e9fd3f44.png

Użyj opcji domyślnych i kliknij Utwórz. Po utworzeniu instancji wybierz Otwórz JupyterLab:

3b801f8ff3db0f2f.png

Następnie utwórz w JupyterLab notatnik w języku Python 3:

58523671a252b95a.png

4. Pozyskiwanie rekordów z BigQuery

Krok 1. Zaimportuj pakiety Pythona

W pierwszej komórce notatnika dodaj poniższe importy i uruchom komórkę. Aby go uruchomić, naciśnij przycisk ze strzałką w prawo w górnym menu lub naciśnij Command i Enter:

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()

Krok 2. Zdefiniuj stałe

Teraz zdefiniujmy kilka stałych do wykorzystania w projekcie. Zmień GCP_PROJECT_ID na rzeczywisty identyfikator projektu, którego używasz. Możesz uruchomić nowe komórki podczas ich tworzenia.

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]

Krok 3. Zdefiniuj funkcje pomocnicze

Zdefiniujmy teraz kilka funkcji. Funkcja read_session() odczytuje dane z tabeli BigQuery. extract_labels() to funkcja pomocnicza, która służy do oddzielania kolumny etykiet od pozostałych. Dzięki temu zbiór danych ma format oczekiwany później przez funkcję keras.model_fit().

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)

Krok 4. Przetwórz dane

Na koniec utworzymy każdy zbiór danych, a potem wydrukujemy pierwszy wsad ze zbioru danych treningowych. Pamiętaj, że mamy ustawioną wartość BATCH_SIZE o wartości 32. To ważny parametr, który wpływa na szybkość i dokładność trenowania.

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. Utwórz model

Krok 1. Wstępne przetwarzanie danych

Utwórzmy kolumny cech dla każdej cechy w zbiorze danych. W tym konkretnym zbiorze danych wszystkie kolumny są typu numeric_column, ale jest kilka innych typów kolumn (np. kolumna_kategoryczna).

Jak wspomnieliśmy wcześniej, ułożymy też dane tak, aby wyśrodkowane w okolicy zera, aby w sieci szybciej złączać się w sieci. Wstępnie obliczyliśmy średnie wartości każdej cechy do użycia w tych obliczeniach.

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

Krok 2. Utwórz model

Teraz możemy utworzyć model. Utworzone przed chwilą kolumny przekażemy do sieci. Potem skompilujemy model. Uwzględniamy wskaźnik AUC precyzji/czułości, który jest przydatny w przypadku niezrównoważonych zbiorów danych.

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')])

Krok 3. Wytrenuj model

Istnieje wiele metod postępowania z niezrównoważonymi danymi, w tym nadmierne próbkowanie (generowanie nowych danych w klasie mniejszości) i niedostateczne próbkowanie (zmniejszanie ilości danych w klasie większościowej).

Na potrzeby tego ćwiczenia z programowania posłużymy się techniką, która powstrzymuje stratę przy błędnej klasyfikacji klasy mniejszości. Podczas trenowania i wagi „1” określimy parametr class_weight (oszustwa) jest większa, ponieważ jest ona znacznie mniej powszechna.

W tym module zastosujemy 3 epoki (przebieg danych), co pozwoli przyspieszyć trenowanie. W rzeczywistych sytuacjach dokładność zestawu walidacji byłaby przerywana do tego momentu.

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)

Krok 4. Oceń model

Funkcję evaluate() można zastosować do danych testowych, których model nigdy nie miał dostępu do danych, aby zapewnić obiektywną ocenę. Na szczęście mamy tylko dane testowe.

model.evaluate(test_data)

Krok 5. Eksploracja

W tym module zademonstrowaliśmy, jak pozyskiwać duży zbiór danych z BigQuery bezpośrednio do modelu TensorFlow Keras. Zapoznaliśmy się też ze wszystkimi etapami tworzenia modelu. Na koniec dowiedzieliśmy się, jak radzić sobie z niezrównoważoną klasyfikacją.

Wypróbuj różne architektury i podejścia do niezrównoważonego zbioru danych, aby sprawdzić, czy uda się zwiększyć dokładność.

6. Czyszczenie

Jeśli chcesz nadal korzystać z tego notatnika, zalecamy wyłączenie go, gdy nie jest używany. W interfejsie notatników w konsoli Cloud wybierz notatnik, a następnie kliknij Zatrzymaj:

57213ef2edad9257.png

Jeśli chcesz usunąć wszystkie zasoby utworzone w tym module, po prostu usuń instancję notatnika, zamiast ją zatrzymywać.

Za pomocą menu nawigacyjnego w konsoli Cloud przejdź do Cloud Storage i usuń oba zasobniki utworzone w celu przechowywania zasobów modelu.