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

1. ওভারভিউ

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

আপনি কি শিখুন

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

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

2. BigQuery-এ ডেটা বিশ্লেষণ করুন

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

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

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

নীচে-বাম কোণে সম্পদ গাছে, আপনি ডেটাসেটের একটি তালিকা দেখতে পাবেন। আপনি 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 এবং .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. আপনার নোটবুক পরিবেশ সেটআপ করুন

এখন যেহেতু আমরা ডেটার সংক্ষিপ্ত পরিচিতি দিয়েছি, এখন আমাদের মডেল ডেভেলপমেন্ট এনভায়রনমেন্ট সেটআপ করা যাক।

ধাপ 1: APIs সক্ষম করুন

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

9895a2fd3cdf8f8c.png

ধাপ 2: একটি AI প্ল্যাটফর্ম নোটবুক উদাহরণ তৈরি করুন

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

35301141e9fd3f44.png

ডিফল্ট বিকল্পগুলি ব্যবহার করুন এবং তারপরে তৈরি করুন ক্লিক করুন। একবার উদাহরণ তৈরি হয়ে গেলে, JupyterLab খুলুন নির্বাচন করুন:

3b801f8ff3db0f2f.png

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

58523671a252b95a.png

4. BigQuery থেকে রেকর্ড ইনজেস্ট করুন

ধাপ 1: পাইথন প্যাকেজ আমদানি করুন

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

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: ডেটা ইনজেস্ট করুন

অবশেষে, আসুন প্রতিটি ডেটাসেট তৈরি করি এবং তারপর প্রশিক্ষণ ডেটাসেট থেকে প্রথম ব্যাচটি প্রিন্ট করি। মনে রাখবেন যে আমরা 32-এর একটি 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

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

ধাপ 1: ডেটা প্রিপ্রসেস করুন

আসুন ডেটাসেটের প্রতিটি বৈশিষ্ট্যের জন্য বৈশিষ্ট্য কলাম তৈরি করি। এই নির্দিষ্ট ডেটাসেটে, সমস্ত কলামই numeric_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: মডেলটি মূল্যায়ন করুন

evaluate() ফাংশনটি পরীক্ষার ডেটাতে প্রয়োগ করা যেতে পারে যা মডেলটি একটি উদ্দেশ্যমূলক মূল্যায়ন প্রদান করতে দেখেনি। সৌভাগ্যবশত, আমরা শুধু এর জন্য পরীক্ষার ডেটা আলাদা করে রেখেছি!

model.evaluate(test_data)

ধাপ 5: অন্বেষণ

এই ল্যাবে, আমরা দেখিয়েছি কিভাবে BigQuery থেকে একটি বড় ডেটা সেট সরাসরি একটি TensorFlow Keras মডেলে প্রবেশ করা যায়। আমরা একটি মডেল তৈরির সমস্ত ধাপ অতিক্রম করেছি৷ অবশেষে, আমরা ভারসাম্যহীন শ্রেণিবিন্যাস সমস্যাগুলি কীভাবে পরিচালনা করতে হয় সে সম্পর্কে কিছুটা শিখেছি।

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

6. পরিষ্কার করা

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

57213ef2edad9257.png

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

আপনার ক্লাউড কনসোলে নেভিগেশন মেনু ব্যবহার করে, সঞ্চয়স্থানে ব্রাউজ করুন এবং আপনার মডেল সম্পদগুলি সঞ্চয় করার জন্য আপনার তৈরি করা উভয় বালতি মুছে দিন।