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

রেন্ডম ফরেস্ট (Random Forests)

একসাথে অনেকগুলো গাছের বা ট্রিয়ের (trees) ভোট — উইজডম অফ দ্য ক্রাউড (wisdom of the crowd)
training:O(T * n * d * log n) — T সংখ্যক গাছ বা ট্রি (trees), যার প্রতিটি ডেটার একেকটি সাবসেটের (subset) ওপর কাজ করেprediction:O(T * depth) — প্রতিটি গাছ বা ট্রিকে (tree) জিজ্ঞেস করা হয়, এরপর ভোট নেওয়া হয়accuracy:একটি সিঙ্গেল ডিসিশন ট্রিয়ের (single decision tree) তুলনায় অনেক বেশি বা হাই (Higher)

ভাবুন তো, আপনি একটি বয়াম বা জারের (jar) ভেতরে থাকা জেলি বিনের (jellybeans) সংখ্যা অনুমান করার চেষ্টা করছেন। আপনি ১০০ জন ভিন্ন ভিন্ন মানুষকে (100 different people) তা অনুমান করতে বললেন। আলাদা আলাদাভাবে দেখতে গেলে, এদের বেশিরভাগ মানুষের অনুমানই আসলে মূল সংখ্যার চেয়ে অনেক দূরে থাকবে। কিন্তু আপনি যদি এই ১০০টি অনুমানের গড় বা এভারেজ (average) বের করেন, তবে দেখবেন যে এর ফলাফলটি আসল সংখ্যাটির খুবই কাছাকাছি চলে এসেছে।

আর এটিকেই মূলত উইজডম অফ দ্য ক্রাউড (wisdom of the crowd) বা জনতার জ্ঞান বলা হয়ে থাকে, এবং এটিই হলো রেন্ডম ফরেস্টের (Random Forests) মূল ভিত্তি। শুধুমাত্র একটিমাত্র ডিসিশন ট্রিয়ের (decision tree) (যা হয়তো ওভারফিট বা overfit করতে পারে) ওপর নির্ভর না করে, এখানে মূলত প্রায় কয়েকশো আলাদা আলাদা গাছ বা ট্রি (trees) তৈরি করা হয় এবং এরপর তাদের সবাইকে ভোট দিতে বলা হয়।

হয়তো এই গাছগুলোর (trees) প্রত্যেকটি আলাদাভাবে দেখতে বেশ সাধারণ বা ম্যাড়মেড়ে (mediocre) লাগতে পারে। কিন্তু এদের সমন্বিত বা একসাথে দেওয়া ভোট? তা সত্যিই অনেক বেশি নিখুঁত বা অ্যাকুরেট (accurate)।

কোন জিনিসটি প্রতিটি গাছ বা ট্রিকে "রেন্ডম (random)" করে তোলে? (What makes each tree "random"?)

আপনি যদি ১০০টি হুবহু একই রকম গাছ বা ট্রি (trees) তৈরি করেন, তবে তারা সবাই মূলত একই ধরনের ভুলগুলো করবে — আর সেক্ষেত্রে ভোট নেওয়াটাও আসলে কোনো কাজে আসবে না। এখানকার মূল কৌশলটি হলো, মূলত দুই ধরনের রেন্ডমনেস (randomness) বা এলোমেলো ভাব যুক্ত করার মাধ্যমে এখানকার প্রতিটি গাছকে আলাদা (different) করা হয়:

১. রেন্ডম ডেটা (বুটস্ট্র্যাপ স্যাম্পলিং বা Bootstrap sampling)

