1. Обзор
В ходе этой лабораторной работы вы напрямую примете набор данных BigQuery и обучите модель обнаружения мошенничества с помощью TensorFlow Enterprise на платформе Google Cloud AI .
Что вы узнаете
Вы узнаете, как:
- Анализируйте данные в BigQuery
- Прием данных с помощью коннектора BigQuery в TensorFlow Enterprise.
- Создайте модель глубокого обучения для обнаружения мошенничества с помощью несбалансированного набора данных.
2. Анализируйте данные в BigQuery.
Для запуска этой лаборатории кода вам понадобится проект Google Cloud Platform с включенной оплатой. Чтобы создать проект, следуйте инструкциям здесь .
Шаг 1. Получите доступ к общедоступному набору данных BigQuery.
Перейдите по этой ссылке , чтобы получить доступ к общедоступным наборам данных BigQuery в консоли Google Cloud.
В дереве ресурсов в левом нижнем углу вы увидите список наборов данных. Перемещайтесь по доступным наборам данных, пока не найдете ml-datasets , а затем выберите в нем таблицу ulb-fraud-detection :
Щелкните каждую вкладку, чтобы узнать больше о наборе данных:
- На вкладке «Схема» описаны типы данных.
- На вкладке «Подробности» поясняется, что это несбалансированный набор данных с 284 407 транзакциями, из которых 492 являются мошенническими.
- На вкладке «Предварительный просмотр» отображаются записи из набора данных.
Шаг 2. Запрос таблицы
Вкладка «Подробности» сообщает нам следующее о данных:
- Время — это количество секунд между первой транзакцией в наборе данных и временем выбранной транзакции.
- V1–V28 — это столбцы, преобразованные с помощью метода уменьшения размерности, называемого PCA , который анонимизирует данные.
- Сумма — сумма транзакции.
Давайте посмотрим поближе, нажав «Таблица запросов» , чтобы выполнить запрос:
Обновите оператор, добавив * для просмотра всех столбцов, и нажмите «Выполнить» .
SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000
Шаг 3: Анализ данных
BigQuery предоставляет ряд статистических функций . Давайте посмотрим, как данные коррелируют с целевой переменной 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`
Корреляция будет находиться в диапазоне от -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: Разделение данных
При построении модели машинного обучения обычно используют три набора данных :
- Обучение : используется для построения модели путем итеративной настройки параметров.
- Валидация : используется для оценки переобучения модели путем проверки независимых данных в процессе обучения.
- Тест : используется после создания модели для оценки точности.
В этой кодовой лаборатории мы будем использовать разделение 80/10/10 обучение/проверка/тестирование.
Мы поместим каждый набор данных в отдельную таблицу в BigQuery. Первым шагом является создание «набора данных» BigQuery, который является контейнером для связанных таблиц. Выбрав проект, выберите «Создать набор данных» .
Затем создайте набор данных с именем tfe_codelab , который будет содержать таблицы обучения, проверки и тестирования.
Теперь мы выполним 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.
В только что созданном наборе данных tfe_codelab назовите таблицу ulb_fraud_detection_train и сохраните данные.
Предложение 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. Настройте среду вашего ноутбука
Теперь, когда мы кратко познакомились с данными, давайте теперь настроим среду разработки нашей модели.
Шаг 1. Включите API
Соединитель BigQuery использует BigQuery Storage API. Найдите BigQuery Storage API в консоли и включите API, если он в данный момент отключен.
Шаг 2. Создайте экземпляр AI Platform Notebooks.
Перейдите в раздел «Блокноты AI Platform» в облачной консоли и нажмите «Новый экземпляр» . Затем выберите последний тип экземпляра TensorFlow Enterprise 1.x без графических процессоров :
Используйте параметры по умолчанию и нажмите «Создать» . После создания экземпляра выберите «Открыть JupyterLab» :
Затем создайте блокнот Python 3 из JupyterLab:
4. Получение записей из BigQuery
Шаг 1. Импортируйте пакеты Python
В первую ячейку записной книжки добавьте следующий импорт и запустите ячейку. Вы можете запустить его, нажав кнопку со стрелкой вправо в верхнем меню или нажав команду-ввод:
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. Оцените модель
Функцию Assessment() можно применять для проверки данных, которые модель никогда не видела, чтобы обеспечить объективную оценку. К счастью, именно для этого мы отложили тестовые данные!
model.evaluate(test_data)
Шаг 5: Исследование
В этой лабораторной работе мы продемонстрировали, как импортировать большой набор данных из BigQuery непосредственно в модель TensorFlow Keras. Мы также прошли все этапы построения модели. Наконец, мы узнали немного о том, как решать проблемы несбалансированной классификации.
Не стесняйтесь продолжать экспериментировать с различными архитектурами и подходами к несбалансированному набору данных, чтобы посмотреть, сможете ли вы повысить точность!
6. Очистка
Если вы хотите продолжать использовать этот ноутбук, рекомендуется выключать его, когда он не используется. В пользовательском интерфейсе ноутбуков в облачной консоли выберите блокнот и нажмите «Стоп» :
Если вы хотите удалить все ресурсы, созданные в ходе этой лабораторной работы, просто удалите экземпляр блокнота, а не останавливайте его.
Используя меню навигации в облачной консоли, перейдите к разделу «Хранилище» и удалите оба сегмента, созданные вами для хранения ресурсов модели.