Core Algorithmsপড়তে ৭ মিনিট লাগবে

লজিস্টিক রিগ্রেশন (Logistic Regression)

হ্যাঁ নাকি না? এমন একটি লাইন টানুন যা এদের দুজনকে আলাদা করতে পারে
training:O(n * d * iterations) — গ্রেডিয়েন্ট ডিসেন্ট (gradient descent)prediction:O(d) — ডট প্রোডাক্ট (dot product) + সিগময়েড (sigmoid)output:০ থেকে ১ এর মধ্যে প্রবাবিলিটি বা সম্ভাবনা (Probability)

ধরা যাক, আপনি একটি এক্সক্লুসিভ (exclusive) বা দারুণ ক্লাবের একজন বাউন্সার (bouncer) বা দারোয়ান। আপনার সামনে দিয়ে যে-ই হেঁটে যাচ্ছে, তার কিছু নির্দিষ্ট বৈশিষ্ট্য বা ফিচারের দিকে আপনি নজর রাখছেন — যেমন তার বয়স, তার পোশাক-পরিচ্ছদ এবং তার ভিআইপি স্ট্যাটাস (VIP status) ইত্যাদি। কিন্তু এখানে আপনার কাজ তাদেরকে এক থেকে ১০০ এর মধ্যে কোনো রেটিং (rating) দেওয়া নয়। বরং আপনার কাজ হলো কেবল হ্যাঁ বা না-এর মতো একটি বাইনারি (binary) সিদ্ধান্ত নেওয়া: হয় আপনি ভেতরে যাবেন, অথবা আপনি বাইরে থাকবেন

কিন্তু এখানকার সবচেয়ে মজার বিষয় হলো — আপনি শুধু কয়েন টস করে বা আন্দাজে এই সিদ্ধান্তগুলো নিচ্ছেন না। আপনার এই গাট ফিলিং (gut feeling) বা অনুমানের পেছনে মূলত বড় একটি গাণিতিক হিসাব বা লজিক লুকিয়ে আছে। আপনি তাদের প্রতিটি বৈশিষ্ট্য বা ফিচার মেপে দেখছেন, সেগুলোকে একসাথে যোগ করছেন এবং সেই যোগফলটি যদি একটি নির্দিষ্ট মাত্রা বা থ্রেশোল্ড (threshold) পার করে... তবেই আপনি তাদের জন্য ক্লাবের দরজা খুলে দিচ্ছেন।

আর এটিকেই লজিস্টিক রিগ্রেশন (logistic regression) বলা হয়। নামের পাশে রিগ্রেশন (যেটি সংখ্যা প্রেডিক্ট করে) থাকলেও, এটি মূলত একটি ক্লাসিফিকেশন (classification) বা শ্রেণীবিভাগের অ্যালগরিদম — অর্থাৎ এটি মূলত কোনো কিছু কোন ক্যাটাগরিতে (category) পড়বে, তা প্রেডিক্ট বা অনুমান করে।

সোজা লাইন থেকে এস-কার্ভে (S-curve) বদলানো

আপনার কি লিনিয়ার রিগ্রেশনের (linear regression) কথা মনে আছে? এটি মূলত আপনাকে একটি সংখ্যা দেয়: y = mx + b। কিন্তু হ্যাঁ বা না (yes/no) ধরনের সমস্যাগুলোর ক্ষেত্রে, আমাদের একটি প্রবাবিলিটি বা সম্ভাবনা (probability) প্রয়োজন — যা মূলত ০ থেকে ১-এর মধ্যে একটি সংখ্যা。

আর ঠিক এই জায়গাতেই সিগময়েড ফাংশনের (sigmoid function) কাজ শুরু হয়। এটি মূলত যেকোনো সংখ্যাকে (নেগেটিভ বা ঋণাত্মক অসীম থেকে শুরু করে পজিটিভ বা ধনাত্মক অসীম পর্যন্ত) টেনেটুনে বা স্কুইশ (squish) করে (০, ১) এই রেঞ্জ বা পরিসরের মধ্যে নিয়ে আসে। এর সূত্রটি হলো:

