১. সংক্ষিপ্ত বিবরণ
এই ল্যাবে, আপনি এআই প্ল্যাটফর্ম নোটবুক ব্যবহার করে জালিয়াতিপূর্ণ লেনদেন শনাক্ত করার জন্য একটি মডেল তৈরি ও প্রশিক্ষণ দেবেন এবং এক্সপ্লেইনেবল এআই এসডিকে (Explainable AI SDK) দিয়ে মডেলটির পূর্বাভাসগুলো বুঝবেন। জালিয়াতি শনাক্তকরণ হলো আর্থিক পরিষেবা খাতের জন্য নির্দিষ্ট এক ধরনের অসঙ্গতি শনাক্তকরণ, এবং এটি এমএল (ML) মডেলগুলোর জন্য কিছু আকর্ষণীয় চ্যালেঞ্জ উপস্থাপন করে: সহজাতভাবে ভারসাম্যহীন ডেটাসেট এবং মডেলের ফলাফল ব্যাখ্যা করার প্রয়োজনীয়তা।
আপনি যা শিখবেন
আপনি শিখবেন কীভাবে:
- ভারসাম্যহীন ডেটাসেট পরিচালনা করুন
- এআই প্ল্যাটফর্ম নোটবুকে tf.keras ব্যবহার করে একটি জালিয়াতি সনাক্তকরণ মডেল তৈরি ও মূল্যায়ন করুন।
- মডেলটি কেন লেনদেনগুলিকে জালিয়াতিপূর্ণ হিসাবে শ্রেণীবদ্ধ করেছে তা বোঝার জন্য নোটবুকের ভেতর থেকে এক্সপ্লেইনেবল এআই এসডিকে (Explainable AI SDK) ব্যবহার করুন।
- ব্যাখ্যাসহ মডেলটি এআই প্ল্যাটফর্মে স্থাপন করুন, এবং স্থাপিত মডেলটির উপর পূর্বাভাস ও ব্যাখ্যা গ্রহণ করুন।
গুগল ক্লাউডে এই ল্যাবটি চালানোর মোট খরচ প্রায় ১ ডলার ।
২. জালিয়াতি শনাক্তকরণ কেন প্রয়োজন?
অসঙ্গতি শনাক্তকরণ মেশিন লার্নিংয়ের জন্য একটি ভালো ক্ষেত্র হতে পারে, কারণ ডেটার মধ্যে ব্যতিক্রমী মান (আউটলায়ার) সনাক্ত করার জন্য ধারাবাহিক নিয়ম-ভিত্তিক বিবৃতি লেখা প্রায়শই কঠিন। জালিয়াতি সনাক্তকরণ হলো এক ধরনের অসঙ্গতি শনাক্তকরণ, এবং মেশিন লার্নিংয়ের ক্ষেত্রে এটি দুটি আকর্ষণীয় চ্যালেঞ্জ উপস্থাপন করে:
- অত্যন্ত ভারসাম্যহীন ডেটাসেট : যেহেতু ব্যতিক্রমী ডেটা বা অ্যানোমালিগুলো ব্যতিক্রমীই হয়, তাই এগুলোর সংখ্যা খুব বেশি থাকে না। ডেটাসেট ভারসাম্যপূর্ণ হলেই মেশিন লার্নিং সবচেয়ে ভালোভাবে কাজ করে, তাই যখন আপনার ডেটার ১%-এরও কম আউটলায়ার থাকে, তখন পরিস্থিতি জটিল হয়ে উঠতে পারে।
- ফলাফল ব্যাখ্যা করার প্রয়োজন : আপনি যদি কোনো প্রতারণামূলক কার্যকলাপের সন্ধান করেন, তবে কোনো সিস্টেম শুধু তার কথা বিশ্বাস না করে, কেন সেটিকে প্রতারণামূলক হিসেবে চিহ্নিত করেছে তা জানতে চাইবেন। ব্যাখ্যাযোগ্যতার টুল এক্ষেত্রে সাহায্য করতে পারে।
৩. আপনার পরিবেশ প্রস্তুত করুন
এই কোডল্যাবটি চালানোর জন্য আপনার বিলিং চালু করা একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রজেক্ট প্রয়োজন হবে। প্রজেক্ট তৈরি করতে, এখানের নির্দেশাবলী অনুসরণ করুন।
ধাপ ১: ক্লাউড এআই প্ল্যাটফর্ম মডেলস এপিআই সক্রিয় করুন
আপনার ক্লাউড কনসোলের AI প্ল্যাটফর্ম মডেল বিভাগে যান এবং যদি এটি আগে থেকে সক্রিয় না থাকে তবে 'সক্রিয় করুন' (Enable) বোতামে ক্লিক করুন।

ধাপ ২: কম্পিউট ইঞ্জিন এপিআই সক্রিয় করুন
Compute Engine- এ যান এবং যদি আগে থেকে সক্রিয় করা না থাকে তবে 'Enable' নির্বাচন করুন। আপনার নোটবুক ইনস্ট্যান্স তৈরি করার জন্য এটি প্রয়োজন হবে।
ধাপ ৩: একটি এআই প্ল্যাটফর্ম নোটবুক ইনস্ট্যান্স তৈরি করুন
আপনার ক্লাউড কনসোলের AI প্ল্যাটফর্ম নোটবুকস বিভাগে যান এবং নিউ ইনস্ট্যান্স-এ ক্লিক করুন। তারপর GPU ছাড়া টেনসরফ্লো এন্টারপ্রাইজ ২.১ ইনস্ট্যান্স টাইপটি নির্বাচন করুন:

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

যখন আপনি ইনস্ট্যান্সটি খুলবেন, তখন লঞ্চার থেকে পাইথন ৩ নোটবুক নির্বাচন করুন:

