Imbalanced Data হ্যান্ডলিং

পাইথনে লজিস্টিক রিগ্রেশন (Logistic Regression in Python) - Machine Learning

368

Imbalanced Data এমন একটি পরিস্থিতি যেখানে মডেল প্রশিক্ষণের জন্য ব্যবহার করা ডেটাতে বিভিন্ন শ্রেণীর মধ্যে বৈষম্য থাকে। অর্থাৎ, একটি শ্রেণী (ক্লাস) অনেক বেশি উপস্থিত থাকে এবং অন্য শ্রেণী (ক্লাস) অনেক কম উপস্থিত থাকে। এটি মডেল প্রশিক্ষণের ক্ষেত্রে সমস্যার সৃষ্টি করতে পারে, কারণ মডেলটি প্রধানত বেশি উপস্থিত শ্রেণী কে প্রেডিক্ট করতে শেখে এবং কম উপস্থিত শ্রেণী কে ভুলভাবে বা উপেক্ষা করতে পারে।

Imbalanced Data কেন সমস্যা সৃষ্টি করে?

  • অতিরিক্ত প্রেডিকশন পক্ষপাতিত্ব: মডেলটি প্রধানত বেশি উপস্থিত শ্রেণী কে প্রেডিক্ট করবে, এবং কম উপস্থিত শ্রেণী মডেলটির ভুল হতে পারে।
  • কম পারফরম্যান্স: মডেলটি কম উপস্থিত শ্রেণীকে সঠিকভাবে প্রেডিক্ট করতে পারে না, যার ফলে accuracy বা precision কমে যেতে পারে।

Imbalanced Data হ্যান্ডলিং এর বিভিন্ন পদ্ধতি

Imbalanced data সমস্যার সমাধানে বেশ কয়েকটি পদ্ধতি রয়েছে। নিচে কিছু জনপ্রিয় পদ্ধতি দেওয়া হলো:


1. Resampling Techniques

Resampling দুটি প্রধান পদ্ধতি দ্বারা করা হয়: Over-sampling এবং Under-sampling

(a) Over-sampling (Upsampling)

এটি কম উপস্থিত শ্রেণীর ডেটাকে আরও অনুলিপি করে বাড়ানোর পদ্ধতি। SMOTE (Synthetic Minority Over-sampling Technique) হল একটি জনপ্রিয় পদ্ধতি যা নতুন সিমুলেটেড (synthetic) উদাহরণ তৈরি করে।

from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification

# একটি ইমব্যালান্সড ডেটাসেট তৈরি করা
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, n_classes=2, weights=[0.95, 0.05], flip_y=0, random_state=42)

# SMOTE ব্যবহার করে over-sampling করা
smote = SMOTE(sampling_strategy='auto', random_state=42)
X_res, y_res = smote.fit_resample(X, y)

print(f"Before SMOTE: {y.value_counts()}")
print(f"After SMOTE: {pd.Series(y_res).value_counts()}")

(b) Under-sampling (Downsampling)

এটি অধিক উপস্থিত শ্রেণীর ডেটাকে কমিয়ে সমান করার পদ্ধতি। এতে মডেল বড় শ্রেণীর সঠিক বৈশিষ্ট্য হারাতে পারে, তবে এটি ছোট শ্রেণীকে সঠিকভাবে শিখতে সাহায্য করতে পারে।

from imblearn.under_sampling import RandomUnderSampler

# Under-sampling করা
undersample = RandomUnderSampler(sampling_strategy='auto', random_state=42)
X_res, y_res = undersample.fit_resample(X, y)

print(f"Before Under-sampling: {y.value_counts()}")
print(f"After Under-sampling: {pd.Series(y_res).value_counts()}")

2. Class Weights Adjustment

কিছু মডেল যেমন Logistic Regression, Random Forest, SVM ইত্যাদিতে class weights ব্যবহার করে শ্রেণী বৈষম্য হ্যান্ডল করা যায়। যখন মডেলকে বোঝানো হয় যে একটি শ্রেণী অনেক বেশি গুরুত্বপূর্ণ, তখন মডেল সেই শ্রেণীটি সঠিকভাবে শিখতে বেশি গুরুত্ব দেয়।

from sklearn.linear_model import LogisticRegression

# Logistic Regression মডেল তৈরি এবং class_weight='balanced' ব্যবহার করা
model = LogisticRegression(class_weight='balanced')
model.fit(X_train, y_train)

class_weight='balanced' ব্যবহার করলে মডেল স্বয়ংক্রিয়ভাবে শ্রেণীকে সমান গুরুত্ব দিয়ে প্রশিক্ষিত হয়।


3. Anomaly Detection Approach

Imbalanced ডেটার ক্ষেত্রে, আপনি Anomaly Detection পদ্ধতি ব্যবহার করতে পারেন। এটি মূলত কম উপস্থিত শ্রেণী কে অস্বাভাবিক বা আউটলায়ার হিসেবে চিহ্নিত করে এবং তাকে আলাদাভাবে শিখতে সাহায্য করে।