sigmoid(z) = 1 / (1 + e^(-z))

এটিকে আপনি চাইলে একটি বদলানো বা মডিফাইড ডিমার সুইচের (dimmer switch) সাথে তুলনা করতে পারেন। আপনি এর নবটি (knob) যেদিকেই ঘোরান না কেন, এর আলো কখনোই ০%-এর নিচে বা ১০০%-এর ওপরে যাবে না। এটিকে আপনি অনেক বেশি বাম দিকে ঘোরালে এটি ০-এর কাছাকাছি পৌঁছাবে কিন্তু কখনোই সেটিকে একেবারে ছুঁতে পারবে না। আবার অনেক বেশি ডান দিকে ঘোরালে এটি ঠিক একইভাবে ১-এর কাছাকাছি পৌঁছাবে।

এর আউটপুট যদি ০.৫-এর বেশি হয়, তবে আমরা একে "হ্যাঁ (yes)" (ক্লাস 1) হিসেবে প্রেডিক্ট বা অনুমান করব। আর যদি এটি ০.৫-এর কম হয়? তবে এটি হবে "না (No)" (ক্লাস 0)।

সিদ্ধান্ত নেওয়ার সীমানা বা ডিসিশন বাউন্ডারি (The decision boundary)

এর সবচেয়ে দারুণ বা কুল (cool) জিনিসটি এখানেই রয়েছে। লজিস্টিক রিগ্রেশন আপনার ফিচার স্পেসের (feature space) মধ্যে দিয়ে একটি অদৃশ্য রেখা (অথবা সমতল বা হারাইপারপ্লেন) এঁকে দেয়। যার একপাশে থাকে ক্লাস 0 এবং অন্যপাশে থাকে ক্লাস 1।

একটি টেবিলের ওপর ছড়ানো কিছু লাল এবং নীল রঙের মার্বেলের কথা চিন্তা করুন। লজিস্টিক রিগ্রেশন মূলত এই লাল এবং নীল রঙের মার্বেলগুলোকে আলাদা করার জন্য সবচেয়ে ভালো ও সোজা একটি লাইন খুঁজে বের করে। এই লাইনটির কাছাকাছি থাকা পয়েন্টগুলোর ক্ষেত্রে মডেলটি একটু কম আত্মবিশ্বাসী (less confident) হয়। আর লাইনটি থেকে অনেক দূরে থাকা পয়েন্টগুলোর ক্ষেত্রে মডেলটি অনেক বেশি আত্মবিশ্বাসী (very confident) হয়।

এই মডেলটি শুধু "এটি স্প্যাম (spam)" বা "এটি স্প্যাম নয় (not spam)" বলেই থেমে যায় না — বরং এটি আপনাকে বলে যে, "আমি ৯৪% নিশ্চিত যে এটি স্প্যাম।" আর এই ধরনের প্রবাবিলিটি বা সম্ভাবনাগুলো আমাদের জন্য অনেক বেশি কাজের ও প্রয়োজনীয়।

লজিস্টিক রিগ্রেশন: স্প্যাম নাকি স্প্যাম নয়? (Logistic Regression: Spam or Not?)

