কম্পিউটার টিউটোরিয়াল

পাইথনে ফ্রড ডিটেকশন (Fraud Detection)


বহুতранজ্যাকশনে ফ্রড খুবই কমন। আমরা মেশিন লার্নিং অ্যালগরিদম ব্যবহার করে অতীতের ডেটা বিশ্লেষণ করব এবং একটি ট্রানজ্যাকশন ফ্রড কিনা তা প্রিডিক্ট করব। আমাদের উদাহরণে আমরা ক্রেডিট কার্ড ট্রানজ্যাকশন নেব, ডেটা অ্যানালাইসিস করব, ফিচার এবং লেবেল তৈরি করব এবং cuốiে একটি ML অ্যালগরিদম প্রয়োগ করব ট্রানজ্যাকশনের প্রকৃতি ফ্রড কিনা তা জজ করতে। তারপর আমাদের চয়ন করা মডেলের একুরেসি, প্রিসিশন এবং F-স্কোর বের করব।

ডেটা প্রিপারেশন

এই ধাপে আমরা সোর্স ডেটা পড়ব, ভেরিয়েবলগুলো অধ্যয়ন করব এবং কিছু স্যাম্পল ডেটা দেখব। এটি আমাদের ডেটাসেটে কোন কোন কলাম আছে এবং তাদের ফিচার বুঝতে সাহায্য করবে। আমরা Pandas লাইব্রেরি ব্যবহার করে ডেটাফ্রেম তৈরি করব যা পরবর্তী ধাপগুলোতে ব্যবহার হবে।

উদাহরণ

import pandas as pd
# creditcard.csv পান্ডাস দিয়ে লোড করা হচ্ছে
datainput = pd.read_csv('E:\\creditcard.csv')
# https://www.kaggle.com/mlg-ulb/creditcardfraud
# শীর্ষ ৫ রেকর্ড প্রিন্ট
print(datainput[0:5], "\n")
# সম্পূর্ণ ডেটাসেটের শেপ প্রিন্ট
print("Shape of Complete Data Set")
print(datainput.shape, "\n")

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

    Time        V1        V2        V3 ...       V27       V28  Amount  Class
0  0.0 -1.359807 -0.072781  2.536347 ...  0.133558 -0.021053  149.62  0
1  0.0  1.191857  0.266151  0.166480 ... -0.008983  0.014724    2.69  0
2  1.0 -1.358354 -1.340163  1.773209 ... -0.055353 -0.059752  378.66  0
3  1.0 -0.966272 -0.185226  1.792993 ...  0.062723  0.061458  123.50  0
4  2.0 -1.158233  0.877737  1.548718 ...  0.219422  0.215153   69.99  0
[5 rows x 31 columns]
Shape of Complete Data Set
(284807, 31)

ডেটায় ইমব্যালেন্স চেক করা

এখন চেক করব ডেটা কীভাবে ফ্রডুলেন্ট এবং জেনুইন ট্রানজ্যাকশনে বন্টেছে। এটি আমাদের আইডিয়া দেবে কত শতাংশ ডেটা ফ্রডুলেন্ট হওয়া আশা করা হয়। ML অ্যালগরিদমে এটিকে ডেটা ইমব্যালেন্স বলা হয়। যদি অধিকাংশ ট্রানজ্যাকশন ফ্রড না হয়, তবে কিছু ট্রানজ্যাকশন জেনুইন কিনা তা জজ করা কঠিন হয়। আমরা Class কলাম ব্যবহার করে ফ্রডুলেন্ট এবং জেনুইন ট্রানজ্যাকশনের সংখ্যা গুনব এবং ফ্রডুলেন্ট ট্রানজ্যাকশনের আসল পার্সেন্টেজ বের করব।

উদাহরণ

import pandas as pd
datainput = pd.read_csv('E:\\creditcard.csv')
false = datainput[datainput['Class'] == 1]
true = datainput[datainput['Class'] == 0]
n = len(false) / float(len(true))
print(n)
print('False Detection Cases: {}'.format(len(datainput[datainput['Class'] == 1])))
print('True Detection Cases: {}'.format(len(datainput[datainput['Class'] == 0])), "\n")

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

0.0017304750013189597
False Detection Cases: 492
True Detection Cases: 284315

ট্রানজ্যাকশন টাইপের বিস্তারিত

আমরা ফ্রডুলেন্ট এবং নন-ফ্রডুলেন্ট ট্রানজ্যাকশনের ক্যাটাগরি অনুযায়ী ভেতর থেকে তদন্ত করব। আমরা মিন, ম্যাক্স, মিন, স্ট্যান্ডার্ড ডেভিয়েশন, বিভিন্ন পার্সেন্টাইল ইত্যাদি স্ট্যাটিস্টিক্যালি এসটিমেট করার চেষ্টা করব। এটি describe মেথড দিয়ে অর্জন করা যায়।

উদাহরণ

import pandas as pd
datainput = pd.read_csv('E:\\creditcard.csv')
false = datainput[datainput['Class'] == 1]
true = datainput[datainput['Class'] == 0]
# False Detection Cases
print("False Detection Cases")
print("----------------------")
print(false.Amount.describe(), "\n")
# True Detection Cases
print("True Detection Cases")
print("----------------------")
print(true.Amount.describe(), "\n")

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