4. Ensemble Methods

Ensemble methods যেমন Balanced Random Forest এবং EasyEnsemble ইমব্যালান্সড ডেটার জন্য উপকারী হতে পারে। এগুলো multiple classifiers ব্যবহার করে শ্রেণী বৈষম্য মোকাবেলা করে।

(a) Balanced Random Forest

from imblearn.ensemble import BalancedRandomForestClassifier

# Balanced Random Forest Classifier তৈরি করা
brf = BalancedRandomForestClassifier(n_estimators=100, random_state=42)
brf.fit(X_train, y_train)

(b) EasyEnsemble

from imblearn.ensemble import EasyEnsembleClassifier

# EasyEnsemble Classifier তৈরি করা
ee = EasyEnsembleClassifier(n_estimators=100, random_state=42)
ee.fit(X_train, y_train)

5. Threshold Moving

কখনও কখনও, শ্রেণী পরিবর্তনের প্রোগনোসিস বা decision threshold সমন্বয় করতে হবে। সাধারণত মডেলটি 0.5 বা অন্য একটি নির্দিষ্ট থ্রেশহোল্ড দিয়ে শ্রেণী প্রেডিক্ট করে, তবে আপনি সেই থ্রেশহোল্ড পরিবর্তন করে কম উপস্থিত শ্রেণীর জন্য ভালো ফলাফল পেতে পারেন।

# থ্রেশহোল্ড সেট করা
y_prob = model.predict_proba(X_test)[:, 1]
threshold = 0.3
y_pred = (y_prob > threshold).astype(int)

6. Evaluation Metrics for Imbalanced Data

ইমব্যালান্সড ডেটার ক্ষেত্রে, শুধুমাত্র accuracy ব্যবহার করা সঠিক নয়, কারণ মডেলটি সাধারণত প্রধান শ্রেণীকে সঠিকভাবে প্রেডিক্ট করবে। অতএব, precision, recall, F1-score, ROC-AUC ইত্যাদি মেট্রিক্স ব্যবহার করা উচিত।

(a) Precision, Recall এবং F1-Score

from sklearn.metrics import classification_report

# Precision, Recall, F1-score
print(classification_report(y_test, y_pred))

(b) ROC Curve এবং AUC Score

from sklearn.metrics import roc_curve, auc

# ROC এবং AUC স্কোর চেক করা
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

# ROC curve plot করা
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")
plt.show()

সারাংশ

Imbalanced Data হ্যান্ডল করার জন্য কিছু সাধারণ পদ্ধতি:

  1. Resampling Techniques: Over-sampling (SMOTE) বা Under-sampling ব্যবহার করা।
  2. Class Weights: মডেলের class_weight ব্যবহার করা।
  3. Ensemble Methods: Balanced Random Forest এবং EasyEnsemble ব্যবহার করা।
  4. Anomaly Detection: কম উপস্থিত শ্রেণীকে অস্বাভাবিক হিসেবে চিহ্নিত করা।
  5. Threshold Moving: Decision threshold সমন্বয় করা।
  6. Evaluation Metrics: Precision, Recall, F1-score, এবং ROC-AUC ব্যবহার করা।

এগুলি ইমব্যালান্সড ডেটার সমস্যা সমাধান করতে সহায়ক এবং মডেল পারফরম্যান্স উন্নত করতে সাহায্য করে।

Content added By

Imbalanced Dataset এমন একটি পরিস্থিতি যেখানে ক্লাসগুলির মধ্যে বৈষম্য থাকে, অর্থাৎ একটি শ্রেণীর (ক্লাস) উদাহরণ অন্য শ্রেণীর তুলনায় অনেক বেশি উপস্থিত থাকে। এই ধরনের ডেটাসেট মডেল ট্রেনিংয়ে একটি সাধারণ সমস্যা তৈরি করতে পারে, কারণ মডেল প্রধানত বেশি উপস্থিত শ্রেণী থেকে শিখতে শুরু করে এবং কম উপস্থিত শ্রেণী (minority class) উপেক্ষা করতে পারে। এটি overfitting এবং poor generalization এর দিকে পরিচালিত করতে পারে।

ধরা যাক, একটি ক্লাসিফিকেশন সমস্যা যেখানে একটি শ্রেণী 95% এবং অন্যটি মাত্র 5% উপস্থিত, মডেলটি 95% ক্লাসটি সঠিকভাবে শনাক্ত করবে কিন্তু 5% ক্লাসে খারাপ পারফরম্যান্স দেখাতে পারে, কারণ এটি কম উপস্থিত শ্রেণী সম্পর্কে শিখতে সক্ষম হয় না।