প্রতিটি গাছ বা ট্রি (tree) মূলত এখানকার ট্রেইনিং ডেটার একটি এলোমেলো বা রেন্ডম সাবসেট (random subset) পায়, যা রিপ্লেসমেন্টসহ (with replacement) স্যাম্পল করা হয়। ব্যাপারটিকে ঠিক এভাবে চিন্তা করুন: আপনার সমস্ত ডেটা একটি ব্যাগে রাখুন, এরপর একে একে সেখান থেকে একেকটি স্যাম্পল টেনে বের করুন (তবে পরেরবার স্যাম্পল তোলার আগেই আগেরটিকে আবার ব্যাগে ফেরত দিয়ে দিন)। এতে কিছু কিছু উদাহরণ বা এক্সাম্পল (examples) হয়তো দুইবার করে আসবে, আবার কিছু হয়তো একেবারেই বাদ পড়ে যাবে। এর ফলে, প্রতিটি গাছই মূলত এখানকার বাস্তব ডেটাগুলোর কিছুটা ভিন্ন এবং আলাদা রূপ দেখতে পাবে।

২. রেন্ডম ফিচার (Random features)

প্রতিবার ভাগ করার বা স্প্লিট করার (split) সময়, কোনো গাছই মূলত এর এখানকার সমস্ত ফিচারগুলোকে বিবেচনা করে না — এটি শুধুমাত্র এর একটি রেন্ডম সাবসেটের (random subset) ওপরই নজর দেয়। ধরা যাক আপনার কাছে মোট ১০টি ফিচার আছে, এক্ষেত্রে আপনার এখানকার প্রতিটি স্প্লিট হয়তো মাত্র ৩ বা ৪টি ফিচারের ওপর নজর দিতে পারে। এই জিনিসটি এখানকার গাছগুলোকে মূলত নতুন বা ভিন্ন কোনো প্যাটার্ন খুঁজতে বাধ্য করে এবং এই জিনিসটি এদের সবাইকে একই সাথে কোনো সাধারণ বা ডমিন্যান্ট (dominant) ফিচারের ওপর নির্ভর করা থেকে বাঁচিয়ে দেয়।

সাধারণ গাছের সাহায্যে তৈরি রেন্ডম ফরেস্ট (Random Forest from Simple Trees)

