TensorFlow এন্টারপ্রাইজ এবং BigQuery এর সাথে Cloud AI প্ল্যাটফর্মে একটি জালিয়াতি সনাক্তকরণ মডেল তৈরি করুন

১. সংক্ষিপ্ত বিবরণ

এই ল্যাবে, আপনি সরাসরি একটি BigQuery ডেটাসেট ইনজেস্ট করবেন এবং Google Cloud AI Platform- এ TensorFlow Enterprise ব্যবহার করে একটি জালিয়াতি শনাক্তকরণ মডেলকে প্রশিক্ষণ দেবেন।

আপনি যা শিখবেন

আপনি শিখবেন কীভাবে:

  • BigQuery-তে ডেটা বিশ্লেষণ করুন
  • TensorFlow Enterprise-এ BigQuery কানেক্টর ব্যবহার করে ডেটা ইনজেস্ট করুন
  • ভারসাম্যহীন ডেটাসেট দিয়ে জালিয়াতি শনাক্ত করার জন্য একটি ডিপ লার্নিং মডেল তৈরি করুন।

২. BigQuery-তে ডেটা বিশ্লেষণ করুন।

এই কোডল্যাবটি চালানোর জন্য আপনার বিলিং চালু করা একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রজেক্ট প্রয়োজন হবে। প্রজেক্ট তৈরি করতে, এখানের নির্দেশাবলী অনুসরণ করুন।

ধাপ ১: BigQuery পাবলিক ডেটাসেট অ্যাক্সেস করুন

গুগল ক্লাউড কনসোলে BigQuery পাবলিক ডেটাসেটগুলো অ্যাক্সেস করতে এই লিঙ্কটি অনুসরণ করুন।

নিচের বাম কোণায় থাকা রিসোর্স ট্রি-তে আপনি ডেটাসেটগুলির একটি তালিকা দেখতে পাবেন। উপলব্ধ ডেটাসেটগুলির মধ্যে দিয়ে নেভিগেট করে ml-datasets খুঁজে বের করুন, এবং তারপর এর মধ্যে থাকা ulb-fraud-detection টেবিলটি নির্বাচন করুন:

d5e78261514a90ef.png

ডেটাসেট সম্পর্কে আরও জানতে প্রতিটি ট্যাবে ক্লিক করুন:

  • স্কিমা ট্যাবে ডেটা টাইপগুলো বর্ণনা করা হয়েছে।
  • ' Details ' ট্যাবে ব্যাখ্যা করা হয়েছে যে এটি একটি ভারসাম্যহীন ডেটাসেট, যেখানে ২৮৪,৪০৭টি লেনদেন রয়েছে, যার মধ্যে ৪৯২টি জালিয়াতিপূর্ণ।
  • প্রিভিউ ট্যাবে ডেটাসেটের রেকর্ডগুলো দেখানো হয়।

ধাপ ২: টেবিলটি কোয়েরি করুন

ডিটেইলস ট্যাবটি ডেটা সম্পর্কে আমাদের এই তথ্য দেয়:

  • সময় হলো ডেটাসেটের প্রথম লেনদেন এবং নির্বাচিত লেনদেনের সময়ের মধ্যবর্তী সেকেন্ডের সংখ্যা।
  • V1-V28 হলো সেই কলামগুলো, যেগুলোকে PCA নামক একটি ডাইমেনশনালিটি রিডাকশন কৌশলের মাধ্যমে রূপান্তরিত করা হয়েছে এবং যা ডেটাকে বেনামী করেছে।
  • পরিমাণ হলো লেনদেনের পরিমাণ।

চলুন , কোয়েরি টেবিল-এ ক্লিক করে একটি কোয়েরি চালিয়ে বিষয়টি আরও ভালোভাবে দেখে নেওয়া যাক:

581e596426a98383.png

সমস্ত কলাম দেখার জন্য স্টেটমেন্টটিতে একটি * যোগ করে আপডেট করুন এবং রান-এ ক্লিক করুন।

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

সহসম্পর্কের মান -১ (ঋণাত্মকভাবে সম্পর্কিত) থেকে ১ (ধনাত্মকভাবে সম্পর্কিত) পর্যন্ত একটি পরিসর প্রদান করবে, যেখানে ০ মানে স্বাধীন।

উল্লেখ্য যে, 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 টেবিলে সংরক্ষণ করুন।

49d20c9b4b62f6a7.png

আপনার এইমাত্র তৈরি করা tfe_codelab ডেটাসেটের মধ্যে, ulb_fraud_detection_train টেবিলটির নাম দিন এবং ডেটা সংরক্ষণ করুন।

6d83cf113a0682e1.png

WHERE ক্লজটি প্রথমে কয়েকটি কলামের উপর একটি হ্যাশ গণনা করে ডেটা বিভক্ত করে। তারপর, এটি সেই সারিগুলি নির্বাচন করে যেখানে হ্যাশটিকে ১০ দিয়ে ভাগ করলে ভাগশেষ ৮০-এর নিচে থাকে, যা আমাদের ৮০% দেয়।

এবার ভ্যালিডেশন এবং টেস্ট সেটের জন্য একই প্রক্রিয়াটি পুনরাবৃত্তি করা যাক, যেখানে প্রতিটি ক্ষেত্রে ১০% ডেটা নির্বাচন করার জন্য অনুরূপ কোয়েরি ব্যবহার করা হবে।

বৈধতা

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 নামের একটি টেবিলে সংরক্ষণ করুন।

৩. আপনার নোটবুক পরিবেশ সেটআপ করুন।

ডেটা সম্পর্কে একটি সংক্ষিপ্ত পরিচিতি দেওয়ার পর, চলুন এখন আমাদের মডেল তৈরির পরিবেশটি প্রস্তুত করি।

