Decision Tree ও Random Forest: নিয়ম দিয়ে সিদ্ধান্ত

শক্ত tabular baseline (Series 05, Episode 06)

🟡 INTERMEDIATE Series 05 — Classical Machine Learning Episode 06 / 11

📑 এই পর্বে যা যা আছে

🩺 ১. গল্প: ডাক্তারের প্রশ্ন করার ধরন

Rahim অসুস্থ হয়ে ডাক্তারের কাছে গেল। ডাক্তার একটার পর একটা প্রশ্ন করলেন: "জ্বর আছে?" → হ্যাঁ → "কতদিন?" → ৩ দিন → "কাশি?" → না → ... প্রতিটা উত্তর পরের প্রশ্ন ঠিক করে দিল, শেষে একটা সিদ্ধান্তে পৌঁছালেন। Nila বলল — "এটাই Decision Tree। হ্যাঁ/না প্রশ্নের একটা গাছ, প্রতিটা শাখায় data ভাগ হয়, পাতায় গিয়ে সিদ্ধান্ত।"

Rahim: "কিন্তু Logistic Regression তো আছেই, নতুন এটা কেন?"

Nila: "Logistic Regression একটা সোজা রেখা টানে (linear boundary)। কিন্তু বাস্তব সম্পর্ক প্রায়ই আঁকাবাঁকা (non-linear)। Tree সেই আঁকাবাঁকা pattern ধরতে পারে, আর scaling ছাড়াই চলে, মিশ্র feature (সংখ্যা + category) সামলায়। এজন্যই tabular data-তে এত জনপ্রিয়।"

২. সমস্যা: Logistic Regression যেখানে আটকায়

Decision Tree এই তিনটাই সহজে সামলায়। তবে একা tree-র নিজের একটা বড় সমস্যা আছে — overfitting। সেটার সমাধানই Random Forest। চলুন ধাপে ধাপে দেখি।

🌳 ৩. Decision Tree কী? (৩ স্তরে)

Level 1 — intuition: একগুচ্ছ হ্যাঁ/না প্রশ্নের গাছ। উপর থেকে শুরু করে প্রতিটা প্রশ্নের উত্তর অনুযায়ী নিচে নামুন; পাতায় (leaf) পৌঁছালে সেটাই উত্তর (churn / no-churn)।
Level 2 — technical: প্রতিটা node-এ model এমন একটা feature ও threshold বাছে যেটা data-কে সবচেয়ে "বিশুদ্ধভাবে" (pure) ভাগ করে — অর্থাৎ ভাগের পর প্রতি দলে একটা class প্রাধান্য পায়। বিশুদ্ধতা মাপে Gini impurity বা entropy। এভাবে recursively ভাগ চলে।
Level 3 — Engineer perspective: একক Decision Tree খুব interpretable (Boss-কে সরাসরি গাছ দেখানো যায়), কিন্তু একা এটি সহজে overfit করে ও unstable। তাই production-এ আমরা প্রায় সবসময় ensemble (Random Forest / Gradient Boosting) ব্যবহার করি — যেখানে অনেক tree মিলে সিদ্ধান্ত নেয়। tabular data-তে এই ensemble-ই আজও বেশিরভাগ সময় সেরা baseline।

✂️ ৪. Tree কীভাবে ভাগ (split) করে

Impurity = একটা দলে কতটা "মিশ্রণ"। সব churn হলে impurity ০ (বিশুদ্ধ); ৫০-৫০ হলে সর্বোচ্চ। Tree প্রতি split-এ সেই feature+threshold বাছে যেটা impurity সবচেয়ে বেশি কমায়।

১০০ customer (৫০ churn, ৫০ stay) — impurity বেশি | "tenure < 6 মাস?" <- এই প্রশ্ন impurity সবচেয়ে কমায় / \ হ্যাঁ (৪০) না (৬০) (৩৫ churn) (১৫ churn) <- দুই দল এখন অনেক "বিশুদ্ধ"

🖼️ ৫. Visual: একটা churn decision tree

[tenure < 6 মাস?] / \ হ্যাঁ না / \ [support_calls > 3?] [monthly_bill > 80?] / \ / \ CHURN STAY CHURN STAY

এটাই tree-র সৌন্দর্য: সিদ্ধান্তের পথ পরিষ্কার দেখা যায়, ব্যাখ্যা করা যায়।

📉 ৬. Overfitting — একা tree-র দুর্বলতা

Tree-কে যদি যত ইচ্ছা গভীর হতে দেন (max_depth সীমাহীন), সে প্রতিটা training row-কে আলাদা পাতায় বসিয়ে দেবে — training accuracy ১০০%, কিন্তু নতুন data-তে ভয়ংকর খারাপ। এটাই overfitting (E08-এ বিস্তারিত): model মুখস্থ করেছে, শেখেনি।