import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# ফিচার (Features): [num_exclamation_marks, contains_free, num_links]
X = np.array([[1, 0, 1], [5, 1, 8], [0, 0, 2],
[8, 1, 10], [1, 0, 0], [6, 1, 7]])
y = np.array([0, 1, 0, 1, 0, 1]) # 0=স্প্যাম নয় (not spam), 1=স্প্যাম (spam)
# আগে থেকে ট্রেইন করা বা প্রিট্রেইনড ওয়েট (Pretrained weights) (সাধারণত গ্রেডিয়েন্ট ডিসেন্ট ব্যবহার করে শেখা হয়)
weights = np.array([0.3, 1.5, 0.2])
bias = -1.5
# প্রেডিক্ট বা অনুমান করা
for i in range(len(X)):
z = np.dot(X[i], weights) + bias
prob = sigmoid(z)
label = "SPAM" if prob > 0.5 else "not spam"
print(f"ইমেইল {i+1} (Email {i+1}): {prob:.2f}{label}")
Output
ইমেইল ১ (Email 1): 0.31 → স্প্যাম নয় (not spam)
ইমেইল ২ (Email 2): 0.92 → স্প্যাম (SPAM)
ইমেইল ৩ (Email 3): 0.21 → স্প্যাম নয় (not spam)
ইমেইল ৪ (Email 4): 0.97 → স্প্যাম (SPAM)
ইমেইল ৫ (Email 5): 0.23 → স্প্যাম নয় (not spam)
ইমেইল ৬ (Email 6): 0.91 → স্প্যাম (SPAM)
Note: লজিস্টিক রিগ্রেশন এর ভেতরের দিকে মূলত লিনিয়ার রিগ্রেশনের মতোই কাজ করে — এর ডিসিশন বাউন্ডারি (decision boundary) সবসময় একটি সোজা লাইন (বা সোজা সমতল সমভূমি) হয়। যদি আপনার দুটি ক্লাস একটি কার্ভ (curve) বা বাঁকানো লাইন দিয়ে আলাদা করা থাকে, তবে লজিস্টিক রিগ্রেশন সেখানে ঠিকমতো কাজ করতে পারবে না। কিন্তু বাস্তব জীবনের অনেক সমস্যার ক্ষেত্রেই, এই সোজা বাউন্ডারিটি বা সীমানাটি অনেক ভালোভাবে কাজ করে।

Key Metrics

ট্রেইনিং (Training)
এটি লিনিয়ার রিগ্রেশনের মতোই গ্রেডিয়েন্ট ডিসেন্ট (gradient descent) ব্যবহার করে
ইটারেটিভ (Iterative) বা বারবার করা O(n * d * iterations)
প্রেডিকশন (Prediction)
ডট প্রোডাক্ট (Dot product) + সিগময়েড (sigmoid) — অর্থাৎ মিলি সেকেন্ডের কাজ
অনেক দ্রুত O(d)
আউটপুট (Output)
এটি শুধু লেবেলই দেয় না — বরং এর সাথে কনফিডেন্স স্কোর বা আত্মবিশ্বাসের মাত্রাও দেয়
প্রবাবিলিটি বা সম্ভাবনা (Probability) ০ থেকে ১ পর্যন্ত
ডিসিশন বাউন্ডারি (Decision Boundary)
ফিচার ইঞ্জিনিয়ারিং (feature engineering) ছাড়া এটি বাঁকানো বা কার্ভড বাউন্ডারিগুলো ধরতে পারে না
লিনিয়ার (Linear) সোজা লাইন/সমতল

ছোট কুইজ

সিগময়েড ফাংশন (sigmoid function) মূলত কী কাজ করে?
Challenge

পড়া চালিয়ে যান

লিনিয়ার রিগ্রেশন (Linear Regression)
আপনার ডেটাগুলোর মাঝখান দিয়ে সবচেয়ে ভালো বা পারফেক্ট একটি সোজা লাইন টানুন
অ্যাক্টিভেশন ফাংশন (Activation Functions)
ReLU, সিগময়েড (sigmoid), ট্যানএইচ (tanh) — অর্থাৎ নিউরনগুলোর অন/অফ (on/off) সুইচ
পারসেপ্ট্রন (Perceptron)
একটিমাত্র নিউরন — গুণ করা, যোগ করা আর সিদ্ধান্ত নেওয়া
ডিসিশন ট্রি (Decision Trees)
একটি ফ্লোচার্ট (flowchart) যা বুঝতে পারে যে ঠিক কোন প্রশ্নগুলো করা উচিত