ধাপ ১: এপিআই সক্রিয় করুন

BigQuery কানেক্টরটি BigQuery Storage API ব্যবহার করে। কনসোলে BigQuery Storage API অনুসন্ধান করুন এবং যদি API-টি বর্তমানে নিষ্ক্রিয় থাকে তবে তা সক্রিয় করুন।

9895a2fd3cdf8f8c.png

ধাপ ২: একটি এআই প্ল্যাটফর্ম নোটবুক ইনস্ট্যান্স তৈরি করুন

আপনার ক্লাউড কনসোলের AI প্ল্যাটফর্ম নোটবুকস বিভাগে যান এবং নিউ ইনস্ট্যান্স-এ ক্লিক করুন। তারপর GPU ছাড়া সর্বশেষ TensorFlow Enterprise 1.x ইনস্ট্যান্স টাইপটি নির্বাচন করুন:

35301141e9fd3f44.png

ডিফল্ট অপশনগুলো ব্যবহার করুন এবং তারপর 'Create'-এ ক্লিক করুন। ইনস্ট্যান্সটি তৈরি হয়ে গেলে, 'Open JupyterLab' নির্বাচন করুন:

3b801f8ff3db0f2f.png

এরপর, JupyterLab থেকে একটি Python 3 নোটবুক তৈরি করুন:

58523671a252b95a.png

৪. BigQuery থেকে রেকর্ড গ্রহণ করুন

ধাপ ১: পাইথন প্যাকেজগুলো ইম্পোর্ট করুন

আপনার নোটবুকের প্রথম সেলে নিম্নলিখিত ইম্পোর্টগুলো যোগ করুন এবং সেলটি রান করুন। আপনি উপরের মেনুতে থাকা ডান তীর বোতামটি চেপে অথবা কমান্ড-এন্টার চেপে এটি রান করতে পারেন:

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

৫. মডেল তৈরি করুন

ধাপ ১: ডেটা প্রাক-প্রক্রিয়া করুন

চলুন ডেটাসেটের প্রতিটি ফিচারের জন্য ফিচার কলাম তৈরি করি। এই নির্দিষ্ট ডেটাসেটটিতে, সমস্ত কলামই নিউমেরিক_কলাম টাইপের, কিন্তু আরও বিভিন্ন ধরনের কলামও রয়েছে (যেমন ক্যাটেগরিকাল_কলাম)।

যেমনটি আমরা আগে আলোচনা করেছি, আমরা ডেটাগুলোকে শূন্যের কাছাকাছি এনে নর্ম করব, যাতে নেটওয়ার্কটি দ্রুত কনভার্জ করে। এই গণনায় ব্যবহারের জন্য আমরা প্রতিটি ফিচারের গড় আগে থেকেই হিসাব করে রেখেছি।

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

ধাপ ২: মডেলটি তৈরি করুন

এখন আমরা একটি মডেল তৈরি করার জন্য প্রস্তুত। আমরা এইমাত্র তৈরি করা কলামগুলো নেটওয়ার্কে ইনপুট হিসেবে দেব। তারপর আমরা মডেলটি কম্পাইল করব। আমরা প্রিসিশন/রিকল 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' প্যারামিটার নির্দিষ্ট করব এবং '১' (প্রতারণা)-কে বেশি গুরুত্ব দেব, কারণ এর প্রচলন অনেক কম।

এই ল্যাবে আমরা ৩টি ইপক (ডেটার মধ্য দিয়ে অতিক্রম) ব্যবহার করব, যাতে ট্রেনিং দ্রুত হয়। বাস্তব ক্ষেত্রে, আমরা এটিকে ততক্ষণ পর্যন্ত চালাতে চাইব যতক্ষণ না ভ্যালিডেশন সেটের অ্যাকুরেসিতে আর কোনো বৃদ্ধি দেখা যায়।

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 থেকে একটি বৃহৎ ডেটা সেট সরাসরি TensorFlow Keras মডেলে অন্তর্ভুক্ত করা যায়। আমরা একটি মডেল তৈরির সমস্ত ধাপও আলোচনা করেছি। পরিশেষে, আমরা ভারসাম্যহীন শ্রেণিবিন্যাস সমস্যাগুলি কীভাবে সমাধান করতে হয় সে সম্পর্কে কিছুটা শিখেছি।

অসম ডেটাসেটের নির্ভুলতা উন্নত করা যায় কিনা তা দেখতে, বিভিন্ন আর্কিটেকচার এবং পদ্ধতি নিয়ে পরীক্ষা-নিরীক্ষা চালিয়ে যেতে পারেন।

৬. পরিষ্কার-পরিচ্ছন্নতা

আপনি যদি এই নোটবুকটি ব্যবহার করা চালিয়ে যেতে চান, তবে ব্যবহার না করার সময় এটি বন্ধ করে রাখার পরামর্শ দেওয়া হচ্ছে। আপনার ক্লাউড কনসোলের নোটবুকস UI থেকে, নোটবুকটি নির্বাচন করুন এবং তারপরে স্টপ (Stop ) নির্বাচন করুন।

57213ef2edad9257.png

আপনি যদি এই ল্যাবে তৈরি করা সমস্ত রিসোর্স মুছে ফেলতে চান, তাহলে নোটবুক ইনস্ট্যান্সটি বন্ধ করার পরিবর্তে সরাসরি ডিলিট করে দিন

আপনার ক্লাউড কনসোলের নেভিগেশন মেনু ব্যবহার করে স্টোরেজ-এ যান এবং আপনার মডেল অ্যাসেটগুলো সংরক্ষণের জন্য তৈরি করা উভয় বাকেট মুছে ফেলুন।