Imbalanced Dataset এর সমস্যাগুলি:

  1. Class Imbalance Cause Overfitting: যখন একটি শ্রেণীর উদাহরণ অনেক বেশি থাকে, তখন মডেলটি বেশি উপস্থিত শ্রেণীকে অত্যধিক শিখে ফেলে। এটি overfitting সৃষ্টি করতে পারে, কারণ মডেল শুধুমাত্র প্রধান শ্রেণী (majority class) নিয়ে কাজ করে, এবং minority class (কম উপস্থিত শ্রেণী) এর বৈশিষ্ট্যগুলি উপেক্ষা করতে পারে।
  2. Poor Generalization: মডেলটি মূলত অধিক উপস্থিত শ্রেণী থেকে শিখে, ফলে generalization ক্ষমতা কমে যায় এবং টেস্ট ডেটাতে ভালো পারফরম্যান্স দেখাতে পারে না। মডেলটি বেশি উপস্থিত শ্রেণীকে প্রেডিক্ট করতে ভাল করতে পারে, তবে কম উপস্থিত শ্রেণীকে সঠিকভাবে চিহ্নিত করতে পারে না।
  3. Bias Towards Majority Class: ইমব্যালান্সড ডেটাসেটে মডেলটি সাধারণত majority class (অধিক উপস্থিত শ্রেণী) এর দিকে পক্ষপাতিত্ব করে, কারণ এটি মডেলের পারফরম্যান্সকে অপটিমাইজ করতে সহজভাবে অনেকগুলো সঠিক প্রেডিকশন পায়।
  4. Misleading Accuracy Metric: সাধারণত accuracy একটি মেট্রিক হিসেবে ব্যবহৃত হয়, কিন্তু ইমব্যালান্সড ডেটাসেটে accuracy খুব বিভ্রান্তিকর হতে পারে। মডেলটি যদি শুধু অধিক উপস্থিত শ্রেণী সঠিকভাবে শনাক্ত করে, তবে accuracy বেশ ভালো দেখাবে, কিন্তু minority class এর ক্ষেত্রে এর পারফরম্যান্স খারাপ হতে পারে।
  5. Difficulty in Evaluation: ইমব্যালান্সড ডেটা সমস্যায় মডেলের মূল্যায়ন প্রক্রিয়া (evaluation metrics) কঠিন হতে পারে। সাধারণত precision, recall, F1-score, ROC-AUC ইত্যাদি মেট্রিক্স ব্যবহার করতে হয়, যা মডেলের পারফরম্যান্স সঠিকভাবে পরিমাপ করতে সহায়ক।

Imbalanced Dataset এর উদাহরণ

  1. ইমেইল স্প্যাম ডিটেকশন:
    • অনেক ডেটাসেটেই স্প্যাম (অধিক উপস্থিত ক্লাস) এর তুলনায় নন-স্প্যাম (কম উপস্থিত ক্লাস) ইমেইল অনেক কম থাকে। এমন ডেটাসেটে মডেল স্প্যাম ইমেইল শনাক্ত করতে ভাল হলেও, নন-স্প্যাম ইমেইল শনাক্ত করতে কম পারফরম্যান্স দেখাতে পারে।
  2. ডায়াবেটিস প্রেডিকশন:
    • রোগী ডায়াবেটিসে আক্রান্ত না হওয়া (majority class) মানুষের সংখ্যা অনেক বেশি হতে পারে, কিন্তু ডায়াবেটিস আক্রান্ত (minority class) রোগীর সংখ্যা কম থাকে। মডেলটি বেশি সংখ্যক সুস্থ রোগীদের সঠিকভাবে শনাক্ত করবে, কিন্তু ডায়াবেটিস আক্রান্ত রোগীদের সঠিকভাবে শনাক্ত করতে পারবে না।
  3. ক্রেডিট স্কোরিং:
    • ব্যাংক ঋণ গ্রহীতাদের মধ্যে যারা ঋণ পরিশোধ করতে সক্ষম (majority class) তাদের সংখ্যা বেশি, এবং যারা ঋণ পরিশোধে সক্ষম নন (minority class) তাদের সংখ্যা অনেক কম। মডেলটি সফল ঋণগ্রহীতাদের সঠিকভাবে প্রেডিক্ট করতে পারবে, কিন্তু ঋণগ্রহীতাদের default (অক্ষম) অবস্থান সঠিকভাবে চিহ্নিত করতে সক্ষম নাও হতে পারে।

Imbalanced Dataset এর সমাধান

