মেশিন লার্নিংয়ে, যখন আমাদের কাছে এমন ডেটাসেট থাকে যেখানে একটি ক্লাস (শ্রেণী) অন্য ক্লাসের তুলনায় অনেক বেশি থাকে, তখন তাকে Imbalanced Data বা ভারসাম্যহীন ডেটা বলা হয়। এই ধরনের ডেটাসেটে মডেল প্রশিক্ষণ দিলে তা সাধারণত সংখ্যাগরিষ্ঠ শ্রেণীকে (Majority Class) বেশি গুরুত্ব দেয় এবং সংখ্যালঘু শ্রেণীকে (Minority Class) সঠিকভাবে চিনতে পারে না।
এর ফলে মডেলের কার্যকারিতা কমে যায়, বিশেষ করে সংখ্যালঘু শ্রেণীর ক্ষেত্রে। এই সমস্যা সমাধানের জন্য Synthetic Minority Over-sampling Technique (SMOTE) একটি জনপ্রিয় এবং কার্যকর পদ্ধতি।
Imbalanced Data কী?
Imbalanced Data বলতে এমন ডেটাসেটকে বোঝায় যেখানে বিভিন্ন শ্রেণীর নমুনার সংখ্যায় অনেক পার্থক্য থাকে। সহজ কথায়, কিছু শ্রেণী খুব বেশি পরিমাণে থাকে এবং কিছু শ্রেণী খুব কম পরিমাণে থাকে।
উদাহরণ:
- ফ্রড ডিটেকশন (Fraud Detection): বেশিরভাগ লেনদেনই জালিয়াতি নয় (সংখ্যাগরিষ্ঠ শ্রেণী), কিন্তু খুব অল্প সংখ্যক লেনদেন জালিয়াতি হয় (সংখ্যালঘু শ্রেণী)।
- রোগ নির্ণয় (Disease Diagnosis): একটি নির্দিষ্ট রোগের ক্ষেত্রে, বেশিরভাগ মানুষই সুস্থ থাকে (সংখ্যাগরিষ্ঠ শ্রেণী), কিন্তু খুব কম সংখ্যক মানুষ ঐ রোগে আক্রান্ত হয় (সংখ্যালঘু শ্রেণী)।
- গ্রাহক ক্ষয় (Customer Churn): বেশিরভাগ গ্রাহকই পরিষেবা ব্যবহার করতে থাকেন (সংখ্যাগরিষ্ঠ শ্রেণী), কিন্তু কিছু গ্রাহক পরিষেবা ত্যাগ করেন (সংখ্যালঘু শ্রেণী)।
এই ধরনের ডেটাসেটে, ঐতিহ্যবাহী ক্লাসিফিকেশন অ্যালগরিদমগুলো সংখ্যাগরিষ্ঠ শ্রেণীর প্রতি পক্ষপাতদুষ্ট হতে পারে, কারণ তারা মডেলকে এমনভাবে অপ্টিমাইজ করার চেষ্টা করে যাতে সামগ্রিক নির্ভুলতা (overall accuracy) সর্বোচ্চ হয়। এর ফলে সংখ্যালঘু শ্রেণীর পূর্বাভাস সঠিকভাবে হয় না, যা প্রায়শই গুরুত্বপূর্ণ হয়।
SMOTE কী?
SMOTE হলো Synthetic Minority Over-sampling Technique-এর সংক্ষিপ্ত রূপ। এটি একটি ওভার-স্যাম্পলিং পদ্ধতি যা ভারসাম্যহীন ডেটাসেটে সংখ্যালঘু শ্রেণীর নমুনার সংখ্যা বাড়ানোর জন্য ব্যবহৃত হয়। তবে এটি বিদ্যমান নমুনাগুলোকে কেবল অনুলিপি (copy) করে না, বরং নতুন, কৃত্রিম (synthetic) নমুনা তৈরি করে। এর ফলে মডেল সংখ্যালঘু শ্রেণী সম্পর্কে আরও ভালোভাবে শিখতে পারে এবং তাদের সঠিকভাবে শ্রেণীবদ্ধ করতে পারে।
SMOTE কীভাবে কাজ করে?
SMOTE নিম্নলিখিত ধাপে কাজ করে:
- সংখ্যালঘু শ্রেণীর একটি নমুনা নির্বাচন: প্রথমে SMOTE সংখ্যালঘু শ্রেণীর একটি র্যান্ডম নমুনা (যেমন ) নির্বাচন করে।
- নিকটতম প্রতিবেশী (K-Nearest Neighbors) খুঁজে বের করা: নির্বাচিত নমুনার () জন্য এর K-Nearest Neighbors (KNN) খুঁজে বের করা হয়। K একটি নির্দিষ্ট সংখ্যা, যা সাধারণত ব্যবহারকারী দ্বারা সেট করা হয় (যেমন, K=5)। এই প্রতিবেশীরা অবশ্যই একই সংখ্যালঘু শ্রেণীর হতে হবে।
- কৃত্রিম নমুনা তৈরি করা: নির্বাচিত নমুনা () এবং তার K-নিকটতম প্রতিবেশীদের মধ্যে থেকে যেকোনো একটি প্রতিবেশী () র্যান্ডমলি নির্বাচন করা হয়। তারপর, এবং এর মধ্যে একটি সরলরেখা বরাবর একটি নতুন, কৃত্রিম নমুনা তৈরি করা হয়। এর জন্য একটি র্যান্ডম সংখ্যা () ব্যবহার করা হয়, যা 0 থেকে 1 এর মধ্যে থাকে। নতুন নমুনা নিম্নলিখিত সূত্র দ্বারা তৈরি হয়:
এই প্রক্রিয়াটি যতবার প্রয়োজন ততবার পুনরাবৃত্তি করা হয় যতক্ষণ না সংখ্যালঘু শ্রেণীর নমুনার সংখ্যা বৃদ্ধি পেয়ে ভারসাম্যপূর্ণ অবস্থায় আসে।
উদাহরণ:
ধরুন, আপনার কাছে ২D স্পেসে সংখ্যালঘু শ্রেণীর দুটি বৈশিষ্ট্য (feature) রয়েছে। একটি নমুনা এবং এর একটি প্রতিবেশী ।
1 2 3 4 5 6 7 8 9 |
lambda=0.5 হয়, তাহলে নতুন কৃত্রিম নমুনাটি হবে: x_new=(1,2)+0.5 times((3,4)−(1,2)) x_new=(1,2)+0.5 times(2,2) x_new=(1,2)+(1,1) x_new=(2,3) |
এইভাবে, SMOTE বিদ্যমান ডেটা পয়েন্টগুলোর মধ্যে ইন্টারপোলেশন করে নতুন ডেটা পয়েন্ট তৈরি করে, যা ডেটাসেটে বৈচিত্র্য যোগ করে।
কখন SMOTE ব্যবহার করবেন?
- যখন আপনার ডেটাসেটে শ্রেণীগুলো অত্যন্ত ভারসাম্যহীন থাকে।
- যখন আপনার মডেলের সংখ্যালঘু শ্রেণীর নির্ভুলতা বাড়ানোর প্রয়োজন হয় (যেমন, জালিয়াতি শনাক্তকরণ বা রোগ নির্ণয়)।
- যখন আপনার কাছে যথেষ্ট পরিমাণে ডেটা নেই সংখ্যালঘু শ্রেণীকে ভালোভাবে প্রতিনিধিত্ব করার জন্য।
- যখন আপনি ওভার-স্যাম্পলিং পদ্ধতি ব্যবহার করতে চান যা কেবল ডেটা অনুলিপি না করে নতুন সিন্থেটিক ডেটা তৈরি করে।
কখন SMOTE ব্যবহার করবেন না?
- যখন আপনার ডেটাসেটে অনেক বেশি নয়েজ (noise) থাকে। SMOTE নয়েজি ডেটা পয়েন্ট থেকেও সিন্থেটিক নমুনা তৈরি করতে পারে, যা মডেলের কর্মক্ষমতা খারাপ করতে পারে।
- যখন আপনার ডেটাসেটের বৈশিষ্ট্যগুলো বিচ্ছিন্ন (discrete) বা ক্যাটাগরিক্যাল (categorical) হয়। SMOTE সাধারণত সংখ্যাসূচক (numerical) বৈশিষ্ট্যের জন্য ডিজাইন করা হয়েছে। বিচ্ছিন্ন ডেটার ক্ষেত্রে এটি অর্থহীন মান তৈরি করতে পারে। এই ক্ষেত্রে SMOTE-এর ভ্যারিয়েন্ট যেমন SMOTE-NC (for Nominal and Continuous) বা SMOTE-N ব্যবহার করা যেতে পারে।
- যখন ডেটাসেটে শ্রেণীগুলোর ওভারল্যাপ (overlap) বেশি থাকে। যদি সংখ্যাগরিষ্ঠ এবং সংখ্যালঘু শ্রেণীর ডেটা পয়েন্টগুলো একে অপরের সাথে খুব বেশি মিশ্রিত হয়, তবে SMOTE সিন্থেটিক নমুনা তৈরি করতে পারে যা শ্রেণীবদ্ধকরণকে আরও কঠিন করে তোলে।
- যখন আপনার ডেটাসেট খুব ছোট হয়। খুব কম ডেটা পয়েন্ট থাকলে SMOTE কার্যকরভাবে নতুন ডেটা তৈরি করতে পারে না।
SMOTE এর উদাহরণ (ধারণাগত)
ধরা যাক, আপনার কাছে ডেটাসেটে 1000টি নমুনা আছে:
- ক্লাস A (সংখ্যাগরিষ্ঠ): 950টি নমুনা
- ক্লাস B (সংখ্যালঘু): 50টি নমুনা
আপনি চান ক্লাস B এর নমুনার সংখ্যা বাড়িয়ে 950 করতে, যাতে উভয় শ্রেণী ভারসাম্যপূর্ণ হয়। SMOTE প্রয়োগ করলে:
- SMOTE ক্লাস B এর একটি নমুনা নির্বাচন করবে।
- সেই নমুনার নিকটতম প্রতিবেশীদের খুঁজে বের করবে (যেমন, 5টি প্রতিবেশী)।
- নির্বাচিত নমুনা এবং তার একটি নিকটতম প্রতিবেশীর মধ্যে কৃত্রিম নমুনা তৈরি করবে।
- এই প্রক্রিয়াটি পুনরাবৃত্তি করবে যতক্ষণ না ক্লাস B এর নমুনার সংখ্যা 950 না হয়। এর ফলে, আপনার ডেটাসেটে এখন প্রায় 950টি ক্লাস A এবং 950টি ক্লাস B এর নমুনা থাকবে, যা মডেলকে উভয় শ্রেণী সম্পর্কে ভালোভাবে শিখতে সাহায্য করবে।
Python ব্যবহার করে SMOTE এর উদাহরণ
আমরা imbalanced-learn
লাইব্রেরি ব্যবহার করে পাইথনে SMOTE প্রয়োগ করতে পারি। প্রথমে, লাইব্রেরি ইনস্টল করুন:
1 |
pip install imbalanced-learn |
তারপর, একটি উদাহরণ ডেটাসেটে SMOTE প্রয়োগ করুন:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import pandas as pd from collections import Counter from sklearn.datasets import make_classification from imblearn.over_sampling import SMOTE import matplotlib.pyplot as plt import seaborn as sns # ১. ইমব্যালেন্সড ডেটাসেট তৈরি করা X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_classes=2, n_clusters_per_class=1, weights=[0.9, 0.1], flip_y=0, random_state=42) # ডেটাসেটের শ্রেণী বিতরণ দেখা print("মূল ডেটাসেটে শ্রেণীর বিতরণ:", Counter(y)) # ডেটাসেট visualize করা plt.figure(figsize=(10, 6)) sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, palette='viridis', legend='full') plt.title('মূল ইমব্যালেন্সড ডেটাসেট') plt.xlabel('ফিচার 1') plt.ylabel('ফিচার 2') plt.show() # ২. SMOTE প্রয়োগ করা smote = SMOTE(random_state=42) X_resampled, y_resampled = smote.fit_resample(X, y) # SMOTE প্রয়োগের পর ডেটাসেটের শ্রেণী বিতরণ দেখা print("SMOTE প্রয়োগের পর শ্রেণীর বিতরণ:", Counter(y_resampled)) # SMOTE প্রয়োগের পর ডেটাসেট visualize করা plt.figure(figsize=(10, 6)) sns.scatterplot(x=X_resampled[:, 0], y=X_resampled[:, 1], hue=y_resampled, palette='viridis', legend='full') plt.title('SMOTE প্রয়োগের পর ডেটাসেট') plt.xlabel('ফিচার 1') plt.ylabel('ফিচার 2') plt.show() # একটি মেশিন লার্নিং মডেলের সাথে ব্যবহার from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix # প্রশিক্ষণ এবং পরীক্ষার সেট ভাগ করা X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train) print("প্রশিক্ষণ সেটে SMOTE প্রয়োগের পূর্বে শ্রেণীর বিতরণ:", Counter(y_train)) print("প্রশিক্ষণ সেটে SMOTE প্রয়োগের পর শ্রেণীর বিতরণ:", Counter(y_train_resampled)) # মডেল প্রশিক্ষণ (SMOTE ছাড়া) model_no_smote = RandomForestClassifier(random_state=42) model_no_smote.fit(X_train, y_train) y_pred_no_smote = model_no_smote.predict(X_test) print("\n--- SMOTE ছাড়া মডেলের ফলাফল ---") print(classification_report(y_test, y_pred_no_smote)) print("কনফিউশন ম্যাট্রিক্স:\n", confusion_matrix(y_test, y_pred_no_smote)) # মডেল প্রশিক্ষণ (SMOTE সহ) model_with_smote = RandomForestClassifier(random_state=42) model_with_smote.fit(X_train_resampled, y_train_resampled) y_pred_with_smote = model_with_smote.predict(X_test) print("\n--- SMOTE সহ মডেলের ফলাফল ---") print(classification_report(y_test, y_pred_with_smote)) print("কনফিউশন ম্যাট্রিক্স:\n", confusion_matrix(y_test, y_pred_with_smote)) |
আউটপুট বিশ্লেষণ:
উপরের কোডটি চালালে আপনি দেখতে পাবেন যে Counter(y)
প্রাথমিক ডেটাসেটে সংখ্যাগরিষ্ঠ এবং সংখ্যালঘু শ্রেণীর মধ্যে একটি উল্লেখযোগ্য ভারসাম্যহীনতা দেখাবে (যেমন, 900টি 0 শ্রেণী এবং 100টি 1 শ্রেণী)। SMOTE প্রয়োগ করার পর, Counter(y_resampled)
দেখাবে যে উভয় শ্রেণীর নমুনার সংখ্যা প্রায় সমান হয়েছে (যেমন, উভয়ই প্রায় 900টি)।
Plot-গুলোতে আপনি দেখতে পাবেন যে SMOTE প্রয়োগের আগে সংখ্যালঘু শ্রেণীর ডেটা পয়েন্টগুলো খুব কম ছিল, কিন্তু SMOTE প্রয়োগের পর নতুন কৃত্রিম ডেটা পয়েন্ট তৈরি হয়েছে যা সংখ্যালঘু শ্রেণীর ক্লাস্টারগুলোকে আরও ঘন করে তুলেছে।
classification_report
এবং confusion_matrix
দেখলে বোঝা যাবে যে SMOTE প্রয়োগের পর সংখ্যালঘু শ্রেণীর Recall (সংবেদনশীলতা) এবং F1-score উন্নত হয়েছে, যা নির্দেশ করে যে মডেল এখন সংখ্যালঘু শ্রেণীকে আরও ভালোভাবে শনাক্ত করতে পারছে।
SMOTE এর ব্যবহারিক বিবেচনা এবং সীমাবদ্ধতা
যদিও SMOTE একটি কার্যকর কৌশল, তবে এর কিছু ব্যবহারিক বিবেচনা এবং সীমাবদ্ধতা রয়েছে:
- ওভারফিটিং ঝুঁকি: যদি এর মান খুব কম হয় বা যদি ডেটাসেটে খুব কম সংখ্যালঘু নমুনা থাকে, তবে SMOTE বারবার একই ধরনের কৃত্রিম নমুনা তৈরি করতে পারে, যা মডেলকে ওভারফিটিংয়ের দিকে নিয়ে যেতে পারে।
- নয়েজ সংবেদনশীলতা: যদি সংখ্যালঘু শ্রেণীর ডেটা পয়েন্টগুলোতে নয়েজ থাকে, SMOTE সেই নয়েজি ডেটা পয়েন্টগুলো থেকে নতুন নয়েজি নমুনা তৈরি করতে পারে, যা মডেলের পারফরম্যান্স খারাপ করে।
- সীমিত বৈচিত্র্য: SMOTE শুধুমাত্র বিদ্যমান ডেটা পয়েন্টগুলোর মধ্যে ইন্টারপোলেশন করে। এটি ডেটার আসল বিতরণ (underlying distribution) থেকে সম্পূর্ণ নতুন প্যাটার্ন তৈরি করতে পারে না।
- ক্যাটাগরিক্যাল ডেটা: SMOTE মূলত সংখ্যাসূচক ডেটার জন্য ডিজাইন করা হয়েছে। ক্যাটাগরিক্যাল ডেটার জন্য SMOTE-NC বা SMOTE-N এর মতো ভ্যারিয়েন্ট ব্যবহার করতে হয়।
- কম্পিউটেশনাল খরচ: বড় ডেটাসেটের ক্ষেত্রে, K-নিকটতম প্রতিবেশী খোঁজা এবং নতুন নমুনা তৈরি করা computationally ব্যয়বহুল হতে পারে।
SMOTE এর ব্যাখ্যা (Interpreting SMOTE)
SMOTE প্রয়োগের পর আপনার ডেটাসেটের বৈশিষ্ট্য স্থান (feature space) পরিবর্তিত হয়। এর অর্থ হলো, আপনি এখন মডেলকে আরও “সুষম” ডেটাসেটে প্রশিক্ষণ দিচ্ছেন। এটি মডেলকে সংখ্যাগরিষ্ঠ শ্রেণীর প্রতি পক্ষপাতদুষ্ট না হয়ে উভয় শ্রেণী সম্পর্কে সামগ্রিকভাবে শিখতে সাহায্য করে।
আপনি যখন SMOTE ব্যবহার করেন, তখন মডেলের আউটপুট ব্যাখ্যা করার সময় মনে রাখতে হবে যে কিছু পূর্বাভাস সিন্থেটিক ডেটা পয়েন্টের উপর ভিত্তি করে করা হয়েছে। তবে, যেহেতু এই সিন্থেটিক পয়েন্টগুলো বিদ্যমান ডেটা থেকে তৈরি হয়, তাই তারা ডেটার মূল প্যাটার্নকে প্রতিফলিত করে।
SMOTE মডেলের নির্ভুলতা বাড়ায় না, বরং সংখ্যালঘু শ্রেণীর শনাক্তকরণ ক্ষমতা (recall, precision, F1-score) উন্নত করে।
SMOTE এর গুরুত্ব
SMOTE এর গুরুত্ব নিম্নলিখিত কারণে অপরিহার্য:
- মডেলের উন্নত কর্মক্ষমতা: এটি ভারসাম্যহীন ডেটাসেটে মেশিন লার্নিং মডেলগুলোর কর্মক্ষমতা, বিশেষ করে সংখ্যালঘু শ্রেণীর ক্ষেত্রে, উল্লেখযোগ্যভাবে উন্নত করে।
- পক্ষপাত হ্রাস: এটি সংখ্যাগরিষ্ঠ শ্রেণীর প্রতি মডেলের পক্ষপাত কমাতে সাহায্য করে, যা ফলস্বরূপ আরও নিরপেক্ষ এবং শক্তিশালী মডেল তৈরি করে।
- বাস্তব বিশ্বের সমস্যা সমাধান: ফ্রড ডিটেকশন, রোগ নির্ণয়, ত্রুটি শনাক্তকরণ (fault detection) এর মতো বাস্তব বিশ্বের অনেক সমস্যায় ভারসাম্যহীন ডেটা একটি সাধারণ সমস্যা। SMOTE এই ধরনের সমস্যা সমাধানে গুরুত্বপূর্ণ ভূমিকা পালন করে।
- ডেটা বৃদ্ধির কৌশল: এটি এক ধরনের ডেটা অগমেন্টেশন কৌশল যা ডেটাসেটে নতুন, মূল্যবান ডেটা যোগ করে যা মডেলকে আরও ভালোভাবে শিখতে সাহায্য করে।
SMOTE ডেটা সায়েন্স এবং মেশিন লার্নিংয়ে ভারসাম্যহীন ডেটা সমস্যার একটি অত্যন্ত কার্যকর সমাধান হিসেবে বিবেচিত।
Leave a Comment