با TensorFlow Enterprise و BigQuery یک مدل تشخیص تقلب در پلتفرم Cloud AI بسازید.

۱. مرور کلی

در این آزمایشگاه، شما مستقیماً یک مجموعه داده BigQuery را دریافت کرده و یک مدل تشخیص تقلب را با TensorFlow Enterprise در پلتفرم Google Cloud AI آموزش خواهید داد.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • تجزیه و تحلیل داده‌ها در BigQuery
  • دریافت داده‌ها با استفاده از کانکتور BigQuery در TensorFlow Enterprise
  • ساخت یک مدل یادگیری عمیق برای تشخیص کلاهبرداری با مجموعه داده‌های نامتوازن

۲. داده‌ها را در BigQuery تجزیه و تحلیل کنید

برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل‌های اینجا را دنبال کنید.

مرحله ۱: دسترسی به مجموعه داده‌های عمومی BigQuery

برای دسترسی به مجموعه داده‌های عمومی BigQuery در کنسول Google Cloud، این لینک را دنبال کنید.

در درخت منابع در گوشه پایین سمت چپ، فهرستی از مجموعه داده‌ها را مشاهده خواهید کرد. در میان مجموعه داده‌های موجود حرکت کنید تا ml-datasets را پیدا کنید و سپس جدول ulb-fraud-detection را از درون آن انتخاب کنید:

d5e78261514a90ef.png

برای کسب اطلاعات بیشتر در مورد مجموعه داده‌ها، روی هر تب کلیک کنید:

  • تب Schema انواع داده‌ها را شرح می‌دهد.
  • تب جزئیات توضیح می‌دهد که این یک مجموعه داده نامتوازن با ۲۸۴,۴۰۷ تراکنش است که ۴۹۲ مورد از آنها جعلی هستند.
  • برگه پیش‌نمایش، رکوردهای مجموعه داده‌ها را نشان می‌دهد.

مرحله 2: پرس و جو از جدول

تب جزئیات این اطلاعات را در مورد داده‌ها به ما می‌گوید:

  • زمان ، تعداد ثانیه‌ها بین اولین تراکنش در مجموعه داده‌ها و زمان تراکنش انتخاب شده است.
  • V1-V28 ستون‌هایی هستند که از طریق یک تکنیک کاهش ابعاد به نام PCA که داده‌ها را ناشناس کرده است، تبدیل شده‌اند.
  • مبلغ، مبلغ تراکنش است.

بیایید با کلیک روی جدول پرس و جو برای اجرای یک پرس و جو، نگاه دقیق‌تری به آن بیندازیم:

581e596426a98383.png

عبارت را به‌روزرسانی کنید تا یک * برای مشاهده همه ستون‌ها اضافه شود و روی Run کلیک کنید.

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