Imbalanced Dataset মোকাবেলা করতে অনেক কৌশল ব্যবহৃত হয়। সেগুলি হলো:

  1. Resampling Techniques:
    • Over-sampling: কম উপস্থিত শ্রেণীর উদাহরণ বেশি কপি করা (যেমন SMOTE).
    • Under-sampling: বেশি উপস্থিত শ্রেণীর উদাহরণ কমানো।
  2. Class Weights Adjustment:
    • মডেলের জন্য class_weight ব্যবহার করে, কম উপস্থিত শ্রেণীকে বেশি গুরুত্ব দেয়া।
  3. Anomaly Detection:
    • ইমব্যালান্সড ডেটাতে, কম উপস্থিত শ্রেণীকে অস্বাভাবিক বা আউটলায়ার হিসেবে চিহ্নিত করা।
  4. Ensemble Methods:
    • Balanced Random Forest বা EasyEnsemble ব্যবহার করে ইমব্যালান্সড ডেটা পরিচালনা করা।
  5. Evaluation Metrics:
    • Precision, Recall, F1-Score, এবং ROC-AUC ব্যবহার করা, যাতে শুধুমাত্র accuracy দিয়ে মডেল পারফরম্যান্স মূল্যায়ন না করা হয়।

সারাংশ

Imbalanced Dataset একটি গুরুত্বপূর্ণ সমস্যা যা মডেল ট্রেনিংয়ে overfitting এবং poor generalization সৃষ্টি করতে পারে। কম উপস্থিত শ্রেণী নিয়ে মডেল ভুল সিদ্ধান্ত নিলে, এটি মডেলের সঠিকতা এবং পারফরম্যান্সের জন্য বিপদজনক হতে পারে। এটি মোকাবেলা করার জন্য resampling, class weights adjustment, anomaly detection, ensemble methods, এবং উপযুক্ত evaluation metrics ব্যবহৃত হতে পারে।

Content added By

SMOTE (Synthetic Minority Over-sampling Technique) হল একটি জনপ্রিয় ওভার-স্যাম্পলিং কৌশল যা বৈষম্যপূর্ণ ডেটাসেটে (imbalance dataset) মাইনরিটি ক্লাস এর উদাহরণ তৈরি করতে ব্যবহৃত হয়। যখন একটি ডেটাসেটে এক শ্রেণীর উদাহরণ অন্য শ্রেণীর তুলনায় খুব কম থাকে, তখন মডেলটি মাইনরিটি ক্লাসের উপর কম শিখতে পারে এবং এর ফলে মডেলটি biased (পক্ষপাতি) হতে পারে। SMOTE এই সমস্যাটি সমাধান করার জন্য ডিজাইন করা হয়েছে।

SMOTE মাইনরিটি ক্লাসের উদাহরণগুলিকে পুনরায় তৈরি করে, যার ফলে মডেল ট্রেনিংয়ের সময় নির্ভুলতা এবং অন্যন্য (generalization) উন্নত হয়।


SMOTE কীভাবে কাজ করে?

SMOTE পদ্ধতিতে মাইনরিটি ক্লাসের উদাহরণগুলি থেকে নতুন উদাহরণ তৈরি করা হয়। এটি nearest neighbors (নিকটতম প্রতিবেশী) ব্যবহার করে নতুন উদাহরণ তৈরি করে, যার মাধ্যমে এক্সিস্টিং ডেটার উপর ভিত্তি করে নতুন উদাহরণ তৈরি করা হয়। এই নতুন উদাহরণগুলি প্রকৃত উদাহরণের মতো দেখতে হয়, তবে এটি অতিরিক্ত বৈশিষ্ট্য নিয়ে তৈরি হয়।

ধাপে ধাপে SMOTE এর কাজ:

  1. নিকটতম প্রতিবেশী নির্বাচন: মাইনরিটি ক্লাসের প্রতিটি উদাহরণ থেকে তার নিকটতম প্রতিবেশী (nearest neighbors) নির্বাচন করা হয়।
  2. নতুন উদাহরণ তৈরি করা: নতুন উদাহরণ তৈরি করতে প্রতিটি মাইনরিটি ক্লাসের উদাহরণ এবং তার নিকটতম প্রতিবেশীর মধ্যে লিনিয়ার ইন্টারপোলেশন করা হয়। অর্থাৎ, উদাহরণটির বৈশিষ্ট্যের মধ্যে কিছু পার্থক্য যোগ করা হয়।
  3. নতুন উদাহরণ যুক্ত করা: এই নতুন উদাহরণগুলি মূল ডেটাসেটে যুক্ত করা হয়।

এটি একটি সিন্থেটিক (কৃত্রিম) উদাহরণ তৈরি করে, যা মাইনরিটি ক্লাসের উদাহরণের সংখ্যা বাড়ায়।


SMOTE এর উদাহরণ:

ধরা যাক, একটি ডেটাসেটে ১টি মাইনরিটি ক্লাস (যেমন: 1) এবং ১টি ডোমিনেন্ট ক্লাস (যেমন: 0) রয়েছে এবং মাইনরিটি ক্লাসের উদাহরণের সংখ্যা খুব কম। SMOTE ব্যবহার করলে, এটি মাইনরিটি ক্লাসের উদাহরণগুলি দিয়ে নতুন উদাহরণ তৈরি করবে যাতে ডেটাসেটটি balanced (সামঞ্জস্যপূর্ণ) হয়।