একা tree-র দুই দুর্বলতা: (১) সহজে overfit করে, (২) unstable — data সামান্য বদলালে গাছ পুরো বদলে যায় (high variance)। এই দুটোরই সমাধান — অনেক tree একসাথে: Random Forest

🌲 ৭. Random Forest — অনেক tree-র ভোট

একজন ব্যক্তির মত ভুল হতে পারে, কিন্তু ১০০ জন বিশেষজ্ঞের ভোট সাধারণত ভালো — এটাই "wisdom of the crowd"। Random Forest ঠিক এটা করে:

এই কৌশলের নাম Bagging (Bootstrap Aggregating)। মূল কথা: অনেক ভিন্ন tree-র ভুল একে অপরকে কাটাকাটি করে, ফলে সম্মিলিত prediction অনেক স্থিতিশীল।

🎲 ৮. কেন Forest variance কমায়

একা Tree
high variance — data বদলালে গাছ বদলায়, নতুন data-তে অস্থির।
Random Forest
অনেক ভিন্ন tree-র গড়/ভোট → individual ভুল একে অপরকে বাতিল করে → low variance, ভালো generalization।

Interview-তে এটা প্রায়ই আসে: "Random Forest কীভাবে variance কমায়?" — উত্তর: একাধিক de-correlated (bootstrap + random feature দিয়ে ভিন্ন) tree-র prediction গড়/ভোট করে, তাই কোনো এক tree-র random ভুল সম্মিলিত ফলাফলে চাপা পড়ে যায়।

💻 ৯. কোড: Tree vs Forest (Churn P3)

কেন scikit-learn? DecisionTreeClassifierRandomForestClassifier একই fit/predict API; scaling ছাড়াই চলে:

from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import f1_score, roc_auc_score # E04-এর X_train, X_test, y_train, y_test ব্যবহার করছি # (Tree/Forest-এ scaling লাগে না, তাই raw X ঠিক আছে) # একা tree — গভীর হতে দিলে overfit tree = DecisionTreeClassifier(max_depth=None, random_state=42) tree.fit(X_train, y_train) tree_pred = tree.predict(X_test) print("Tree F1 :", f1_score(y_test, tree_pred)) # Random Forest — ১০০টা tree-র ensemble rf = RandomForestClassifier( n_estimators=100, # কতগুলো tree max_depth=5, # প্রতিটা tree-র গভীরতা সীমিত random_state=42, class_weight="balanced" # imbalanced churn সামলাতে ) rf.fit(X_train, y_train) rf_pred = rf.predict(X_test) rf_proba = rf.predict_proba(X_test)[:, 1] print("Forest F1 :", f1_score(y_test, rf_pred)) print("Forest ROC-AUC:", roc_auc_score(y_test, rf_proba))
সাধারণত Random Forest একা Tree-র চেয়ে ভালো ও স্থিতিশীল F1/AUC দেবে। n_estimators (tree সংখ্যা) ও max_depth হলো মূল hyperparameter — এগুলো টিউন করা E08-এর বিষয়।

🔍 ১০. Feature Importance

Random Forest-এর দারুণ bonus — কোন feature সিদ্ধান্তে সবচেয়ে গুরুত্বপূর্ণ, সেটা বলে দেয়:

import pandas as pd importances = pd.Series( rf.feature_importances_, index=X_train.columns ).sort_values(ascending=False) print(importances) # উদাহরণ: # tenure_months 0.52 <- churn-এ সবচেয়ে বড় factor # support_calls 0.31 # monthly_bill 0.17
সতর্কতা: feature importance "কোনটা predictive" বলে, "কোনটা কারণ (cause)" বলে না। correlation ≠ causation। তবু Boss-কে "tenure সবচেয়ে বড় churn factor" দেখানোর জন্য এটা অসাধারণ।

💼 ১১. Boss Question ও Bangladesh উদাহরণ

Boss: "এত tree বানিয়ে সময়/খরচ বাড়ছে — লাভ কী?"

উত্তর: "একা tree দ্রুত কিন্তু অস্থির — আজ একরকম, কাল আরেকরকম সিদ্ধান্ত। Random Forest একটু ভারী, কিন্তু নির্ভরযোগ্য ও বেশি সঠিক। churn-এ ২% বেশি recall মানে হাজারো customer বেঁচে যাওয়া। আর feature importance আপনাকে বলবে কেন customer চলে যাচ্ছে — যেটা দিয়ে আপনি product-ই ঠিক করতে পারবেন।"

🔎 ১২. Job Requirement Decoder

