Создайте модель обнаружения мошенничества на облачной платформе искусственного интеллекта с помощью TensorFlow Enterprise и BigQuery.

1. Обзор

В этой лабораторной работе вы напрямую загрузите набор данных BigQuery и обучите модель обнаружения мошенничества с помощью TensorFlow Enterprise на платформе Google Cloud AI Platform .

Чему вы научитесь

Вы научитесь:

  • Анализ данных в BigQuery
  • Загрузка данных с помощью коннектора BigQuery в TensorFlow Enterprise.
  • Создайте модель глубокого обучения для обнаружения мошенничества на несбалансированном наборе данных.

2. Проанализируйте данные в BigQuery.

Для выполнения этого практического задания вам потребуется проект Google Cloud Platform с включенной функцией оплаты. Чтобы создать проект, следуйте инструкциям здесь .

Шаг 1: Получите доступ к общедоступному набору данных BigQuery.

Перейдите по этой ссылке , чтобы получить доступ к общедоступным наборам данных BigQuery в консоли Google Cloud.

В дереве ресурсов в левом нижнем углу вы увидите список наборов данных. Просмотрите доступные наборы данных, пока не найдете ml-datasets , а затем выберите в нем таблицу ulb-fraud-detection :

d5e78261514a90ef.png

Нажмите на каждую вкладку, чтобы узнать больше о наборе данных:

  • На вкладке «Схема» описаны типы данных.
  • На вкладке «Подробности» поясняется, что это несбалансированный набор данных, содержащий 284 407 транзакций, из которых 492 являются мошенническими.
  • На вкладке «Предварительный просмотр» отображаются записи из набора данных.

Шаг 2: Выполните запрос к таблице.

Вкладка «Подробности» предоставляет нам следующую информацию о данных:

  • Время — это количество секунд между первой транзакцией в наборе данных и временем выбранной транзакции.
  • V1-V28 — это столбцы, преобразованные с помощью метода уменьшения размерности, называемого PCA , который анонимизировал данные.
  • Сумма — это сумма транзакции.

Давайте рассмотрим подробнее, нажав кнопку «Запрос к таблице» , чтобы выполнить запрос:

581e596426a98383.png

Обновите оператор, добавив звездочку (*) для отображения всех столбцов, и нажмите «Выполнить» .

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

Шаг 3: Анализ данных

BigQuery предоставляет ряд статистических функций . Давайте посмотрим, как данные коррелируют с целевой переменной «Класс» .

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

Коэффициент корреляции будет варьироваться от -1 (отрицательная корреляция) до 1 (положительная корреляция), при этом 0 означает независимость.

Обратите внимание, что V1 и V2 имеют слабую корреляцию с нашей целевой переменной (примерно -0,1 и 0,1 соответственно).

Мы не видим сильной корреляции со временем . Незначительная отрицательная корреляция может указывать на то, что со временем в наборе данных стало меньше мошеннических транзакций.

Корреляция с суммой еще ниже, что указывает на то, что мошеннические транзакции незначительно чаще совершаются при больших суммах.

Шаг 4: Вычислите средние значения масштабирования признаков.

Нормализация значений признаков может помочь нейронной сети быстрее сойтись. Распространенная схема — центрирование значений вокруг 0 ​​со стандартным отклонением 1. Следующий запрос получит средние значения. Сохранение результата не требуется, поскольку позже мы приведем пример кода для этого.

Вы также заметите, что запрос содержит интересное условие WHERE . Мы опишем его в следующем разделе, когда будем рассматривать, как разделить данные на обучающую и тестовую выборки.

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: Разделение данных

Обычно при построении модели машинного обучения используют 3 набора данных :

  • Обучение : используется для построения модели путем итеративной корректировки параметров.
  • Валидация : используется для оценки того, не происходит ли переобучение модели, путем проверки на независимых данных в процессе обучения.
  • Тест : используется после создания модели для оценки точности.

В этом практическом занятии мы будем использовать разделение выборки 80/10/10 на обучающую, валидационную и тестовую выборки.

Мы поместим каждый набор данных в отдельную таблицу в BigQuery. Первый шаг — создание набора данных BigQuery, который представляет собой контейнер для связанных таблиц. Выбрав свой проект, выберите «Создать набор данных ».

1084d9f5edbf760b.png

Затем создайте набор данных с именем tfe_codelab , который будет содержать таблицы для обучения, валидации и тестирования.

e5b8646ebdf5f272.png

Теперь мы выполним 3 запроса для обучения, тестирования и валидации и сохраним данные в новом наборе данных tfe_codelab .

В редакторе запросов выполните запрос для генерации обучающих данных:

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

После завершения запроса сохраните результаты в таблицу BigQuery.

49d20c9b4b62f6a7.png

В созданном вами наборе данных tfe_codelab назовите таблицу ulb_fraud_detection_train и сохраните данные.

6d83cf113a0682e1.png

В предложении WHERE данные сначала разделяются путем вычисления хеша по нескольким столбцам. Затем выбираются строки, где остаток от деления хеша на 10 меньше 80, что составляет 80%.