مرحله ۳: تحلیل داده‌ها

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`

e1e98a8315b62e9e.png

همبستگی، دامنه‌ای از -1 (همبستگی منفی) تا 1 (همبستگی مثبت) را ارائه می‌دهد که 0 نشان‌دهنده‌ی استقلال است.

توجه داشته باشید که V1 و V2 همبستگی کمی با متغیر هدف ما دارند (به ترتیب حدود -0.1 و .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

مرحله ۵: تقسیم داده‌ها

معمولاً هنگام ساخت یک مدل یادگیری ماشین از ۳ مجموعه داده استفاده می‌شود:

  • آموزش : برای ساخت مدل با تنظیم تکراری پارامترها استفاده می‌شود.
  • اعتبارسنجی : برای ارزیابی اینکه آیا مدل بیش‌برازش دارد یا خیر، با تأیید داده‌های مستقل در طول فرآیند آموزش، استفاده می‌شود.
  • آزمون : پس از ایجاد مدل برای ارزیابی دقت استفاده می‌شود.

در این آزمایشگاه کد، ما از تقسیم‌بندی آموزش/اعتبارسنجی/آزمون به صورت ۸۰/۱۰/۱۰ استفاده خواهیم کرد.

ما هر مجموعه داده را در جدول مخصوص به خود در BigQuery قرار خواهیم داد. اولین قدم ایجاد یک "مجموعه داده" در BigQuery است - که ظرفی برای جداول مرتبط است. پس از انتخاب پروژه، گزینه Create Dataset را انتخاب کنید.

1084d9f5edbf760b.png

سپس، یک مجموعه داده به نام tfe_codelab ایجاد کنید تا جداول آموزش، اعتبارسنجی و آزمون را در بر بگیرد.

e5b8646ebdf5f272.png

اکنون، ۳ کوئری برای آموزش، آزمایش و اعتبارسنجی اجرا خواهیم کرد و داده‌ها را در مجموعه داده جدید 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 ذخیره کنید.

۴۹d20c9b4b62f6a7.png

در مجموعه داده tfe_codelab که ایجاد کرده‌اید، نام جدول را ulb_fraud_detection_train قرار دهید و داده‌ها را ذخیره کنید.

6d83cf113a0682e1.png

عبارت WHERE ابتدا داده‌ها را با محاسبه‌ی هش روی چند ستون تقسیم می‌کند. سپس، ردیف‌هایی را انتخاب می‌کند که باقیمانده‌ی هش در تقسیم بر ۱۰ آنها کمتر از ۸۰ باشد، که به ما ۸۰٪ می‌دهد.

اکنون بیایید همین فرآیند را برای اعتبارسنجی و مجموعه‌های آزمایشی با پرس‌وجوهای مشابه که هر کدام 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 ذخیره کنید.

۳. محیط نوت‌بوک خود را راه‌اندازی کنید

حالا که مقدمه‌ای کوتاه در مورد داده‌ها ارائه دادیم، بیایید محیط توسعه مدل خود را راه‌اندازی کنیم.

مرحله ۱: فعال کردن APIها

رابط BigQuery از BigQuery Storage API استفاده می‌کند. در کنسول، BigQuery Storage API را جستجو کنید و اگر در حال حاضر غیرفعال است، آن را فعال کنید.

9895a2fd3cdf8f8c.png

مرحله ۲: ایجاد یک نمونه از نوت‌بوک‌های پلتفرم هوش مصنوعی

به بخش AI Platform Notebooks در کنسول ابری خود بروید و روی New Instance کلیک کنید. سپس آخرین نوع نمونه TensorFlow Enterprise 1.x را بدون GPU انتخاب کنید:

۳۵۳۰۱۱۴۱e۹fd۳f۴۴.png

از گزینه‌های پیش‌فرض استفاده کنید و سپس روی Create کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:

3b801f8ff3db0f2f.png

سپس، یک دفترچه یادداشت پایتون ۳ از JupyterLab ایجاد کنید:

58523671a252b95a.png

۴. دریافت رکوردها از BigQuery

مرحله ۱: وارد کردن بسته‌های پایتون

در سلول اول دفترچه یادداشت خود، موارد زیر را وارد کرده و سلول را اجرا کنید. می‌توانید آن را با فشار دادن دکمه فلش سمت راست در منوی بالا یا فشار دادن کلید ترکیبی 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()

مرحله ۲: تعریف ثابت‌ها

بیایید در مرحله بعد چند ثابت برای استفاده در پروژه تعریف کنیم. 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]

مرحله ۳: تعریف توابع کمکی

حالا، بیایید چند تابع تعریف کنیم. 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)

مرحله ۴: دریافت داده‌ها

در نهایت، بیایید هر مجموعه داده را ایجاد کنیم و سپس اولین دسته از مجموعه داده آموزشی را چاپ کنیم. توجه داشته باشید که ما BATCH_SIZE را برابر با ۳۲ تعریف کرده‌ایم. این یک پارامتر مهم است که بر سرعت و دقت آموزش تأثیر می‌گذارد.

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

۵. ساخت مدل

مرحله ۱: پیش‌پردازش داده‌ها

بیایید برای هر ویژگی در مجموعه داده، ستون‌های ویژگی ایجاد کنیم. در این مجموعه داده خاص، همه ستون‌ها از نوع 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

مرحله ۲: ساخت مدل

اکنون آماده ایجاد یک مدل هستیم. ستون‌هایی را که تازه ایجاد کرده‌ایم به شبکه وارد می‌کنیم. سپس مدل را کامپایل می‌کنیم. ما معیار Precision/Recall AUC را نیز لحاظ می‌کنیم که برای مجموعه داده‌های نامتوازن مفید است.

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

مرحله ۳: مدل را آموزش دهید

تعدادی تکنیک برای مدیریت داده‌های نامتوازن وجود دارد، از جمله نمونه‌گیری بیش از حد (تولید داده‌های جدید در کلاس اقلیت) و نمونه‌گیری کمتر از حد (کاهش داده‌ها در کلاس اکثریت).

برای اهداف این آزمایشگاه کد، بیایید از تکنیکی استفاده کنیم که هنگام طبقه‌بندی نادرست کلاس اقلیت، زیان را بیش از حد در نظر می‌گیرد. ما هنگام آموزش یک پارامتر class_weight تعیین می‌کنیم و وزن "1" (تقلب) را بالاتر قرار می‌دهیم، زیرا شیوع بسیار کمتری دارد.

ما در این آزمایش از ۳ دوره (گذر از داده‌ها) استفاده خواهیم کرد تا آموزش سریع‌تر باشد. در یک سناریوی دنیای واقعی، می‌خواهیم آن را به اندازه کافی طولانی اجرا کنیم تا جایی که توقف مشاهده، دقت مجموعه اعتبارسنجی را افزایش دهد.

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)

مرحله ۴: ارزیابی مدل

تابع ()evaluate می‌تواند برای داده‌های آزمایشی که مدل هرگز ندیده است، به منظور ارائه یک ارزیابی عینی، اعمال شود. خوشبختانه، ما داده‌های آزمایشی را فقط برای این کار کنار گذاشته‌ایم!

model.evaluate(test_data)

مرحله ۵: کاوش

در این آزمایش، ما نشان دادیم که چگونه می‌توان یک مجموعه داده بزرگ را از BigQuery مستقیماً به یک مدل Keras در TensorFlow وارد کرد. همچنین تمام مراحل ساخت یک مدل را بررسی کردیم. در نهایت، کمی در مورد نحوه مدیریت مشکلات طبقه‌بندی نامتوازن آموختیم.

می‌توانید با معماری‌ها و رویکردهای مختلف به مجموعه داده‌های نامتوازن بازی کنید تا ببینید آیا می‌توانید دقت را بهبود بخشید!

۶. پاکسازی

اگر می‌خواهید به استفاده از این دفترچه یادداشت ادامه دهید، توصیه می‌شود وقتی از آن استفاده نمی‌کنید، آن را خاموش کنید. از رابط کاربری دفترچه یادداشت‌ها در کنسول ابری خود، دفترچه یادداشت را انتخاب کرده و سپس توقف را انتخاب کنید:

57213ef2edad9257.png

اگر می‌خواهید تمام منابعی را که در این آزمایشگاه ایجاد کرده‌اید حذف کنید، به جای متوقف کردن آن، کافیست نمونه نوت‌بوک را حذف کنید .

با استفاده از منوی ناوبری در کنسول ابری خود، به بخش ذخیره‌سازی (Storage) بروید و هر دو باکتی را که برای ذخیره دارایی‌های مدل خود ایجاد کرده‌اید، حذف کنید.