SMOTE কিভাবে কাজ করে:

ধরা যাক, মাইনরিটি ক্লাসের একটি উদাহরণ হল:

  • [x1, y1]

এবং এর নিকটতম প্রতিবেশী:

  • [x2, y2]

SMOTE দুটি উদাহরণের মধ্যে ইন্টারপোলেশন করে একটি নতুন উদাহরণ তৈরি করবে:

  • [x_new, y_new] = [x1 + (x2 - x1) * λ, y1 + (y2 - y1) * λ]

এখানে, λ একটি র্যান্ডম ফ্যাক্টর যা 0 এবং 1 এর মধ্যে থাকে। এটি অন্তর্ভুক্তি (inclusion) পদ্ধতির মধ্যে পরিবর্তন আনতে ব্যবহৃত হয়, যাতে নতুন উদাহরণগুলি যথেষ্ট বৈশিষ্ট্যগতভাবে প্রাকৃত উদাহরণের মতো থাকে।


SMOTE এর সুবিধা:

  1. ওভারফিটিং কমানো: SMOTE অপ্রয়োজনীয় ক্লাসের উদাহরণ তৈরি করে, ফলে মডেলটি overfitting (অত্যাধিক প্রশিক্ষণ) থেকে রক্ষা পায় এবং বেশি সাধারণীকৃত হয়।
  2. ডেটার বৈচিত্র্য বাড়ানো: নতুন উদাহরণের মাধ্যমে ডেটার বৈচিত্র্য বৃদ্ধি পায়, যা মডেলটির কার্যকারিতা বাড়াতে সহায়ক।
  3. অন্যান্য অ্যালগরিদমে প্রয়োগ করা: এটি যে কোন ক্লাসিফিকেশন অ্যালগরিদমের সাথে ব্যবহার করা যায়, যেমন: লজিস্টিক রিগ্রেশন, ডিসিশন ট্রি, SVM ইত্যাদি।

SMOTE এর সীমাবদ্ধতা:

  1. নকল ডেটার সৃষ্টি: SMOTE প্রকৃত উদাহরণের মত সিন্থেটিক ডেটা তৈরি করে, যা কখনও কখনও ডেটা গুণগত মানে পরিবর্তন আনতে পারে।
  2. অতিরিক্ত উদাহরণ সৃষ্টি: মডেল যদি অতিরিক্ত সিন্থেটিক উদাহরণ গ্রহণ করে, তবে এর কার্যকারিতা হ্রাস পেতে পারে, বিশেষত যদি খুব বেশি উদাহরণ তৈরি করা হয়।
  3. নতুন আউটলায়ার তৈরি: SMOTE নতুন উদাহরণ তৈরি করার সময় আউটলায়ারও তৈরি করতে পারে, যা মডেলের ফলস ফলাফল দিতে পারে।

SMOTE ব্যবহার করার জন্য কোড উদাহরণ:

imbalanced-learn লাইব্রেরি ব্যবহার করে SMOTE সহজে ব্যবহার করা যায়। এই লাইব্রেরি SMOTE ক্লাস প্রদান করে, যা ডেটাসেটে SMOTE অ্যাপ্লাই করতে ব্যবহৃত হয়।

ইনস্টলেশন:

pip install imbalanced-learn

SMOTE ব্যবহার উদাহরণ:

from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# উদাহরণস্বরূপ একটি ব্যালেন্সহীন ডেটাসেট তৈরি করা
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, 
                           n_clusters_per_class=1, weights=[0.9, 0.1], flip_y=0, random_state=42)

# ডেটা ট্রেনিং এবং টেস্ট সেটে ভাগ করা
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# SMOTE প্রয়োগ করা
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X_train, y_train)

# নতুন ডেটার শ্রেণী সমন্বয়
print("Before SMOTE:", y_train.tolist().count(1), y_train.tolist().count(0))
print("After SMOTE:", y_res.tolist().count(1), y_res.tolist().count(0))

এই কোডে:

  • make_classification ব্যবহার করে একটি বৈষম্যপূর্ণ ডেটাসেট তৈরি করা হয়েছে।
  • SMOTE এর মাধ্যমে মাইনরিটি ক্লাসের উদাহরণগুলি পুনরায় তৈরি করা হয়েছে।
  • প্রশিক্ষণের আগে এবং পরে শ্রেণীগুলির সংখ্যা প্রদর্শিত হয়েছে।

সারাংশ:

SMOTE একটি শক্তিশালী ওভার-স্যাম্পলিং কৌশল যা মাইনরিটি ক্লাসের উদাহরণগুলি synthetically তৈরি করে, যাতে ডেটাসেটটি balanced হয়। এটি মডেলের কার্যকারিতা বৃদ্ধি করতে সাহায্য করে, বিশেষ করে imbalance dataset এর ক্ষেত্রে। তবে, এটি ব্যবহারের সময় কিছু সীমাবদ্ধতা যেমন overfitting এবং synthetic data তৈরি হওয়ার সমস্যা থাকতে পারে।