False Detection Cases
----------------------
count    492.000000
mean     122.211321
std      256.683288
min        0.000000
25%        1.000000
50%        9.250000
75%      105.890000
max     2125.870000
Name: Amount, dtype: float64
True Detection Cases
----------------------
count    284315.000000
mean      88.291022
std      250.105092
min        0.000000
25%        5.650000
50%       22.000000
75%       77.050000
max     25691.160000
Name: Amount, dtype: float64

ফিচার এবং লেবেল আলাদা করা

ML অ্যালগরিদম ইমপ্লিমেন্ট করার আগে আমাদের ফিচার এবং লেবেল ঠিক করতে হবে। অর্থাৎ ডিপেন্ডেন্ট এবং ইন্ডিপেন্ডেন্ট ভেরিয়েবল ক্যাটাগরাইজ করা। আমাদের ডেটাসেটে Class কলাম বাকি সব কলামের ওপর ডিপেন্ডেন্ট। তাই আমরা লাস্ট কলামের জন্য একটি ডেটাফ্রেম এবং বাকি সব কলামের জন্য আরেকটি ডেটাফ্রেম তৈরি করব। এই ডেটাফ্রেমগুলো মডেল ট্রেন করার জন্য ব্যবহার হবে।

উদাহরণ

import pandas as pd
datainput = pd.read_csv('E:\\creditcard.csv')
# ফিচার (X) এবং লেবেল (y) আলাদা করা
# লাস্ট কলাম বাদে সব কলাম সিলেক্ট
X = datainput.iloc[:, :-1].values
# লাস্ট কলাম সিলেক্ট
Y = datainput.iloc[:, -1].values
print(X.shape)
print(Y.shape)

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

(284807, 30)
(284807,)

মডেল ট্রেন করা

এখন ডেটাসেটকে দুটি অংশে ভাগ করব। ট্রেনিং এবং টেস্টিং। test_size প্যারামিটার দিয়ে ঠিক করব কত শতাংশ ডেটা শুধু টেস্টিংয়ে ব্যবহার হবে।

উদাহরণ

import pandas as pd
from sklearn.model_selection import train_test_split
datainput = pd.read_csv('E:\\creditcard.csv')
X = datainput.iloc[:, :-1].values
Y = datainput.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

ডিসিশন ট্রি ক্লাসিফিকেশন প্রয়োগ

এই পরিস্থিতিতে প্রয়োগ করার জন্য অনেক অ্যালগরিদম আছে। কিন্তু আমরা ডিসিশন ট্রি বেছে নিচ্ছি ক্লাসিফিকেশনের জন্য। যা হলো ম্যাক্স ট্রি ডেপথ ৪ এবং টেস্ট স্যাম্পল দিয়ে ভ্যালু প্রিডিক্ট করব। শেষে টেস্ট রেজাল্ট থেকে একুরেসি ক্যালকুলেট করব এই অ্যালগরিদম চালিয়ে যাব কিনা তা ঠিক করতে।

উদাহরণ

import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
datainput = pd.read_csv('E:\\creditcard.csv')
X = datainput.iloc[:, :-1].values
Y = datainput.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(max_depth=4)
classifier.fit(X_train, Y_train)
predicted = classifier.predict(X_test)
print("\npredicted values :\n", predicted)
# Accuracy
DT = metrics.accuracy_score(Y_test, predicted) * 100
print("\nThe accuracy score using the DecisionTreeClassifier : ", DT)

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

predicted values : [0 0 0 ... 0 0 0]
The accuracy score using the DecisionTreeClassifier : 99.9367999719111

ইভ্যালুয়েশন প্যারামিটার বের করা

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

উদাহরণ

import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score
datainput = pd.read_csv('E:\\creditcard.csv')
X = datainput.iloc[:, :-1].values
Y = datainput.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(max_depth=4)
classifier.fit(X_train, Y_train)
predicted = classifier.predict(X_test)
print("\npredicted values :\n", predicted)
DT = metrics.accuracy_score(Y_test, predicted) * 100
print("\nThe accuracy score using the DecisionTreeClassifier : ", DT)
# Precision
print('precision')
precision = precision_score(Y_test, predicted, pos_label=1)
print(precision_score(Y_test, predicted, pos_label=1))
# Recall
print('recall')
recall = recall_score(Y_test, predicted, pos_label=1)
print(recall_score(Y_test, predicted, pos_label=1))
# F1-score
print('f-Score')
fscore = f1_score(Y_test, predicted, pos_label=1)
print(f1_score(Y_test, predicted, pos_label=1))

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের ফলাফল পাবেন:

The accuracy score using the DecisionTreeClassifier : 99.9403110845827
precision 0.810126582278481
recall 0.7710843373493976
f-Score 0.7901234567901234
  1. পাইথন: Bokeh লাইব্রেরি দিয়ে ডেটা ভিজ্যুয়ালাইজেশন

  2. পাইথনে স্ট্যাটিস্টিক্যাল থিংকিং (Statistical Thinking)

  3. পাইথনে কাস্টমার চার্ন প্রিডিকশন (Predicting Customer Churn)

  4. পাইথনে সেন্সাস ডেটা অ্যানালাইসিস (Analyzing Census Data)