ধাপ ৪: পাইথন প্যাকেজগুলো ইম্পোর্ট করুন
একটি নতুন সেল তৈরি করুন এবং এই কোডল্যাবে আমরা যে লাইব্রেরিগুলো ব্যবহার করব সেগুলো ইম্পোর্ট করুন:
import itertools
import numpy as np
import pandas as pd
import tensorflow as tf
import json
import matplotlib as mpl
import matplotlib.pyplot as plt
import explainable_ai_sdk
from sklearn.utils import shuffle
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
from explainable_ai_sdk.metadata.tf.v2 import SavedModelMetadataBuilder
৪. ডেটা ডাউনলোড এবং প্রক্রিয়াকরণ করুন
আমাদের মডেলকে প্রশিক্ষণ দেওয়ার জন্য আমরা ক্যাগল থেকে কৃত্রিমভাবে তৈরি করা এই ডেটাসেটটি ব্যবহার করব। মূল ডেটাসেটটিতে ৬৩ লক্ষ সারি রয়েছে, যার মধ্যে ৮ হাজার হলো জাল লেনদেন — যা পুরো ডেটাসেটের মাত্র ০.১%!
ধাপ ১: Kaggle ডেটাসেটটি ডাউনলোড করুন এবং Pandas দিয়ে পড়ুন
আমরা আপনার জন্য ক্যাগল ডেটাসেটটি গুগল ক্লাউড স্টোরেজে উপলব্ধ করেছি। আপনি আপনার জুপিটার নোটবুকে নিম্নলিখিত gsutil কমান্ডটি চালিয়ে এটি ডাউনলোড করতে পারেন:
!gsutil cp gs://financial_fraud_detection/fraud_data_kaggle.csv .
এরপরে, ডেটাসেটটিকে একটি Pandas DataFrame হিসেবে পড়ে এর প্রিভিউ দেখা যাক:
data = pd.read_csv('fraud_data_kaggle.csv')
data = data.drop(columns=['type'])
data.head()
প্রিভিউতে আপনি এইরকম কিছু দেখতে পাবেন:

ধাপ ২: ভারসাম্যহীন ডেটার হিসাব রাখা
উপরে যেমন উল্লেখ করা হয়েছে, বর্তমানে ডেটাসেটটিতে ৯৯.৯% জালিয়াতিবিহীন উদাহরণ রয়েছে। যদি আমরা এই ডেটার উপর ভিত্তি করে একটি মডেলকে প্রশিক্ষণ দিই, তাহলে সম্ভাবনা আছে যে মডেলটি প্রতিটি লেনদেনকে জালিয়াতিবিহীন বলে অনুমান করে ৯৯.৯% নির্ভুলতায় পৌঁছাবে, কারণ ডেটার ৯৯.৯% হলো জালিয়াতিবিহীন ঘটনা।
ভারসাম্যহীন ডেটা সামলানোর জন্য কয়েকটি ভিন্ন পদ্ধতি রয়েছে। এখানে, আমরা ডাউনস্যাম্পলিং নামক একটি কৌশল ব্যবহার করব। ডাউনস্যাম্পলিং মানে হলো প্রশিক্ষণের সময় সংখ্যাগরিষ্ঠ শ্রেণীর (majority class) শুধুমাত্র একটি ক্ষুদ্র শতাংশ ব্যবহার করা। এই ক্ষেত্রে, 'নন-ফ্রড' হলো সংখ্যাগরিষ্ঠ শ্রেণী, কারণ এটি ডেটার ৯৯.৯% জুড়ে রয়েছে।
আমাদের ডেটাসেট ডাউনস্যাম্পল করার জন্য, আমরা প্রায় ৮ হাজার জালিয়াতিপূর্ণ উদাহরণ এবং জালিয়াতিহীন প্রায় ৩১ হাজার কেসের একটি র্যান্ডম স্যাম্পল নেব। এর ফলে প্রাপ্ত ডেটাসেটে জালিয়াতির হার হবে ২৫%, যেখানে আগে এই হার ছিল ০.১%।
প্রথমে, ডেটাগুলোকে দুটি ডেটাফ্রেমে ভাগ করুন, একটি জালিয়াতির জন্য এবং অন্যটি অ-জালিয়াতির জন্য (আমরা কোডল্যাবে পরে আমাদের মডেল স্থাপন করার সময় এটি ব্যবহার করব):
fraud = data[data['isFraud'] == 1]
not_fraud = data[data['isFraud'] == 0]
এরপর, জালিয়াতি নয় এমন লেনদেনগুলো থেকে দৈবচয়নের মাধ্যমে একটি নমুনা নিন। আমরা .০০৫% ব্যবহার করছি, কারণ এটি আমাদের জালিয়াতি এবং জালিয়াতি নয় এমন লেনদেনের একটি ২৫/৭৫ বিভাজন দেবে। এর সাহায্যে, আপনি ডেটাগুলো আবার একত্রিত করে এলোমেলো করতে পারেন। বিষয়গুলো সহজ করার জন্য আমরা এমন কয়েকটি কলামও সরিয়ে দেব যা আমরা প্রশিক্ষণের জন্য ব্যবহার করব না:
# Take a random sample of non fraud rows
not_fraud_sample = not_fraud.sample(random_state=2, frac=.005)
# Put it back together and shuffle
df = pd.concat([not_fraud_sample,fraud])
df = shuffle(df, random_state=2)
# Remove a few columns (isFraud is the label column we'll use, not isFlaggedFraud)
df = df.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud'])
# Preview the updated dataset
df.head()
এখন আমাদের কাছে অনেক বেশি ভারসাম্যপূর্ণ একটি ডেটাসেট আছে। তবে, যদি আমরা লক্ষ্য করি যে আমাদের মডেলটি প্রায় ৭৫% নির্ভুলতার কাছাকাছি এসে মিলিত হচ্ছে, তাহলে খুব সম্ভবত এটি প্রতিটি ক্ষেত্রেই 'প্রতারণা নয়' বলে অনুমান করছে।
ধাপ ৩: ডেটাগুলোকে ট্রেন এবং টেস্ট সেটে ভাগ করুন।
আমাদের মডেল তৈরি করার আগে শেষ কাজটি হলো ডেটা ভাগ করা। আমরা ৮০/২০ অনুপাতে ট্রেন-টেস্ট বিভাজন ব্যবহার করব:
train_test_split = int(len(df) * .8)
train_set = df[:train_test_split]
test_set = df[train_test_split:]
train_labels = train_set.pop('isFraud')
test_labels = test_set.pop('isFraud')
ই.এ. লোপেজ-রোজাস, এ. এলমির, এবং এস. অ্যাক্সেলসন। "পে-সিম: জালিয়াতি শনাক্তকরণের জন্য একটি আর্থিক মোবাইল মানি সিমুলেটর"। ২৮তম ইউরোপীয় মডেলিং অ্যান্ড সিমুলেশন সিম্পোজিয়াম-ইএমএসএস, লার্নাকা, সাইপ্রাস। ২০১৬
৫. একটি tf.keras মডেল তৈরি, প্রশিক্ষণ এবং মূল্যায়ন করুন।
আমরা TensorFlow-এর tf.keras API ব্যবহার করে মডেলটি তৈরি করব। এই অংশের মডেল কোডটি TensorFlow ডক্স-এর এই টিউটোরিয়ালের উপর ভিত্তি করে তৈরি করা হয়েছে। প্রথমে আমরা ডেটা নর্মালাইজ করব, এবং তারপরে অবশিষ্ট ডেটার ভারসাম্যহীনতা সামাল দেওয়ার জন্য class_weight প্যারামিটার ব্যবহার করে আমাদের মডেলটি তৈরি ও ট্রেইন করব।
ধাপ ১: ডেটা স্বাভাবিক করুন
সংখ্যাসূচক ডেটার উপর একটি মডেলকে প্রশিক্ষণ দেওয়ার সময়, ডেটা নর্মালাইজ করা গুরুত্বপূর্ণ, বিশেষ করে যদি প্রতিটি কলাম ভিন্ন ভিন্ন রেঞ্জে পড়ে। এটি প্রশিক্ষণের সময় লস (loss) হঠাৎ বেড়ে যাওয়া রোধ করতে সাহায্য করতে পারে। আমরা নিম্নলিখিত উপায়ে আমাদের ডেটা নর্মালাইজ করতে পারি:
scaler = StandardScaler()
train_set = scaler.fit_transform(train_set) # Only normalize on the train set
test_set = scaler.transform(test_set)
# clip() ensures all values fall within the range [-5,5]
# useful if any outliers remain after normalizing
train_set = np.clip(train_set, -5, 5)
test_set = np.clip(test_set, -5, 5)
তাহলে, চলুন আমাদের নর্মালাইজড ডেটা প্রিভিউ করে দেখি:
train_set
ধাপ ২: শ্রেণিভিত্তিক ওজন নির্ধারণ করুন
ডেটা ডাউনস্যাম্পলিং করার সময়, আমরা জালিয়াতিবিহীন লেনদেনগুলোর একটি উপসেট রাখতে চেয়েছিলাম যাতে সেই লেনদেনগুলোর তথ্য হারিয়ে না যায়, আর একারণেই আমরা ডেটাটিকে পুরোপুরি ভারসাম্যপূর্ণ করিনি। যেহেতু ডেটাসেটটি এখনও ভারসাম্যহীন এবং আমরা জালিয়াতিপূর্ণ লেনদেনগুলো সঠিকভাবে শনাক্ত করার বিষয়ে সবচেয়ে বেশি আগ্রহী, তাই আমরা চাই আমাদের মডেলটি ডেটাসেটের জালিয়াতিপূর্ণ উদাহরণগুলোকে বেশি গুরুত্ব দিক ।
Keras-এর class_weight প্যারামিটারটি আমাদেরকে ডেটাসেটে প্রতিটি ক্লাসের উদাহরণগুলোর উপস্থিতির হারের উপর ভিত্তি করে, সেগুলোকে ঠিক কতটা গুরুত্ব দিতে চাই তা নির্দিষ্ট করার সুযোগ দেয়:
weight_for_non_fraud = 1.0 / df['isFraud'].value_counts()[0]
weight_for_fraud = 1.0 / df['isFraud'].value_counts()[1]
class_weight = {0: weight_for_non_fraud, 1: weight_for_fraud}
পরবর্তী ধাপে আমাদের মডেলকে প্রশিক্ষণ দেওয়ার সময় আমরা এই ভেরিয়েবলটি ব্যবহার করব।
ধাপ ৩: মডেলটিকে প্রশিক্ষণ ও মূল্যায়ন করুন।
আমরা Keras Sequential Model API ব্যবহার করে আমাদের মডেলটি তৈরি করব, যা আমাদের মডেলকে কয়েকটি লেয়ারের একটি স্ট্যাক হিসেবে সংজ্ঞায়িত করার সুযোগ দেয়। মডেল প্রশিক্ষণের সময় আমরা বেশ কিছু মেট্রিক ট্র্যাক করব, যা আমাদের ডেটাসেটের প্রতিটি ক্লাসের উপর মডেলটির পারফরম্যান্স বুঝতে সাহায্য করবে।
METRICS = [
keras.metrics.TruePositives(name='tp'),
keras.metrics.FalsePositives(name='fp'),
keras.metrics.TrueNegatives(name='tn'),
keras.metrics.FalseNegatives(name='fn'),
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc'),
]
def make_model(metrics = METRICS):
model = keras.Sequential([
keras.layers.Dense(
16, activation='relu',
input_shape=(train_set.shape[-1],)),
keras.layers.Dropout(0.5),
keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
optimizer=keras.optimizers.Adam(lr=1e-3),
loss=keras.losses.BinaryCrossentropy(),
metrics=metrics)
return model
এরপর, আমরা ট্রেনিংয়ের সময় ব্যবহারের জন্য কয়েকটি গ্লোবাল ভেরিয়েবল এবং কিছু আর্লি স্টপিং প্যারামিটার নির্ধারণ করব।
EPOCHS = 100
BATCH_SIZE = 512
early_stopping = tf.keras.callbacks.EarlyStopping(
monitor='val_auc',
verbose=1,
patience=10,
mode='max',
restore_best_weights=True)
অবশেষে, আমাদের মডেলটি তৈরি করার জন্য আমরা উপরে সংজ্ঞায়িত ফাংশনটি কল করব:
model = make_model()
model.summary()
আমরা উপরে সংজ্ঞায়িত প্যারামিটারগুলো পাস করে fit() মেথডের মাধ্যমে আমাদের মডেলকে প্রশিক্ষণ দিতে পারি:
results = model.fit(
train_set,
train_labels,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks = [early_stopping],
validation_data=(test_set, test_labels),
class_weight=class_weight)
প্রশিক্ষণটি সম্পন্ন হতে কয়েক মিনিট সময় লাগবে।
ধাপ ৪: মডেল মেট্রিক্স কল্পনা করুন
এখন যেহেতু আমাদের কাছে একটি প্রশিক্ষিত মডেল আছে, চলুন আমাদের প্রশিক্ষণ পর্বগুলো জুড়ে বিভিন্ন মেট্রিক প্লট করে দেখি মডেলটি কেমন পারফর্ম করেছে:
mpl.rcParams['figure.figsize'] = (12, 10)
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
def plot_metrics(history):
metrics = ['loss', 'auc', 'precision', 'recall']
for n, metric in enumerate(metrics):
name = metric.replace("_"," ").capitalize()
plt.subplot(2,2,n+1)
plt.plot(history.epoch, history.history[metric], color=colors[0], label='Train')
plt.plot(history.epoch, history.history['val_'+metric],
color=colors[0], linestyle="--", label='Val')
plt.xlabel('Epoch')
plt.ylabel(name)
if metric == 'loss':
plt.ylim([0, plt.ylim()[1]])
elif metric == 'auc':
plt.ylim([0.8,1])
else:
plt.ylim([0,1])
plt.legend()
plot_metrics(results)
আপনার গ্রাফগুলো নিচেরটির মতো দেখতে হবে (তবে হুবহু একই হবে না):

ধাপ ৫: একটি কনফিউশন ম্যাট্রিক্স প্রিন্ট করুন।
টেস্ট ডেটাসেট জুড়ে আমাদের মডেলটি কেমন পারফর্ম করেছে তা দেখার জন্য কনফিউশন ম্যাট্রিক্স একটি চমৎকার উপায়। প্রতিটি ক্লাসের জন্য, এটি আমাদের দেখাবে যে আমাদের মডেল কত শতাংশ টেস্ট উদাহরণ সঠিকভাবে এবং কত শতাংশ ভুলভাবে প্রেডিক্ট করেছে। স্কিকিট লার্নে কনফিউশন ম্যাট্রিক্স তৈরি এবং প্লট করার জন্য কিছু ইউটিলিটি রয়েছে, যা আমরা এখানে ব্যবহার করব।
আমাদের নোটবুকের শুরুতে আমরা confusion_matrix ইউটিলিটিটি ইম্পোর্ট করেছিলাম। এটি ব্যবহার করার জন্য, আমরা প্রথমে আমাদের মডেলের প্রেডিকশনগুলোর একটি তালিকা তৈরি করব। এখানে আমরা আমাদের মডেল থেকে প্রাপ্ত মানগুলোকে রাউন্ড করব, যাতে এই তালিকাটি আমাদের গ্রাউন্ড ট্রুথ লেবেলের তালিকার সাথে মিলে যায়:
predicted = model.predict(test_set)
y_pred = []
for i in predicted.tolist():
y_pred.append(int(round(i[0])))
এখন আমরা আমাদের গ্রাউন্ড ট্রুথ লেবেলগুলোর সাথে এটিকে confusion_matrix মেথডে ফিড করার জন্য প্রস্তুত:
cm = confusion_matrix(test_labels.values, y_pred)
print(cm)
এটি আমাদের টেস্ট সেটে মডেলের সঠিক এবং ভুল ভবিষ্যদ্বাণীর সঠিক সংখ্যা দেখায়। উপরের বাম দিকের সংখ্যাটি দেখায় যে আমাদের মডেল টেস্ট সেট থেকে কতগুলো উদাহরণকে সঠিকভাবে জালিয়াতিহীন হিসেবে ভবিষ্যদ্বাণী করেছে। নিচের ডান দিকের সংখ্যাটি দেখায় যে এটি কতগুলোকে সঠিকভাবে জালিয়াতিপূর্ণ হিসেবে ভবিষ্যদ্বাণী করেছে (এই সংখ্যাটিই আমাদের কাছে সবচেয়ে গুরুত্বপূর্ণ)। আপনি দেখতে পাচ্ছেন যে এটি প্রতিটি শ্রেণীর জন্য অধিকাংশ নমুনাকেই সঠিকভাবে ভবিষ্যদ্বাণী করেছে।
বিষয়টি সহজে কল্পনা করার জন্য, আমরা Scikit Learn ডক্স থেকে plot_confusion_matrix ফাংশনটি গ্রহণ করেছি। ফাংশনটি এখানে সংজ্ঞায়িত করুন:
def plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
if normalize:
cm = np.round(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], 3)
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
এবং আমাদের মডেল থেকে ডেটা দিয়ে প্লটটি তৈরি করুন। আমরা এখানে normalize কে True সেট করছি যাতে কনফিউশন ম্যাট্রিক্সটি সঠিক এবং ভুল ভবিষ্যদ্বাণীর সংখ্যা শতাংশ হিসাবে প্রদর্শন করে:
classes = ['not fraud', 'fraud']
plot_confusion_matrix(cm, classes, normalize=True)
আপনি এইরকম কিছু দেখতে পাবেন (সঠিক সংখ্যা ভিন্ন হতে পারে):