Content added By

Class Weights হল একটি গুরুত্বপূর্ণ ধারণা যখন আপনি Imbalanced Classes বা অসামঞ্জস্যপূর্ণ শ্রেণী নিয়ে কাজ করছেন। যখন একটি শ্রেণী অন্য শ্রেণীর তুলনায় অনেক বেশি থাকে, তখন মডেলটি বেশি সংখ্যক শ্রেণীর দিকে পক্ষপাতিত্ব করতে পারে। এধরনের পরিস্থিতিতে, Class Weights ব্যবহার করা মডেলকে কম সংখ্যক শ্রেণীর উপর বেশি মনোযোগ দেওয়ার জন্য ওজন দেয়।

Scikit-learn এর LogisticRegression মডেলে class_weight প্যারামিটার ব্যবহার করে আপনি এটি নিয়ন্ত্রণ করতে পারেন। class_weight='balanced' দিলে এটি স্বয়ংক্রিয়ভাবে প্রতিটি ক্লাসের জন্য ওজন নির্ধারণ করে, যা ডেটার শ্রেণীর অনুপাত এর উপর ভিত্তি করে থাকে।


1. Class Weights এর প্রয়োজনীয়তা

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

  • ধরুন, একটি ডেটাসেটে 80% ক্লাস A এবং 20% ক্লাস B রয়েছে। মডেলটি সম্ভবত ক্লাস A এর দিকে বেশি পক্ষপাতিত্ব করবে। কিন্তু class_weight ব্যবহার করলে এটি ক্লাস B এর জন্য বেশি গুরুত্ব দেবে।

2. class_weight প্যারামিটার ব্যবহার

class_weight প্যারামিটার দুটি ধরনের মান গ্রহণ করতে পারে:

  • 'balanced': এটি স্বয়ংক্রিয়ভাবে প্রতিটি শ্রেণীর জন্য একটি ওজন নির্ধারণ করে, যা শ্রেণীর সংখ্যা অনুযায়ী সামঞ্জস্যপূর্ণ।
  • ডিকশনারি: আপনি যদি নিজের কাস্টম ওয়েট প্রদান করতে চান, তবে একটি ডিকশনারি ব্যবহার করতে পারেন, যেখানে প্রতিটি ক্লাসের জন্য একটি নির্দিষ্ট ওজন দেওয়া থাকে।

1. Balanced Class Weights:

যদি আপনি class_weight='balanced' ব্যবহার করেন, তাহলে Scikit-learn এটি নিজে থেকেই ক্লাসগুলোর জন্য একটি "স্বয়ংক্রিয়" ওজন সেট করবে।

উদাহরণ:

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# একটি অসামঞ্জস্যপূর্ণ ডেটাসেট তৈরি করা
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_classes=2, 
                            weights=[0.9, 0.1], flip_y=0, random_state=1)

# ডেটাকে ট্রেনিং এবং টেস্ট সেটে ভাগ করা
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Logistic Regression মডেল তৈরি করা, class_weight='balanced' ব্যবহার করে
model = LogisticRegression(class_weight='balanced')

# মডেল প্রশিক্ষণ
model.fit(X_train, y_train)

# টেস্ট সেটে পারফরম্যান্স মূল্যায়ন
accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy * 100}%')

এখানে class_weight='balanced' দেওয়ার মাধ্যমে মডেলটি প্রতিটি শ্রেণীর জন্য স্বয়ংক্রিয়ভাবে ক্লাসের ইনভার্স ফ্রিকোয়েন্সি অনুযায়ী একটি ওজন প্রয়োগ করবে।

2. Custom Class Weights:

আপনি যদি নিজের ওজন সেট করতে চান, তবে ডিকশনারি ব্যবহার করতে পারেন। প্রতিটি ক্লাসের জন্য একটি নির্দিষ্ট মান দেবেন যা ওজন হিসাবে ব্যবহার হবে।

উদাহরণ:

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# একটি অসামঞ্জস্যপূর্ণ ডেটাসেট তৈরি করা
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_classes=2, 
                            weights=[0.9, 0.1], flip_y=0, random_state=1)

# ডেটাকে ট্রেনিং এবং টেস্ট সেটে ভাগ করা
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# কাস্টম class_weight ডিকশনারি তৈরি করা
class_weights = {0: 1, 1: 10}  # ক্লাস 0 এর জন্য ওজন 1, ক্লাস 1 এর জন্য ওজন 10

# Logistic Regression মডেল তৈরি করা, custom class_weight ব্যবহার করে
model = LogisticRegression(class_weight=class_weights)

# মডেল প্রশিক্ষণ
model.fit(X_train, y_train)