JD: "Hands-on with tree-based models (Decision Trees, Random Forest) for tabular data."

১. কী বোঝায়? tree ও ensemble model বানানো, টিউন করা, ব্যাখ্যা করা।
২. কেন চায়? বাংলাদেশের বেশিরভাগ ML সমস্যা tabular; tree-based model সেখানে সেরা baseline।
৩. কোন সমস্যা সমাধান করে? non-linear pattern, feature interaction, scaling-ঝামেলা ছাড়াই ভালো accuracy।
৪. junior-এর কী জানা লাগে? split intuition, overfitting, Random Forest কীভাবে variance কমায়, feature_importance, মূল hyperparameter।
৫. এখনই master লাগবে না: Gini vs entropy-র গণিত, out-of-bag error-এর গভীরতা।
৬. GitHub-এ কীভাবে দেখাবে? Churn notebook-এ Tree vs Forest তুলনা + feature importance bar chart।
৭. Interview: "Random Forest variance কমায় কীভাবে?", "Bagging কী?", "একা tree কেন overfit করে?"

⚠️ ১৩. সাধারণ ভুল

ভুল ১: Tree/Forest-এ scaling করা → দরকার নেই (তবে ক্ষতিও নেই); Logistic/SVM-এ লাগে।

ভুল ২: max_depth সীমাহীন রেখে একা tree ব্যবহার → নিশ্চিত overfit।

ভুল ৩: feature importance-কে causation ভাবা → শুধু predictive গুরুত্ব, কারণ নয়।

ভুল ৪: imbalanced churn-এ class_weight না দেওয়া → majority class-এ ঝুঁকে যায়।

ভুল ৫: Random Forest-কে "সবসময় সেরা" ভাবা → খুব high-dimensional sparse (text) data-তে অন্য approach ভালো হতে পারে।

🎤 ১৪. Interview Prep

প্র: Decision Tree কীভাবে split বাছে?
উ: যে feature+threshold impurity (Gini/entropy) সবচেয়ে বেশি কমায়।

প্র: একা tree কেন overfit করে?
উ: যথেষ্ট গভীর হলে training data মুখস্থ করে; high variance।

প্র: Random Forest কীভাবে variance কমায়?
উ: bootstrap + random feature দিয়ে বহু de-correlated tree বানিয়ে তাদের ভোট/গড় নেয়।

প্র: Bagging কী?
উ: Bootstrap Aggregating — random নমুনায় বহু model বানিয়ে aggregate করা; variance কমায়।

প্র: Random Forest interpretable?
উ: একা tree-র মতো পুরো পথ দেখানো কঠিন, কিন্তু feature_importance দিয়ে insight দেয়।

✍️ ১৫. হাতে-কলমে

১. Churn data-তে একা Tree (max_depth=None) আর Random Forest দুটোরই train ও test F1 বের করুন। Tree-র training F1 কি test F1-এর চেয়ে অনেক বেশি? — এটাই overfitting-এর চিহ্ন।
২. Random Forest-এ n_estimators 10 → 100 → 300 বদলে দেখুন AUC কীভাবে বদলায়।
৩. feature_importances_ দিয়ে bar chart আঁকুন; কোন feature churn-এ সবচেয়ে গুরুত্বপূর্ণ বলুন।

🚀 ১৬. Project Connection ও সারসংক্ষেপ

Project P3 (Churn) এখন Random Forest দিয়ে আরও শক্তিশালী ও ব্যাখ্যাযোগ্য। flagship Career Assistant-এ job-role classification বা skill prediction-এ Random Forest একটা দুর্দান্ত baseline হবে — বিশেষত যখন আমাদের কাছে structured feature (experience, salary, skill count) থাকবে। পরের episode-এ আমরা দেখব কীভাবে Gradient Boosting/XGBoost এই tree-ideaকে আরও এক ধাপ এগিয়ে নেয়।

এই Episode-এ শিখলাম:

✓ Decision Tree = হ্যাঁ/না প্রশ্নের গাছ; impurity কমিয়ে split করে
✓ Tree non-linear pattern ও feature interaction ধরে, scaling লাগে না
✓ একা tree সহজে overfit করে ও unstable (high variance)
✓ Random Forest = bagging দিয়ে বহু tree-র ভোট → variance কমে, stable
✓ feature_importance দিয়ে কোন feature গুরুত্বপূর্ণ বোঝা যায় (predictive, causal নয়)
✓ tabular data-তে Random Forest আজও সেরা baseline
পরবর্তী Episode: Gradient Boosting ও XGBoost — Kaggle জেতার অস্ত্র। bagging বনাম boosting, আর কেন tabular data-তে এত শক্তিশালী।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.