এখানে আমরা দেখতে পাচ্ছি যে, আমাদের মডেলটি আমাদের টেস্ট সেটের ১,৫৯৪টি জালিয়াতিপূর্ণ লেনদেনের প্রায় ৮৫% সঠিকভাবে শনাক্ত করেছে। উল্লেখ্য যে, এই ল্যাবের মূল লক্ষ্য মডেলের গুণমান নয় – আপনি যদি প্রোডাকশনে কোনো জালিয়াতি শনাক্তকরণ মডেল ব্যবহার করেন, তবে আপনি সম্ভবত জালিয়াতি শ্রেণিতে ৮৫%-এর বেশি নির্ভুলতা চাইবেন। এই ল্যাবের উদ্দেশ্য হলো ভারসাম্যহীন ডেটাসেটে প্রশিক্ষিত মডেল ব্যাখ্যা করার জন্য ব্যবহৃত টুলগুলোর সাথে আপনাকে পরিচিত করানো।
এরপরে, আমাদের মডেলটি এই পূর্বাভাসগুলো দেওয়ার জন্য কোন বৈশিষ্ট্যগুলোর ওপর নির্ভর করছে তা বোঝার জন্য আমরা এক্সপ্লেইনেবল এআই এসডিকে (Explainable AI SDK) ব্যবহার করব।
৬. এক্সপ্লেইনেবল এআই এসডিকে ব্যবহার করা
এক্সপ্লেইনেবল এআই এসডিকে আপনার মডেল সম্পর্কে ব্যাখ্যা পাওয়ার জন্য ইউটিলিটি মেথড সরবরাহ করে। এটি টেনসরফ্লো এআই প্ল্যাটফর্ম নোটবুক ইনস্ট্যান্সগুলোতে আগে থেকেই ইনস্টল করা থাকে – লক্ষ্য করুন যে, আমরা আমাদের ল্যাবের শুরুতে এটি আমাদের নোটবুকে ইম্পোর্ট করেছিলাম। এই এসডিকে-র সাহায্যে, আমরা নোটবুক ইনস্ট্যান্সের মধ্যেই আমাদের মডেলের ফিচার অ্যাট্রিবিউশন পেতে পারি, যার অর্থ হলো এটি ব্যবহার করার জন্য আমাদের মডেলটিকে ক্লাউডে ডেপ্লয় করার প্রয়োজন নেই।
এই অংশে, আমরা এইমাত্র প্রশিক্ষণ দেওয়া মডেলটিকে একটি Tensorflow SavedModel হিসেবে এক্সপোর্ট করব এবং তারপর ব্যাখ্যা পাওয়ার জন্য আমাদের সংরক্ষিত মডেল অ্যাসেটগুলোর দিকে SDK-কে নির্দেশ করব।
ধাপ ১: প্রশিক্ষিত মডেল রপ্তানি করুন
প্রথমে, আমাদের মডেলটিকে নোটবুক ইনস্ট্যান্সের একটি ডিরেক্টরিতে সেভ করা যাক:
model_dir = 'fraud_model'
tf.saved_model.save(model, model_dir)
আপনি যদি আপনার নোটবুকের বাম সাইডবারে থাকা ফোল্ডার ভিউটি রিফ্রেশ করেন, তাহলে দেখবেন fraud_model/ নামে একটি নতুন ডিরেক্টরি তৈরি হয়েছে।
ধাপ ২: SDK ব্যবহার করে ব্যাখ্যার মেটাডেটা সংগ্রহ করুন।
এরপরে, আমরা এক্সপ্লেইনেবল এআই এসডিকে-কে ওই ডিরেক্টরিতে নির্দেশ করব। এটি করলে মডেলের ব্যাখ্যা পাওয়ার জন্য প্রয়োজনীয় মেটাডেটা তৈরি হবে। get_metadata() মেথডটি সেইসব মেটাডেটা দেখায় যা এসডিকে আপনার মডেল থেকে অনুমান করে, যেমন ইনপুটের নাম:
model_builder = SavedModelMetadataBuilder(model_dir)
metadata = model_builder.get_metadata()
print(metadata)
ব্যাখ্যাযোগ্যতা আমাদের এই প্রশ্নের উত্তর দিতে সাহায্য করে: "আমাদের মডেল কেন এটিকে জালিয়াতি বলে মনে করেছিল?"
ধাপ ৩: আমাদের মডেলের বেসলাইন নির্দিষ্ট করা
সারণীভুক্ত ডেটার ক্ষেত্রে, এক্সপ্লেইনেবল এআই পরিষেবাটি প্রতিটি ফিচারের জন্য অ্যাট্রিবিউশন ভ্যালু রিটার্ন করার মাধ্যমে কাজ করে। এই ভ্যালুগুলো নির্দেশ করে যে একটি নির্দিষ্ট ফিচার প্রেডিকশনকে কতটা প্রভাবিত করেছে। ধরা যাক, একটি নির্দিষ্ট লেনদেনের পরিমাণ আমাদের মডেলকে তার পূর্বাভাসিত জালিয়াতির সম্ভাবনা ০.২% বাড়িয়ে দিয়েছে। আপনি হয়তো ভাবছেন, "কিসের সাপেক্ষে ০.২%??"। এটিই আমাদের বেসলাইন ধারণার দিকে নিয়ে আসে।
আমাদের মডেলের বেসলাইন হলো মূলত সেই মান, যার সাথে এটি তুলনা করে। আমরা আমাদের মডেলের প্রতিটি ফিচারের জন্য বেসলাইন মান নির্বাচন করি, এবং ফলস্বরূপ বেসলাইন প্রেডিকশনটি সেই মান হয়ে ওঠে যা আমাদের মডেল প্রেডিক্ট করে যখন ফিচারগুলো বেসলাইনে সেট করা থাকে।
আপনি কোন ভবিষ্যদ্বাণীমূলক কাজটি সমাধান করছেন, তার উপর বেসলাইন নির্বাচন নির্ভর করে। সংখ্যাসূচক বৈশিষ্ট্যের ক্ষেত্রে, আপনার ডেটাসেটের প্রতিটি বৈশিষ্ট্যের মধ্যমা মানকে বেসলাইন হিসেবে ব্যবহার করা সাধারণ। তবে, জালিয়াতি শনাক্তকরণের ক্ষেত্রে, আমরা ঠিক এটি চাই না। আমাদের কাছে সবচেয়ে গুরুত্বপূর্ণ হলো সেইসব ক্ষেত্র ব্যাখ্যা করা, যখন আমাদের মডেল একটি লেনদেনকে জালিয়াতিপূর্ণ হিসেবে চিহ্নিত করে। এর মানে হলো, আমরা যে বেসলাইন ক্ষেত্রের সাথে তুলনা করতে চাই, তা হলো জালিয়াতিবিহীন লেনদেন।
এই বিষয়টি বিবেচনা করার জন্য, আমরা আমাদের ডেটাসেটের জালিয়াতিবিহীন লেনদেনগুলোর মধ্যক মানকে ভিত্তি হিসেবে ব্যবহার করব। আমরা উপরে এক্সট্র্যাক্ট করা not_fraud_sample ডেটাফ্রেমটি ব্যবহার করে এবং আমাদের মডেলের প্রত্যাশিত ইনপুটগুলোর সাথে মেলানোর জন্য এটিকে স্কেল করে মধ্যকটি পেতে পারি:
not_fraud_sample = not_fraud_sample.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud', 'isFraud'])
baseline = scaler.transform(not_fraud_sample.values)
baseline = np.clip(baseline, -5, 5)
baseline_values = np.median(baseline, axis=0)
উল্লেখ্য যে, আমাদের কোনো বেসলাইন নির্দিষ্ট করার প্রয়োজন নেই। যদি আমরা তা না করি, তাহলে SDK আমাদের মডেলের প্রত্যাশিত প্রতিটি ইনপুট মানের জন্য বেসলাইন হিসেবে ০ ব্যবহার করবে। আমাদের জালিয়াতি শনাক্তকরণের ক্ষেত্রে একটি বেসলাইন নির্দিষ্ট করা যুক্তিযুক্ত, যা আমরা নিচে করব:
input_name = list(metadata['inputs'])[0]
model_builder.set_numeric_metadata(input_name, input_baselines=[baseline_values.tolist()], index_feature_mapping=df.columns.tolist()[:6])
model_builder.save_metadata(model_dir)
উপরে save_metadata() মেথডটি চালানোর ফলে আমাদের মডেলের ডিরেক্টরিতে explanation_metadata.json নামে একটি ফাইল তৈরি হয়েছে। আপনার নোটবুকে, fraud_model/ ডিরেক্টরিতে গিয়ে ফাইলটি তৈরি হয়েছে কিনা তা নিশ্চিত করুন। এতে এমন মেটাডেটা রয়েছে যা SDK ফিচার অ্যাট্রিবিউশন তৈরি করতে ব্যবহার করবে।
ধাপ ৪: মডেলের ব্যাখ্যা পাওয়া
আমরা এখন স্বতন্ত্র উদাহরণগুলিতে ফিচার অ্যাট্রিবিউশন পেতে প্রস্তুত। তা করার জন্য, আমরা প্রথমে SDK ব্যবহার করে আমাদের মডেলের একটি স্থানীয় রেফারেন্স তৈরি করব:
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig()
)
এরপরে, জালিয়াতি হিসাবে শ্রেণীবদ্ধ করা উচিত এমন একটি উদাহরণ লেনদেন থেকে আমাদের মডেলের পূর্বাভাস এবং ব্যাখ্যা জেনে নেওয়া যাক:
fraud_example = [0.722,0.139,-0.114,-0.258,-0.271,-0.305]
response = local_model.explain([{input_name: fraud_example}])
response[0].visualize_attributions()
এটি চালালে নিচের ছবির মতো একটি ভিজ্যুয়ালাইজেশন তৈরি হবে:

এই উদাহরণে, লেনদেনটি সংঘটিত হওয়ার আগে অ্যাকাউন্টের প্রাথমিক ব্যালেন্সই ছিল জালিয়াতির সবচেয়ে বড় সূচক, যা আমাদের মডেলের পূর্বাভাসকে বেসলাইন থেকে ০.৫-এর বেশি বাড়িয়ে দিয়েছে। লেনদেনের পরিমাণ, গন্তব্য অ্যাকাউন্টের চূড়ান্ত ব্যালেন্স এবং স্টেপ ছিল এর পরের সবচেয়ে বড় সূচকগুলো। ডেটাসেটে, 'স্টেপ' সময়ের একটি একককে বোঝায় (১ স্টেপ হলো ১ ঘণ্টা)। অ্যাট্রিবিউশন মান নেতিবাচকও হতে পারে।
ভিজ্যুয়ালাইজেশনের উপরে মুদ্রিত 'অ্যাপ্রক্সিমেশন এরর' আপনাকে জানিয়ে দেয় যে ব্যাখ্যাটি কতটা বিশ্বাসযোগ্য। সাধারণত, ৫% এর বেশি এররের অর্থ হলো আপনি ফিচার অ্যাট্রিবিউশনগুলোর উপর নির্ভর করতে পারবেন না। মনে রাখবেন, আপনার ব্যাখ্যাগুলো ততটাই ভালো হবে, যতটা ভালো ট্রেনিং ডেটা এবং মডেল আপনি ব্যবহার করেছেন। আপনার ট্রেনিং ডেটা ও মডেলের উন্নতি করা, অথবা একটি ভিন্ন মডেল বেসলাইন চেষ্টা করা অ্যাপ্রক্সিমেশন এরর কমাতে পারে।
আপনার ব্যাখ্যা পদ্ধতিতে ব্যবহৃত ধাপের সংখ্যা বাড়িয়েও আপনি এই ত্রুটি কমাতে সক্ষম হতে পারেন। আপনি SDK-এর মাধ্যমে আপনার ব্যাখ্যা কনফিগে একটি path_count প্যারামিটার যোগ করে এটি পরিবর্তন করতে পারেন (যদি আপনি নির্দিষ্ট না করেন তবে ডিফল্ট মান ১০ থাকে):
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig(path_count=20)
)
এই মডেলে এক্সপ্লেইনেবল এআই দিয়ে আরও অনেক কিছু করা সম্ভব। কয়েকটি ধারণা নিচে দেওয়া হলো:
- আমাদের মডেলে অনেকগুলো উদাহরণ পাঠিয়ে অ্যাট্রিবিউশন ভ্যালুগুলোর গড় করে দেখা হচ্ছে যে, কোনো নির্দিষ্ট ফিচার সামগ্রিকভাবে বেশি গুরুত্বপূর্ণ কিনা। এটি ব্যবহার করে আমরা আমাদের মডেলকে উন্নত করতে পারি এবং প্রয়োজনে গুরুত্বহীন ফিচারগুলো বাদও দিতে পারি।
- এমন সব ফলস পজিটিভ খুঁজে বের করা, যেগুলোকে আমাদের মডেল জালিয়াতি হিসেবে চিহ্নিত করে কিন্তু সেগুলো আসলে জালিয়াতি নয়, এবং সেগুলোর অ্যাট্রিবিউশন ভ্যালু পরীক্ষা করা।
- একটি ভিন্ন বেসলাইন ব্যবহার করুন এবং দেখুন এটি অ্যাট্রিবিউশন মানগুলিকে কীভাবে প্রভাবিত করে।
🎉 অভিনন্দন! 🎉
আপনি শিখেছেন কীভাবে ভারসাম্যহীন ডেটা সামাল দিতে হয়, জালিয়াতিপূর্ণ লেনদেন শনাক্ত করার জন্য একটি TensorFlow মডেলকে প্রশিক্ষণ দিতে হয়, এবং স্বতন্ত্র পূর্বাভাস দেওয়ার জন্য আপনার মডেলটি কোন বৈশিষ্ট্যগুলির উপর সবচেয়ে বেশি নির্ভর করছে তা দেখতে Explainable AI SDK ব্যবহার করতে হয়। আপনি চাইলে এখানেই থেমে যেতে পারেন। একটি নোটবুকের মধ্যে SDK ব্যবহার করার উদ্দেশ্য হলো, মডেলটি ডেপ্লয় করার আগেই তার ব্যাখ্যাগুলো দেখার সুযোগ দিয়ে আপনার মডেল তৈরির প্রক্রিয়াকে সহজ করে তোলা। সম্ভাবনা আছে যে, একবার আপনি আপনার পছন্দের একটি মডেল তৈরি করে ফেললে, বড় পরিসরে পূর্বাভাস পাওয়ার জন্য আপনি সেটি ডেপ্লয় করতে চাইবেন। যদি আপনার ক্ষেত্রেও এমনটা হয়, তবে ঐচ্ছিক পরবর্তী ধাপে এগিয়ে যান। আপনার কাজ শেষ হলে, সরাসরি Cleanup ধাপে চলে যান।
৭. ঐচ্ছিক: মডেলটিকে এআই প্ল্যাটফর্ম প্রেডিকশনে স্থাপন করুন।
এই ধাপে, আপনি শিখবেন কীভাবে আপনার মডেলটি এআই প্ল্যাটফর্ম প্রেডিকশনে স্থাপন করতে হয়।
ধাপ ১: আপনার সংরক্ষিত মডেল ডিরেক্টরিটি একটি ক্লাউড স্টোরেজ বাকেটে কপি করুন।
পূর্বে সম্পন্ন করা SDK ধাপগুলোর মাধ্যমে, আপনার মডেলটি AI প্ল্যাটফর্মে ডেপ্লয় করার জন্য প্রয়োজনীয় সবকিছুই আপনার কাছে রয়েছে। ডেপ্লয়মেন্টের প্রস্তুতি হিসেবে, আপনাকে আপনার SavedModel অ্যাসেট এবং এক্সপ্লানেশন মেটাডেটা এমন একটি ক্লাউড স্টোরেজ বাকেটে রাখতে হবে যা এক্সপ্লেইনেবল AI সার্ভিসটি পড়তে পারে।
এটি করার জন্য, আমরা কিছু এনভায়রনমেন্ট ভেরিয়েবল নির্ধারণ করব। নিচের ভ্যালুগুলোতে আপনার গুগল ক্লাউড প্রজেক্টের নাম এবং যে বাকেটটি আপনি তৈরি করতে চান তার নাম পূরণ করুন (নামটি অবশ্যই গ্লোবালি ইউনিক হতে হবে)।
# Update these to your own GCP project and model
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
এখন আমরা আমাদের এক্সপোর্ট করা TensorFlow মডেল অ্যাসেটগুলো সংরক্ষণ করার জন্য একটি স্টোরেজ বাকেট তৈরি করতে প্রস্তুত। মডেলটি ডিপ্লয় করার সময় আমরা AI Platform-কে এই বাকেটটি নির্দেশ করব।
একটি বাকেট তৈরি করতে আপনার নোটবুকের ভেতর থেকে এই gsutil কমান্ডটি চালান:
!gsutil mb -l 'us-central1' $MODEL_BUCKET
তারপর, আপনার লোকাল মডেল ডিরেক্টরিটি ওই বাকেটে কপি করুন:
!gsutil -m cp -r ./$model_dir/* $MODEL_BUCKET/explanations
ধাপ ২: মডেলটি স্থাপন করুন
এরপরে, আমরা কিছু ভেরিয়েবল নির্ধারণ করব যা আমাদের ডিপ্লয়মেন্ট কমান্ডে ব্যবহার করা হবে:
MODEL = 'fraud_detection'
VERSION = 'v1'
model_path = MODEL_BUCKET + '/explanations'
আমরা নিম্নলিখিত gcloud কমান্ডের সাহায্যে মডেলটি তৈরি করতে পারি:
!gcloud ai-platform models create $MODEL --region=us-central1
এখন আমরা gcloud ব্যবহার করে এই মডেলের প্রথম সংস্করণটি ডেপ্লয় করার জন্য প্রস্তুত। সংস্করণটি ডেপ্লয় হতে প্রায় ৫-১০ মিনিট সময় লাগবে।
!gcloud beta ai-platform versions create $VERSION \
--model $MODEL \
--origin $model_path \
--runtime-version 2.1 \
--framework TENSORFLOW \
--python-version 3.7 \
--machine-type n1-standard-4 \
--explanation-method 'sampled-shapley' \
--num-paths 10 \
--region=us-central1
origin ফ্ল্যাগে, আমরা আমাদের সংরক্ষিত মডেল এবং মেটাডেটা ফাইলের ক্লাউড স্টোরেজ লোকেশন পাস করি। এক্সপ্লেইনেবল এআই-এর কাছে বর্তমানে ট্যাবুলার মডেলের জন্য দুটি ভিন্ন ব্যাখ্যা পদ্ধতি উপলব্ধ আছে। এখানে আমরা স্যাম্পলড শ্যাপলি ব্যবহার করছি। num-paths প্যারামিটারটি প্রতিটি ইনপুট ফিচারের জন্য স্যাম্পল করা পাথের সংখ্যা নির্দেশ করে। সাধারণত, মডেল যত বেশি জটিল হয়, যুক্তিসঙ্গত কনভার্জেন্সে পৌঁছানোর জন্য তত বেশি অ্যাপ্রক্সিমেশন স্টেপের প্রয়োজন হয়।
আপনার মডেলটি সঠিকভাবে ডেপ্লয় হয়েছে কিনা তা নিশ্চিত করতে, নিম্নলিখিত gcloud কমান্ডটি চালান:
!gcloud ai-platform versions describe $VERSION --model $MODEL --region=us-central1
রাষ্ট্রকে READY থাকতে হবে।
ধাপ ৩: স্থাপন করা মডেলের পূর্বাভাস এবং ব্যাখ্যা পাওয়া
ব্যাখ্যাযোগ্যতার স্বার্থে, আমাদের মডেল যেসব ক্ষেত্রে জালিয়াতির পূর্বাভাস দেয়, সেই ক্ষেত্রগুলো ব্যাখ্যা করার ওপর আমরা সবচেয়ে বেশি গুরুত্ব দিই। আমরা আমাদের মডেলে ৫টি পরীক্ষার উদাহরণ পাঠাব, যেগুলো সবই জালিয়াতিপূর্ণ লেনদেন।
আমরা পূর্বাভাস পেতে গুগল ক্লাউড সিএলআই ব্যবহার করব। আমাদের টেস্ট সেট থেকে সমস্ত জালিয়াতির উদাহরণের সূচকগুলি পেতে নিম্নলিখিত কোডটি চালান:
fraud_indices = []
for i,val in enumerate(test_labels):
if val == 1:
fraud_indices.append(i)
এরপরে আমরা আমাদের মডেলের প্রত্যাশিত ফরম্যাটে ৫টি উদাহরণ সংরক্ষণ করব এবং সেগুলোকে একটি ফাইলে লিখব:
num_test_examples = 5
instances = []
for i in range(num_test_examples):
ex = test_set[fraud_indices[i]]
instances.append({input_name: ex.tolist()})
with open('prediction.json', 'a') as outputfile:
json.dump({"instances": instances}, outputfile)
আমরা gcloud ব্যবহার করে এই পাঁচটি উদাহরণ আমাদের মডেলে পাঠাতে পারি:
!gcloud beta ai-platform explain \
--model=$MODEL \
--version=$VERSION \
--region='us-central1' \
--json-request=prediction.json
রেসপন্স JSON-এ, আপনি এই উদাহরণগুলো জুড়ে প্রতিটি ফিচারের অ্যাট্রিবিউশন ভ্যালু দেখতে পাবেন। প্রতিটি উদাহরণের example_score কী-তে মডেলের প্রেডিকশন অন্তর্ভুক্ত থাকে — এক্ষেত্রে, একটি নির্দিষ্ট লেনদেন জালিয়াতিপূর্ণ হওয়ার সম্ভাবনার শতাংশ।
৮. পরিচ্ছন্নতা
আপনি যদি এই নোটবুকটি ব্যবহার করা চালিয়ে যেতে চান, তবে ব্যবহার না করার সময় এটি বন্ধ করে রাখার পরামর্শ দেওয়া হচ্ছে। আপনার ক্লাউড কনসোলের নোটবুকস UI থেকে, নোটবুকটি নির্বাচন করুন এবং তারপরে স্টপ (Stop ) নির্বাচন করুন।

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