# টেস্ট সেটে পারফরম্যান্স মূল্যায়ন
accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy * 100}%')

এখানে, ক্লাস 0 এর জন্য ওজন 1 এবং ক্লাস 1 এর জন্য ওজন 10 নির্ধারণ করা হয়েছে। এই কাস্টম ওজন ব্যবহার করে মডেলটি ক্লাস 1 এর উপর বেশি গুরুত্ব দেবে।


3. Class Weights এর সুবিধা এবং অসুবিধা

সুবিধা:

  • Class Imbalance সমস্যা সমাধান: অসামঞ্জস্যপূর্ণ ডেটাসেটের ক্ষেত্রে class_weight ব্যবহার করলে, মডেল কম সংখ্যক শ্রেণীর জন্য বেশি গুরুত্ব দেয়, যা ওভারফিটিং এবং underfitting সমস্যা কমাতে সাহায্য করে।
  • উন্নত পারফরম্যান্স: ক্লাসের ভিন্নতা এবং অনুপাতের দিকে মনোযোগ দিয়ে মডেলকে কার্যকরীভাবে প্রশিক্ষিত করা যায়।

অসুবিধা:

  • Overfitting: যখন একটি শ্রেণীর জন্য খুব বেশি ওজন নির্ধারণ করা হয়, তখন এটি অতিরিক্ত প্রশিক্ষণের কারণ হতে পারে, যার ফলে overfitting হতে পারে।
  • দ্রুততা কমানো: ক্লাস ওয়েটিং যখন ডেটাসেট বড় হয়, তখন কম্পিউটেশনাল খরচ বাড়িয়ে দিতে পারে।

4. Hyperparameter Tuning

Class Weights এবং অন্যান্য প্যারামিটার যেমন C, solver, max_iter ইত্যাদি কাস্টমাইজ করে, আপনি মডেলের পারফরম্যান্স অপটিমাইজ করতে পারেন। মডেলের প্রাপ্ত ফলাফল মূল্যায়ন এবং বিভিন্ন হাইপারপ্যারামিটার সেটিংসের সাথে পরীক্ষা করে সবচেয়ে ভালো আউটপুট পাওয়া যায়।

from sklearn.model_selection import GridSearchCV

# Hyperparameter tuning for logistic regression with class weights
param_grid = {'C': [0.1, 1, 10], 'solver': ['liblinear', 'lbfgs'], 'class_weight': ['balanced', None]}

grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print("Best Parameters:", grid_search.best_params_)

সারাংশ:

  • Class Weights ব্যবহার করলে মডেলটি অস্বাভাবিক বা কম সংখ্যক শ্রেণীর জন্য আরও বেশি গুরুত্ব দেয়, যা class imbalance সমস্যা সমাধানে সহায়ক।
  • LogisticRegressionclass_weight প্যারামিটার ব্যবহার করে এটি balanced বা কাস্টম ডিকশনারি মানের মাধ্যমে কনফিগার করা যায়।
  • Class Weights ব্যবহার করলে মডেলটি ছোট শ্রেণীগুলির প্রতি বেশি মনোযোগ দেয়, তবে এটি Overfitting এড়ানোর জন্য সচেতনভাবে ব্যবহার করতে হয়।
Content added By

Imbalanced Data হল এমন ডেটা যেখানে ক্লাসগুলির মধ্যে ভারসাম্যহীনতা থাকে, অর্থাৎ এক শ্রেণীর ডেটার সংখ্যা অন্য শ্রেণীর ডেটার তুলনায় অনেক বেশি বা কম। উদাহরণস্বরূপ, ক্রেডিট কার্ড ফ্রড ডিটেকশন বা স্প্যাম ইমেইল ডিটেকশন এর মতো সমস্যাগুলিতে সাধারণত নেগেটিভ ক্লাস (যেমন, সৎ লেনদেন) অনেক বেশি থাকে এবং পজিটিভ ক্লাস (যেমন, জালিয়াত লেনদেন) অনেক কম থাকে। এই ধরনের ডেটাতে মডেলটি কেবলমাত্র প্রধান শ্রেণী (যেমন সৎ লেনদেন) শিখতে পারে, এবং অপ্রচলিত শ্রেণী (যেমন জালিয়াত লেনদেন) সঠিকভাবে শনাক্ত করতে ব্যর্থ হতে পারে।

Imbalanced Data হ্যান্ডলিংয়ের পদ্ধতিগুলি:

  1. Resampling Methods:
    • Oversampling (পজিটিভ ক্লাসের জন্য ডেটা বাড়ানো)
    • Undersampling (নেগেটিভ ক্লাসের জন্য ডেটা কমানো)
  2. SMOTE (Synthetic Minority Over-sampling Technique):
    • এটি একটি জনপ্রিয় পদ্ধতি যেখানে মাইনোরিটি ক্লাস থেকে নতুন সিনথেটিক উদাহরণ তৈরি করা হয়।
  3. Class Weights:
    • মডেল ট্রেনিংয়ের সময় ক্লাস-ভিত্তিক পেনালটি যোগ করা, যাতে মডেল কম প্রতিনিধিত্ব করা ক্লাসের জন্য বেশি গুরুত্ব দেয়।

