1. بررسی اجمالی
در این آزمایشگاه، شما مستقیماً یک مجموعه داده BigQuery را وارد میکنید و یک مدل تشخیص تقلب را با TensorFlow Enterprise در پلتفرم Google Cloud AI آموزش میدهید.
چیزی که یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- تجزیه و تحلیل داده ها در BigQuery
- داده ها را با استفاده از رابط BigQuery در TensorFlow Enterprise دریافت کنید
- یک مدل یادگیری عمیق برای شناسایی تقلب با مجموعه داده نامتعادل بسازید
2. داده ها را در BigQuery تجزیه و تحلیل کنید
برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.
مرحله 1: به مجموعه داده عمومی BigQuery دسترسی پیدا کنید
برای دسترسی به مجموعه داده های عمومی BigQuery در کنسول Google Cloud این پیوند را دنبال کنید.
در درخت منابع در گوشه سمت چپ پایین، لیستی از مجموعه داده ها را مشاهده خواهید کرد. در میان مجموعه دادههای موجود پیمایش کنید تا مجموعه دادههای ml را پیدا کنید، و سپس جدول ulb-fraud-detection را در آن انتخاب کنید:
برای اطلاعات بیشتر در مورد مجموعه داده، روی هر برگه کلیک کنید:
- تب Schema انواع داده ها را توصیف می کند.
- تب جزئیات توضیح می دهد که این یک مجموعه داده نامتعادل با 284407 تراکنش است که 492 تراکنش تقلبی است.
- برگه Preview رکوردهای مجموعه داده را نشان می دهد.
مرحله 2: جدول را پرس و جو کنید
برگه جزئیات این را در مورد داده ها به ما می گوید:
- زمان تعداد ثانیه های بین اولین تراکنش در مجموعه داده و زمان تراکنش انتخاب شده است.
- V1-V28 ستون هایی هستند که از طریق یک تکنیک کاهش ابعاد به نام PCA که داده ها را ناشناس کرده است، تغییر شکل داده اند.
- مبلغ مبلغ معامله است.
بیایید با کلیک روی Query Table برای اجرای یک پرس و جو، نگاهی دقیقتر بیندازیم:
عبارت را به روز کنید تا یک * برای مشاهده همه ستون ها اضافه کنید و روی Run کلیک کنید.
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`
همبستگی محدوده ای از -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 است - که محفظه ای برای جداول مرتبط است. با انتخاب پروژه خود، Create Dataset را انتخاب کنید.
سپس یک مجموعه داده به نام tfe_codelab ایجاد کنید تا شامل جداول قطار، اعتبار سنجی و آزمایش باشد.
اکنون، ما 3 کوئری برای آموزش، آزمایش و اعتبارسنجی اجرا می کنیم و داده ها را در مجموعه داده tfe_codelab جدید ذخیره می کنیم.
در ویرایشگر Query، یک پرس و جو را برای تولید داده های آموزشی اجرا کنید:
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. محیط Notebook خود را راه اندازی کنید
اکنون که مقدمهای کوتاه بر دادهها انجام دادهایم، اجازه دهید محیط توسعه مدل خود را تنظیم کنیم.
مرحله 1: API ها را فعال کنید
رابط BigQuery از BigQuery Storage API استفاده می کند. BigQuery Storage API را در کنسول جستجو کنید و اگر API در حال حاضر غیرفعال است، آن را فعال کنید.
مرحله 2: یک نمونه نوت بوک پلتفرم هوش مصنوعی ایجاد کنید
به بخش AI Platform Notebooks در Cloud Console خود بروید و روی New Instance کلیک کنید. سپس آخرین نوع نمونه TensorFlow Enterprise 1.x را بدون GPU انتخاب کنید:
از گزینه های پیش فرض استفاده کنید و سپس روی ایجاد کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:
سپس، یک نوت بوک پایتون 3 از JupyterLab ایجاد کنید:
4. مصرف رکوردها از BigQuery
مرحله 1: بسته های پایتون را وارد کنید
در اولین سلول نوت بوک، موارد زیر را وارد کنید و سلول را اجرا کنید. می توانید با فشار دادن دکمه فلش سمت راست در منوی بالا یا فشار دادن دستور-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 دقت/یادآوری را در نظر میگیریم که برای مجموعه دادههای نامتعادل مفید است.
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: مدل را ارزیابی کنید
تابع ()value میتواند برای دادههای آزمایشی که مدل هرگز برای ارائه یک ارزیابی عینی ندیده است، اعمال شود. خوشبختانه، ما داده های آزمایش را فقط برای آن کنار گذاشته ایم!
model.evaluate(test_data)
مرحله 5: کاوش
در این آزمایشگاه، ما نشان دادهایم که چگونه یک مجموعه داده بزرگ را از BigQuery مستقیماً در یک مدل TensorFlow Keras وارد کنیم. ما همچنین تمام مراحل ساخت یک مدل را طی کرده ایم. در نهایت، ما کمی در مورد نحوه رسیدگی به مشکلات طبقه بندی نامتعادل یاد گرفتیم.
با خیال راحت به بازی کردن با معماری ها و رویکردهای مختلف به مجموعه داده نامتعادل ادامه دهید تا ببینید آیا می توانید دقت را بهبود ببخشید یا خیر!
6. پاکسازی
اگر می خواهید به استفاده از این نوت بوک ادامه دهید، توصیه می شود در صورت عدم استفاده آن را خاموش کنید. از رابط کاربری Notebooks در Cloud Console خود، نوت بوک را انتخاب کنید و سپس Stop را انتخاب کنید:
اگر میخواهید تمام منابعی را که در این آزمایشگاه ایجاد کردهاید حذف کنید، بهجای توقف آن، نمونه نوتبوک را به سادگی حذف کنید .
با استفاده از منوی پیمایش در Cloud Console، به Storage بروید و هر دو سطل را که برای ذخیره دارایی های مدل خود ایجاد کرده اید حذف کنید.