import random
from collections import Counter
def build_simple_tree(data, features_subset):
"""সিঙ্কলিফাইড (Simplified): সাবসেট থেকে সেরা ফিচারটি বেছে নিন, মিডিয়ানে (median) স্প্লিট বা ভাগ করুন"""
best_feat = random.choice(features_subset)
values = [row[best_feat] for row, _ in data]
threshold = sorted(values)[len(values) // 2]
left = [(r, l) for r, l in data if r[best_feat] <= threshold]
right = [(r, l) for r, l in data if r[best_feat] > threshold]
left_label = Counter(l for _, l in left).most_common(1)[0][0]
right_label = Counter(l for _, l in right).most_common(1)[0][0]
return (best_feat, threshold, left_label, right_label)
def predict_tree(tree, x):
feat, thresh, left_l, right_l = tree
return left_l if x[feat] <= thresh else right_l
def random_forest(data, n_trees=5, n_features=2):
trees = []
n = len(data)
all_features = list(range(len(data[0][0])))
for _ in range(n_trees):
# বুটস্ট্র্যাপ স্যাম্পল (Bootstrap sample)
sample = [random.choice(data) for _ in range(n)]
feats = random.sample(all_features, min(n_features, len(all_features)))
trees.append(build_simple_tree(sample, feats))
return trees
# ডেটা: [সাইজ, মিষ্টতা, রঙের মান] → ফল (Data: [size, sweetness, color_score] → fruit)
data = [([3,8,1],'apple'),([2,3,5],'orange'),([4,9,2],'apple'),
([1,2,6],'orange'),([3,7,1],'apple'),([2,4,4],'orange')]
random.seed(42)
forest = random_forest(data, n_trees=7)
votes = [predict_tree(t, [3, 7, 2]) for t in forest]
print(f"ভোটগুলো (Votes): {votes}")
print(f"জয়ী (Winner): {Counter(votes).most_common(1)[0][0]}")
Output
Votes: ['apple', 'apple', 'orange', 'apple', 'apple', 'apple', 'orange']
Winner: apple
Note: সাধারণত ডেটা সায়েন্টিস্টরা সবার আগে প্রথমেই এই রেন্ডম ফরেস্ট বা Random Forests অ্যালগরিদমেরই দ্বারস্থ হয়ে থাকেন। ক্লাসিফিকেশন (classification) এবং রিগ্রেশন (regression) — এদের দুজনের ক্ষেত্রেই এগুলো কোনো ধরনের সমস্যা ছাড়াই খুব দারুণভাবে কাজ করে, এগুলো খুব কমই ওভারফিট (overfit) করে (সবকিছুর গড় নেওয়ার কারণে) এবং এগুলোকে খুব সামান্যই টিউন বা পরিবর্তন (minimal tuning) করার প্রয়োজন পড়ে। এর ট্রেড-অফ (trade-off)? একটি সাধারণ বা সিঙ্গেল ডিসিশন ট্রিয়ের চেয়ে এদের ইন্টারপ্রেট বা এদের কাজের ধরন ব্যাখ্যা করা একটু কঠিন — কারণ আপনি চাইলেও সহজেই হোয়াইটবোর্ডে (whiteboard) ৫০০টি গাছ এঁকে বোঝাতে পারবেন না।

Key Metrics

ট্রেইনিং (Training)
T টি গাছ বা ট্রি (trees), তবে এদের প্রত্যেকটিকে চাইলে একই সাথে সমান্তরালভাবে (in parallel) ট্রেইন করানো যায়
মধ্যম থেকে বেশি (Moderate-High) O(T * n * d * log n)
প্রেডিকশন বা অনুমান (Prediction)
সবকটি গাছের মধ্য দিয়ে ইনপুটটি পাঠিয়ে দিন, এরপর তাদের নিয়ে ভোটাভুটি (vote) করুন
মধ্যম গতির বা ধীর (Moderate) O(T * depth)
ওভারফিটিং বাঁধার ক্ষমতা (Overfitting resistance)
যদিও এখানকার প্রতিটি গাছ বা ট্রি (tree) হয়তো আলাদাভাবে ওভারফিট (overfit) করতে পারে; তবে এদের এনসেম্বলগুলো (ensemble) কখনোই তা করে না
অনেক বেশি (High) সবকিছুর গড় নেওয়ার ফলে সকল ভুল বা এররগুলো (errors) ছোট হয়ে যায়
বোধগম্যতা বা ইন্টারপ্রেটেবিলিটি (Interpretability)
এখানকার এই ৫০০টি গাছ ঠিক কেন একইভাবে ভোট দিয়েছে তা ঠিকভাবে ব্যাখ্যা করা আসলেই অনেক কঠিন
অনেক কম বা নিচু (Low) ঠিক যেন ব্ল্যাক-বক্সের (Black-box-ish) মতোই

ছোট কুইজ

একটি রেন্ডম ফরেস্ট (random forest) কেন এর প্রতিটি ভাগ বা স্প্লিটের সময় ফিচারের বা সাবসেটগুলোকে রেন্ডমলি ব্যবহার করে?
Challenge

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

ডিসিশন ট্রি (Decision Trees)
একটি ফ্লোচার্ট (flowchart) যা বুঝতে পারে যে ঠিক কোন প্রশ্নগুলো করা উচিত
ওভারফিটিং এবং আন্ডারফিটিং (Overfitting & Underfitting)
গোল্ডিলকস এবং তিনটি মডেল — একটি খুব সাধারণ, একটি অনেক জটিল, আর অন্যটি একদম পারফেক্ট
কে-নিয়ারেস্ট নেইবোরস বা প্রতিবেশীরা (K-Nearest Neighbours - KNN)
আপনার সবচেয়ে কাছের প্রতিবেশীদের জিজ্ঞাসা করুন এবং সংখ্যাগরিষ্ঠ বা মেজরিটির (majority) সাথে একমত হোন
গ্রেডিয়েন্ট ডিসেন্ট (Gradient Descent)
সবচেয়ে নিচু পয়েন্ট বা বিন্দুটি খুঁজে পেতে পাহাড়ের ঢাল বেয়ে নিচে নামুন