উদাহরণ: Imbalanced Data হ্যান্ডলিং এর জন্য SMOTE ব্যবহার

এখানে আমরা একটি সাধারণ উদাহরণ দেখাবো যেখানে আমরা imbalanced dataset ব্যবহার করব এবং SMOTE (Synthetic Minority Over-sampling Technique) ব্যবহার করে মডেল ট্রেনিং করব।

1. লাইব্রেরি ইমপোর্ট করা

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, accuracy_score
from imblearn.over_sampling import SMOTE

2. Imbalanced ডেটাসেট তৈরি করা

এখানে, আমরা একটি কৃত্রিম অপ্রতিনিধিত্বমূলক (imbalanced) ডেটাসেট তৈরি করবো।

# কৃত্রিম Imbalanced ডেটাসেট তৈরি করা
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10,
                            n_classes=2, weights=[0.95, 0.05], flip_y=0, random_state=42)

# ডেটার শ্রেণী বণ্টন দেখানো
print("Original class distribution:", dict(zip(*np.unique(y, return_counts=True))))

এই ডেটাসেটে 95% ক্লাস 0 (নেগেটিভ ক্লাস) এবং 5% ক্লাস 1 (পজিটিভ ক্লাস) থাকবে, যা একটি ইমব্যালেন্সড ডেটাসেট।

3. ডেটা ট্রেনিং এবং টেস্ট সেটে ভাগ করা

# ডেটা ট্রেনিং এবং টেস্ট সেটে ভাগ করা
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

4. SMOTE ব্যবহার করে Oversampling

SMOTE (Synthetic Minority Over-sampling Technique) ব্যবহার করে মাইনোরিটি ক্লাস (পজিটিভ ক্লাস) এর জন্য নতুন সিনথেটিক উদাহরণ তৈরি করা হবে।

# SMOTE ব্যবহার করে oversampling
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

# রিস্যাম্পলড ডেটার শ্রেণী বণ্টন দেখানো
print("Resampled class distribution:", dict(zip(*np.unique(y_resampled, return_counts=True))))

এখানে, SMOTE দ্বারা পজিটিভ ক্লাস এর উদাহরণগুলি বৃদ্ধি পাবে, ফলে ডেটাসেটটি ভারসাম্যপূর্ণ হয়ে যাবে (50%/50%)।

5. মডেল তৈরি এবং ফিট করা

এখন আমরা একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করবো এবং তা ট্রেনিং ডেটাতে ফিট করবো।

# লজিস্টিক রিগ্রেশন মডেল তৈরি করা
model = LogisticRegression()

# মডেল ফিট করা
model.fit(X_resampled, y_resampled)

6. মডেল মূল্যায়ন

মডেলটি প্রশিক্ষণের পর, এখন আমরা এর কার্যকারিতা পরীক্ষা করতে পারি। আমরা accuracy এবং অন্যান্য মূল্যায়ন মেট্রিকস যেমন precision, recall, এবং F1-score দেখতে পারি।

# টেস্ট ডেটার উপর প্রেডিকশন করা
y_pred = model.predict(X_test)

# মডেলের accuracy এবং classification report
print(f"Accuracy: {accuracy_score(y_test, y_pred) * 100}%")
print("Classification Report:")
print(classification_report(y_test, y_pred))

7. সারাংশ

  • Imbalanced Data Handling: Imbalanced ডেটা হ্যান্ডলিংয়ের জন্য আমরা SMOTE ব্যবহার করেছি, যা মাইনোরিটি ক্লাসের উদাহরণ বাড়ানোর জন্য সিনথেটিক উদাহরণ তৈরি করে।
  • Oversampling: SMOTE ব্যবহার করে পজিটিভ ক্লাসের উদাহরণ বৃদ্ধি করেছি।
  • Logistic Regression: মডেল ট্রেনিং শেষে এর পারফরম্যান্স মূল্যায়ন করেছি।

এছাড়া Undersampling, Class Weights ইত্যাদি পদ্ধতিও ব্যবহার করা যেতে পারে।

অন্যান্য পদ্ধতিগুলি:

  1. Undersampling: নেগেটিভ ক্লাসের উদাহরণ কমানো।
  2. Class Weights: মডেলকে ক্লাস-ভিত্তিক পেনালটি দেওয়া যাতে এটি মাইনোরিটি ক্লাসের দিকে বেশি মনোযোগ দেয়।

এই ধরনের ডেটাসেট হ্যান্ডলিং পদ্ধতিগুলি ইমব্যালেন্সড ডেটাসেটে মডেলের পারফরম্যান্স উন্নত করতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...