Теперь повторим тот же процесс для валидационного и тестового наборов данных, используя аналогичные запросы, которые выбирают по 10% данных в каждом случае.

Валидация

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

Сохраните результаты этого запроса в таблицу с именем ulb_fraud_detection_val .

Тест

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

Сохраните результаты этого запроса в таблицу с именем ulb_fraud_detection_test .

3. Настройте среду Notebook.

Теперь, когда мы кратко ознакомились с данными, давайте настроим среду разработки модели.

Шаг 1: Включите API.

Коннектор BigQuery использует API хранилища BigQuery. Найдите API хранилища BigQuery в консоли и включите его, если он в данный момент отключен.

9895a2fd3cdf8f8c.png

Шаг 2: Создайте экземпляр AI Platform Notebooks.

Перейдите в раздел «Блокноты платформы ИИ» в консоли Cloud и нажмите «Создать экземпляр» . Затем выберите последний тип экземпляра TensorFlow Enterprise 1.x без графических процессоров :

35301141e9fd3f44.png

Используйте параметры по умолчанию, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

3b801f8ff3db0f2f.png

Затем создайте блокнот Python 3 в JupyterLab:

58523671a252b95a.png

4. Загрузка записей из BigQuery.

Шаг 1: Импортируйте пакеты Python

В первой ячейке вашего блокнота добавьте следующие импорты и запустите ячейку. Вы можете запустить её, нажав кнопку со стрелкой вправо в верхнем меню или нажав комбинацию клавиш Command+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()

Шаг 2: Определение констант

Далее определим несколько констант для использования в проекте. Измените GCP_PROJECT_ID на фактический идентификатор проекта, который вы используете. Затем запускайте создание новых ячеек.

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: Определение вспомогательных функций

Теперь давайте определим пару функций. Функция read_session() считывает данные из таблицы BigQuery. Функция extract_labels() — это вспомогательная функция для отделения столбца с метками от остального содержимого, чтобы набор данных соответствовал формату, ожидаемому функцией 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)

Шаг 4: Загрузка данных

Наконец, давайте создадим каждый набор данных, а затем распечатаем первую партию из обучающего набора данных. Обратите внимание, что мы задали параметр BATCH_SIZE равный 32. Это важный параметр, который повлияет на скорость и точность обучения.

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. Постройте модель

Шаг 1: Предварительная обработка данных

Давайте создадим столбцы признаков для каждого признака в наборе данных. В этом конкретном наборе данных все столбцы имеют тип numeric_column, но есть и ряд других типов столбцов (например, categorical_column).

Как мы обсуждали ранее, мы также нормализуем данные, чтобы центрировать их вокруг нуля, чтобы сеть быстрее сходилась. Мы предварительно рассчитали средние значения каждой характеристики для использования в этом расчете.

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: Постройте модель

Теперь мы готовы создать модель. Мы передадим в нейронную сеть только что созданные столбцы. Затем мы скомпилируем модель. Мы включаем метрику AUC (Precision/Recall), которая полезна для несбалансированных наборов данных .

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: Обучение модели

Существует ряд методов обработки несбалансированных данных, включая перевыборку (генерацию новых данных в миноритарном классе) и недовыборку (сокращение данных в мажоритарном классе).

Для целей этой практической работы давайте воспользуемся методом, который увеличивает вес функции потерь при неправильной классификации миноритарного класса. Мы укажем параметр class_weight при обучении и присвоим большее значение "1" (мошенничество), поскольку оно встречается гораздо реже.

В этой лабораторной работе мы будем использовать 3 эпохи (прохода по данным), чтобы ускорить обучение. В реальных условиях нам нужно было бы запускать обучение достаточно долго, чтобы прекратить наблюдать повышение точности на проверочном наборе данных.

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: Оценка модели

Функция evaluate() может применяться к тестовым данным, которые модель никогда ранее не видела, для получения объективной оценки. К счастью, мы специально выделили для этого тестовые данные!

model.evaluate(test_data)

Шаг 5: Исследование

В этой лабораторной работе мы продемонстрировали, как напрямую загрузить большой набор данных из BigQuery в модель TensorFlow Keras. Мы также рассмотрели все этапы построения модели. Наконец, мы немного узнали о том, как обрабатывать несбалансированные задачи классификации.

Не стесняйтесь продолжать экспериментировать с различными архитектурами и подходами к обработке несбалансированного набора данных, чтобы посмотреть, сможете ли вы повысить точность!

6. Уборка

Если вы хотите продолжить использование этого блокнота, рекомендуется выключать его, когда он не используется. В интерфейсе блокнотов в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

57213ef2edad9257.png

Если вы хотите удалить все ресурсы, созданные в этой лабораторной работе, просто удалите экземпляр блокнота, а не останавливайте его.

В консоли Cloud Console, используя меню навигации, перейдите в раздел «Хранилище» и удалите оба сегмента, созданных для хранения ресурсов вашей модели.